最近想参考一个第三方APP的功能实现,于是进行一些逆向分析。过程有不少坑,记录一下:
step1.通过apktool.jar 工具解压apk文件,得到res资源文件和class.dex安卓可执行文件
(也可以直接将.apk改为.zip进行解压,不过得到的xml文件未经反编译,难以阅读)
step2. 通过dex2jar工具,将dex文件转成jar包
step3. 通过jd-gui工具查看源码。(直接将jar文件拖到jd-gui中即可)
step4. jd-gui文件保存功能,将.class字节码文件转成java文件,可选单个转换或全部转换,单个直接保存为java文件,全部转换保存为zip文件。或通过jad.exe命令工具转换:
1.cmd进入jad.exe所在文件夹
2.将.class文件拷到同一个文件夹下
3.再输入编译命令,命令:jad -o -r -s java -d src classes_dex2jar/**/*.class
一般只经过普通混淆的apk均可通过这几步得到源码。不过得到的java文件并不能直接使用,一些语法结构已改变,分析逻辑还是没问题的。所用到的工具及说明可通过此处下载http://链接:https://pan.baidu.com/s/1gHqOU3keViZJKWmYveNvaA 提取码:2s5x
插曲1:执行第一步时可能会因为jdk版本不一样报错,此处收集的工具jdk要求为jdk1.7。可自行安装,若安装有多个jdk的先在环境变量中将jdk版本更换为1.7,若还是报错,可能是注册表中当前版本不匹配。可通过cmd 执行regedit进入注册表编辑界面 将当前版本改为1.7,或直接删除表中其他版本即可。
插曲二:
经过上面一番折腾,满心欢喜打开jd-gui一看,啥玩意?毛源码都没有,只有一堆a b c d名称,还有个jiagu.so。原来是经过了第三方平台加固。这时通过第一部是无法得到正确的dex文件的,需要先对dex文件进行脱壳。
准备工具:FDex2_1.1.apk VirtualXposed_0.18.2.apk
注:此工具均有更高版本,由于通过模拟器操作繁琐,且容易安卓失败,我用真机操作,我的真机为机顶盒,应用为32位的,更高版本工具不支持32位,需要更高版本的可以问度娘拿。
下载http://链接:https://pan.baidu.com/s/15N73tA2vv1izIj7aeqbiww 提取码:r1vp
脱壳
Step1:
将xposed、FDex2和需要脱壳的应用都安装到机器上。
Step2:
启动xposed,将FDex2添加的xposed_v3.1.2的模块中激活
Step3:
点击xposed模块中FDex2选中要脱壳的包
Step4:
运行要脱壳的包
Step5: 通过adb pull 拿到脱壳后的dex.路径为:/data/user/0/io.va.exposed/virtual/data/user/0/包名(或安装文件管理器获取)
插曲三:
脱壳得到多个dex,其中有一个dex无法转换成jar文件,提示该文件不是dex格式,可以转换的dex得到的源码也不全。
原因:
dex文件有固定的文件头标识,而脱壳后得到的dex文件前面几个字节为0000 0000 0000 0000,所以无法识别。
解决:
补全dex文件头内容。将dex用subline_text等编辑工具打开,将前面几个字节改为:
6465 780a(dex标识) 3033 3500(dex版本号),重新保存,就可以得到正常的已脱壳的dex文件。
脱壳参考https://blog.csdn.net/weixin_34004576/article/details/92827929
dex文件分析参考https://blog.csdn.net/tabactivity/article/details/78950379