【android】关于反编译

来源:互联网 发布:sk2神仙水 知乎 编辑:程序博客网 时间:2024/06/05 22:43

apk反编译:


第一类:
首先将apk文件后缀改为zip并解压,得到其中的classes.dex


第二类:
按照第一类没有得到classes.dex文件;获取apk文件和odex文件;


1.首先配java环境,下载所需工具smali-1.3.3.jar 和 baksmali-1.3.3.jar;
2.将手机/system/framework 里面也一并复制出来放在与两个工具同一目录(即与smali-1.3.3.jar、baksmali-1.3.3.jar);
  注意:framework下的只要.odex文件,不需要jar和apk文件;
3.将要反编译应用的apk文件和.odex文件放在与smali-1.3.3.jar、baksmali-1.3.3.jar同一目录;
4.开始运行分解 odex 文件为 classes.dex 文件的命令:
   A.java -jar baksmali-1.3.3.jar -x **.odex  注:**即要反编译的应用文件名;
此命令完成之后,会生成一个 out 文件夹在smali-1.3.3.jar、baksmali-1.3.3.jar同一目录下,里面就是所有的 class文件,后缀名为.smali;
   B.运行 class 生成为 classes.dex 文件的命令:
     java -Xmx512M -jar smali-1.3.3.jar out -o classes.dex
此命令完成之后,会生成classes.dex文件在smali-1.3.3.jar、baksmali-1.3.3.jar同一目录下;

执行A命令后可能出现的错误日志:
Error occured while loading boot class path files. Aborting.
org.jf.dexlib.Util.ExceptionWithContext: Cannot locate boot class path file core.odex
    at org.jf.dexlib.Code.Analysis.ClassPath.loadBootClassPath(ClassPath.java:237)
    at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:145)
    at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPathFromOdex(ClassPath.java:110)
    at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:104)
    at org.jf.baksmali.main.main(main.java:297)

此错误为/system/framework没有复制出来放在工具目录;

Error occured while loading boot class path files. Aborting.
org.jf.dexlib.Util.ExceptionWithContext: error in opening zip file
    at org.jf.dexlib.Util.ExceptionWithContext.withContext(ExceptionWithContext.java:54)
    at org.jf.dexlib.Code.Analysis.ClassPath.loadBootClassPath(ClassPath.java:220)
    at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:145)
    at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPathFromOdex(ClassPath.java:110)
    at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:104)
    at org.jf.baksmali.main.main(main.java:297)
Caused by: java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:127)
    at java.util.zip.ZipFile.<init>(ZipFile.java:144)
    at org.jf.dexlib.DexFile.<init>(DexFile.java:295)
    at org.jf.dexlib.Code.Analysis.ClassPath.loadBootClassPath(ClassPath.java:216)
    ... 4 more
Error while reading boot class path entry "services.odex".

此错误为/system/framework复制出来放在工具目录下了,但是将其中的jar文件也放进去了,要删除jar文件;

*************************此时已拿到classes.dex文件*********************************

反编译过程(linux):
把classes.dex复制到dex2jar.sh所在目录,在命令行下进入这个目录,执行:./dex2jar.sh classes.dex,生成一个jar文件

反编译过程(windows):
将classes.dex复制到dex2jar.bat所在目录dex2jar-x.x.x.x文件夹。
在命令行下进入dex2jar.bat所在目录,

运行
dex2jar.bat classes.dex

即可生成
classes_dex2jar.jar


************************此时已拿到classes_dex2jar.jar文件*****************************


进入jdgui文件夹双击jd-gui.exe,打开上面生成的jar包classes_dex2jar.jar,即可看到源代码了,另存为之后可以生成一个zip文件,解压此zip文件,即可得到源代码,然后就可以使用eclipse或者source insight进行查看。

************************此时源码获取成功************************************************


二、反编译出问题时

分析一个APK,发现APK反编译正常,能得到所有smali代码和xml文件,

接着使用dex2jar想把dex转抱成jar包,使逆向分析看起来更加方便,但是却出现了如下异常:

  1. <span style="color:#ff0000;">com.googlecode.dex2jar.DexException: while accept method:[La/a/a;.bc()Ljava/lang/String;]</span> 
看起来都是google.code.dex2jar工具代码异常,但是我们仔细看第一行提示信息:
  1. com.googlecode.dex2jar.DexException: while accept method:[La/a/a;.bc()Ljava/lang/String;]  
这下大家清楚了,dex2jar在处理a.a.a.bc这个函数时,出错了,既然smali语言可以看到,那么我们打开smali的a.bc
  1. # virtual methods  
  2. .method public bc()Ljava/lang/String;  
  3.     .locals 6  
  4.   
  5.     .prologue  
  6.     .line 5  
  7.    #unknown opcode: 0xff  
  8.     nop  
  9.  

发现 第一行:

 #unknown opcode: 0xff

哦,看来就是看雪上那个保护APK的方法,http://bbs.pediy.com/showthread.php?t=177114

插入了相应的无效代码,导致了dex2jar工具解析出错了,

1.接下来我把这句直接删除,

2.再把smali回编译成dex

3.再用dex2jar工具重新尝试,果然这下出来了正常的jar包,用jd-gui或者luten可以正常查看java代码了,

逆向分析有了更加直接的参考代码。大家如果遇到此类解析出错了,不防尝试此方法。


3、反编译apk,得到res中文件和manifest.xml

使用apktool工具,命令。/apktool xxx.apk xxx

即可在xx文件夹中看到资源文件。


0 0
原创粉丝点击