1. Dex 转 转 Odex
优化:vm/analysis/Optimize.cpp --> dvmOptimizeClass
2. Dex 校验
vm/analysis/DexVerify.cpp --> dvmVerifyClass
3. 取消非必要优化与校验
/system/build.prop
Dalvik.vm.dexopt-flag=v=n, o=n

4. Demo 演示(360 壳)
寻找脱壳点(手动调试)


使用脚本分析加载了多少 dex 文件

找到脱壳点 JNI_OnLoad2 并执行脚本,dump 出原始 dex 文件

加载前后的 dex 文件数据比较

产生区别的原因:Android 系统对 dex 文件的优化,优化后的 dex 文件反编译和运行都会出异常。
反编译为 smali 之后二者的对比


可以看出程序的逻辑已经改变了,分析源码查看优化和校验的具体操作
5. 分析 dvmOptimizeClass


通过 while 中的 switch 判断来对所有能进行 opcode 的代码进行优化

6. 分析 dvmVerifyClass



如果校验失败则返回 false,显示校验失败并且不会加载

本文详细解析了Dex文件的优化与校验过程,包括Dex转Odex、优化函数dvmOptimizeClass、校验函数dvmVerifyClass等关键步骤。同时,通过360壳的Demo演示了如何寻找脱壳点、分析加载前后Dex文件的变化及反编译差异,深入探讨了Android系统对Dex文件的优化机制及其对反编译的影响。
2万+

被折叠的 条评论
为什么被折叠?



