第五章 静态分析 Android 程序(二)(阅读 Java 代码)
阅读 Java 代码
- 在大型 APK 的逆向分析时,逐行阅读 smali 代码效率较低,阅读分析更高级的 Java 伪代码可提高效率
将 DEX 文件转换成 jar 包
- 把 DEX 中的 Dalvik 指令还原成可阅读的 Java 代码的方法:将 DEX 转换成 jar 包
工具介绍
-
dex2jar
-
提供了 DEX 和 jar 包之间互转的命令行工具 d2j-dex2jar 和 d2j-jar2dex
-
下载地址:GitHub
-
Google 开源工具 enjarify
-
(其出现的目的是)提供比 dex2jar 更好的将 DEX 转换为 jar 包的方案及更精准的转换结果
-
下载地址:GitHub
-
配置方法:****
-
其实,dex2jar 经过优化,功能已很强大,enjarify 在生成的结果上并无明显优势
-
无论 dex2jar 还是 enjarify,都很优秀,转换结果都是无损的,即转换成 jar 包后的文件可作为一个 SDK 文件在程序中调用
jar 分析工具
- jar 分析工具准确地说应称 jar 包查看工具(大多数 jar 包分析工具只有查看功能,没有分析功能)
- 常见的有 jd-gui、jadx、bytecode-viewer 等,使用最多的是 jd-gui
jd-gui
- 下载地址:GitHub
- 窗口程序,解压后即可打开使用
特点
- 跨平台,开源
- 用户体验好,运行速度快
- 方法名的跟踪、跳转、强大的搜索功能等用起来很顺手
- 但可能会对一些特殊语法的解析抛出异常(对基于 JDK 8 开发的 DEX 也会有这样的情况出现)
jadx
- 下载地址:GitHub
- 支持命令行和窗口模式
特点
- 支持直接打开 APK 或 DEX 文件查看其 Java 伪代码,而不用经过 dex2jar 这一转换过程
- 反编译 APK 时使用 jadx,会实时对 APK 中的类与方法进行反编译
- 但不经过前期转换这一过程也带来了问题:在查看类的方法时,对本地没有缓存结果的类会进行实现的反编译操作,在进行类与字符串操作时,大量的反编译工作会使操作变得很慢
bytecode-viewer
- 下载地址:GitHub
- 执行如下命令(“-”后的数字是版本号)打开(打开后是一个窗口程序,可拖拽文件)
java -jar Bytecode-Viewer-2.9.22.jar
特点
- 同样支持直接打开 APK 或 DEX 查看 Java 伪代码
- bytecode-viewer 的底层会根据用户的选择,先调用 dex2jar 或 enjarify 对目标文件进行反编译,故其后续操作速度相对较快
- bytecode-viewer 和 jd-gui、jadx 一样,不支持对 jar 包直接修改,但它提供了插件功能并内置了几款强大的 jar 反混淆插件,在实际分析中的使用效果比后二者好