注意:此仓库可能已过时。未来的开发将在 https://github.com/Storyyeller/enjarify 进行。
Enjarify 是一个将 Dalvik 字节码转换为等效 Java 字节码的工具。这使得 Java 分析工具能够分析 Android 应用程序。
Enjarify 是一个纯 Python 3 应用程序,因此你可以直接克隆并运行它。要直接运行它,假设你位于仓库的顶层目录,只需执行:
python3 -O -m enjarify.main yourapp.apk
对于正常使用,你可能希望使用包装脚本并将其配置到路径中。
为了方便,提供了一个 shell 包装脚本 enjarify.sh。它会尝试使用 PyPy(如果可用),因为 PyPy 比 CPython 更快。如果你希望从任何地方调用 Enjarify,可以在 PATH 中的某个位置(例如 ~/bin)创建一个符号链接。假设你在仓库的顶层目录中,执行:
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
提供了一个批处理包装脚本 enjarify.bat。要能够从任何地方调用它,只需将仓库的根目录添加到你的 PATH 中。批处理脚本将始终调用 python3 作为解释器。如果你想使用 PyPy,只需编辑该脚本。
假设你已正确将脚本配置到路径中,你可以通过键入 enjarify 从任何位置调用它,例如:
enjarify yourapp.apk
最基本的使用方式是仅指定一个 apk 文件或 dex 文件作为输入。如果指定了一个多 dex 的 apk,Enjarify 会自动翻译所有 dex 文件,并将结果输出到一个合并的 jar 中。如果指定了一个 dex 文件,则只翻译该 dex 文件。例如,假设你手动提取了 dex 文件,可以执行:
enjarify classes2.dex
默认输出文件是当前目录下的 [输入名]-enjarify.jar。要显式指定输出文件名,请传递 -o 或 --output 选项:
enjarify yourapp.apk -o yourapp.jar
默认情况下,如果输出文件已存在,Enjarify 会拒绝覆盖。要强制覆盖输出,请传递 -f 或 --force 选项。
Dex2jar 是一个较旧的工具,也尝试将 Dalvik 转换为 Java 字节码。它在大多数情况下工作得相当好,但许多晦涩的特性或边界情况会导致它失败,甚至静默地产生错误结果。相比之下,Enjarify 设计为在尽可能多的情况下工作,即使对于 Dex2jar 会失败的代码也是如此。Enjarify 能够正确处理 Unicode 类名、作为多种类型使用的常量、隐式类型转换、跳入正常控制流的异常处理器、引用过多常量的类、非常长的方法、catch-all 处理器之后的异常处理器,以及类型错误的静态初始化值。
Enjarify 目前不翻译可选的元数据,例如源文件属性、行号和注解。
Enjarify 尽力成功翻译尽可能多的类,但在某些情况下,由于 Android、Java 或两者的限制,这是不可能做到的。幸运的是,这种情况只会在人为构造的场景下发生,因此在实际使用中不应成为问题。
PyPy 比 CPython 快得多。要安装 PyPy,请参见 http://pypy.org/。确保获取的是 PyPy3 而不是普通的 PyPy。Linux 包装脚本会在可用时自动使用 pypy3 命令。在 Windows 上,你需要自己编辑包装脚本。
默认情况下,Enjarify 对字节码进行优化,使其对人类更易读(复制传播、移除未使用的值等)。如果你不需要这些,可以通过 --fast 选项禁用优化来加快速度。注意,在极少数情况下,如果一个类在不优化的情况下太大而无法放入类文件中,Enjarify 会自动以启用所有优化的方式重试,因此此选项不会影响成功翻译的类数量。
这不是一个官方的 Google 产品(无论是实验性的还是其他性质),它只是恰好由 Google 拥有的代码。