一:主要用到了apktool,dex2jar,jd-gui三个工具。
apktool:负责将apk生成assets,res,AndroidManifest,以及smali文件的获取。
dex2jar:将classes.dex转换成jar的工具。首先将.apk修改成.zip或.rar进行解压缩,然后就能得到classes.dex。然后使用dex2jar转换成jar文件。
jd-gui:是一个Java反编译工具,它可以将编译后的Java字节码文件(包括classes.dex文件)反编译回可读的Java源代码。我们这里主要 用来把dex2jar所生成的jar文件,以可视化界面的形式打开(实测:如果apk做了混淆,这个时候看到的都是abc等)
注意:上面三个工具在使用过程中可能会遇到一些问题,整理如下
1)首先将apktool,dex2jar所在目录,添加进环境变量path,同时把java的jdk环境变量配置上移到第一个位置,因为有可能你的电脑配置了多个jdk,防止出现java和javac版本不一致的问题。cmd命令里输入:java -version和javac -version可以查看版本判断是否一致。
2)下载apktool,包含apktool.jar和apktool.bat两个文件。下载官网:https://ibotpeaches.github.io/Apktool/install/
dex2jar:https://gitcode.com/pxb1988/dex2jar?utm_source=csdn_github_accelerator&isLogin=1
jd-gui:https://github.com/java-decompiler/jd-gui/releases/
二:具体步骤
1)先使用apktool,得到xml文件,清单文件和图片,smail文件等资源
最好是cmd进入apktool的jar包所在目录后(好处是后面的命令中不用输入apk的路径了),cmd命令输入:apktool d <apk名字>.apk 或者 apktool d <apk名字>.apk -o <生成的资源文件目录名字>
2)利用dex2jar工具将dex转化为jar
经过上面的步骤,我们可以在文件夹app-release中发现一个文件夹smali,这里面其实就java代码,只不过不是jar形式的,关于如何查看java源码,其实很简单的,如下:
第一步:把你的apk后缀名改为zip,然后解压后,就会发现有个classes.dex,这里面就是java源码了。
第二步:我们需要吧dex文件转为jar格式的文件,用到了一个工具叫dex2jar(下载链接),我们把它下载来后解压(下载来后是zip文件)。
第三步:我解压后是放在F:\Android\apktools\dex2jar-2.0目录下,现在把dex文件拷贝到该目录下。
第四步:cmd窗口进入F:\Android\apktools\dex2jar-2.0,然后输入命令:d2j-dex2jar.bat classes.dex回车,如下图:
完成后我们在F:\Android\apktools\dex2jar-2.0目录下就会多了个classes-dex2jar.jar文件,这个就是我们需要的jar文件,接下来就是如何查看java代码了,这里笔者借用一个工具jd-gui(下载链接),下载完解压(这里选择window平台),然后用它打开classes-dex2jar.jar就可以了,如果你的apk经过混淆,那么看到的都是a、b之类的。
动态解析:
知晓上面的结构,java代码编译成class文件,我们可以使用反编译尝试还原java代码。第一部分说过静态反编译,这里说一下动态调试所用到的几个工具,做个记录。
为什么使用动态调试?这是因为当代码逻辑复杂时,不知道运行时会走到哪个方法,哪个分支。
工具有:Jadx:提供动态调试smali代码功能。工具里有断点调试的功能
androidstudio:给androidstudio安装插件Smalidea后,将apktool静态编译得到的snali文件拷贝到Android项目中作为源码文件,也可以动态调试smali。
xposed:鄙视是root后的Android手机安装这个Xposed框架。
Frida:是一个客户端动态逆向分析工具。由server和client组成,server程序是部署在客户端上,client程序则运行在pc侧。