第五章 静态分析 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

  • 配置方法:CSDN

  • 其实,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 反混淆插件,在实际分析中的使用效果比后二者好