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

但是,这篇文章暗示Dalvik不执行这种字节码验证。作者做所有普通的x86恶作剧,就像跳进一条指令的中间,这显然是允许的。这是真的? Android VM实际执行任何类型的加载时间字节码验证吗?如果没有,为什么?

#1 楼

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

博客文章是您可以在类标题中设置一个特定的标志,该标志告诉验证者跳过此类。

#2 楼

Android还包含字节码验证,但此步骤已从设备上的类加载移至dex编译器(类似于在J2ME中完成的操作)。文件),您可以修改文件并引入引用的混淆。

因此在加载时无需进行进一步的验证。

dex编译器的规范。

删除了加载时对字节码的验证,以延长加载时间(与J2ME中执行此操作的原因相同)。