-
-
[原创]app加固分析狗尾续貂之dex vmp还原
-
发表于:
2025-1-12 17:40
17503
-
[原创]app加固分析狗尾续貂之dex vmp还原
oacia大佬的APP加固dex解密流程分析,已经基本把它翻个底朝天了,但众所周知要彻底攻破该加固,仍有dex vmp这最后一道堡垒横在面前。在此之前拜读过爱吃菠菜大佬的某DEX_VMP安全分析与还原以及Thehepta大佬的vmp入门(一):android dex vmp还原和安全性论述,了解到dex vmp的原理是对dalvik指令进行了加密和置换,这里参照大佬们的方法对oacia大佬的样本复现了一遍,记录一下历程。
既然是vmp,按照vmp常规的分析流程,必然要先拿到trace,以这次的经历来看,拿到trace就已经成功了一半了。参考了很多大佬的文章,大致有以下几种方法:ida trace、unidbg/AndroidNativeEmu、frida stalker、frida qbdi、Dobby Instrument、unicorn 虚拟CPU。
开始打算用maiyao的ida trace脚本,但遇到以下问题:
1.ida附加上后每次执行到linker加载壳so加载到一半就退出了,单步发现是跑到rtld_db_dlactivity里的BRK指令会直接退出,但加载其他so时并没有这个问题(why?)。这里手动把它跳过了。
2.trace了一下JNI_Onload,结果发现每当进入mutex_lock就会卡死在那无限循环……这个没能解决,只好弃用。
补java环境有点累,尤其是补到后面发现可能会有很多代理类,没坚持补下去……
从oacia那篇文章来的肯定少不了尝试一下stalker,结果发现和ida相似的问题——每当进入mutex_lock就会卡死在那无限循环。
尝试用yang的frida-qbdi-tracer,但每当trace到一些跳转的时候就会崩溃,查阅资料发现qbdi好像确实存在这样的bug。
这个我是后面才看到的,感觉将来可以尝试一下,详见KerryS的指令级工具Dobby源码阅读。
爱吃菠菜那篇文章的中的方法,没完全搞明白,感觉大意应该是把unicorn作为一个so文件注入到app中,用frida hook住目标函数,当发生调用时把环境补给unicorn来trace。
经过不断尝试,最终还是使用frida stalker,通过hook mutex_lock函数,在OnEnter中跳过stalker,再在OnLeave中恢复stalker的方法,在经过无数次崩溃之后,终于拿到了dex vmp的trace……
拿到trace指令流后,就可以着手分析了。可以看到,onCreate函数被注册到的地方,使用DebugSymbol.fromAddress没有打印出任何符号,应该是一块动态申请的内存区域:

函数并不大,里面也基本全是位置无关代码,应该只是一个跳板,很快,便来到了主elf中的函数sub_137978。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课