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,显示校验失败并且不会加载