Android 字节码验证器

逆向工程 拆卸 安卓 字节码
2021-06-10 04:41:19

使 Java 字节码 (.class) 易于逆向工程的原因之一是 JVM 的验证器确保字节码始终可以通过线性扫描进行反汇编。指令必须是从偏移量 0 开始的连续指令,并且您不能跳转到指令的中间。

然而,这篇文章暗示 Dalvik 不做这样的字节码验证。作者做了所有常见的 x86 恶作剧,比如跳到指令的中间,这显然是允许的。这是真的?Android VM 是否真的执行任何类型的加载时字节码验证?如果不是,为什么?

2个回答

这并不完全正确。Dalvik 字节码也将在设备上进行验证,但这发生在安装时,而不是运行时。一个经过验证和优化的 dex 文件版本将存储在系统上,受文件系统权限保护(除非您已植根设备,否则您之后无法更改它)。

博客文章中使用的技巧是您可以在类头中设置一个特定的标志,告诉验证器跳过这个类。

Android 也包含字节码验证,但此步骤从设备上的类加载转移到 dex 编译器(与在 J2ME 中完成的类似)。

更改对类文件的 dexing(以及在打包到.apk文件之前),您可以修改文件并引入引用的obfuscation

所以在加载时没有做进一步的验证。

dex 编译器的规范

加载时字节码的验证被删除以提高加载时间(与在 J2ME 中完成的原因相同)。