
过掉反调试的方法已经说明白了,下面只要F9运行,按照前面的方法过掉几次前面提到的反调试即可畅快的调试程序了。当发现当前进程调用open函数打开文件/proc/pid/maps需要注意了,脱壳需要关注的地方开始了。原被加固的dex文件开始解压和解密了。

经过几次F9的调试发现了下面截图的状态,但是不要心急,只是离脱壳进了一步,此时内存dump出来的odex文件不是被加固的原dex文件的而是加固外壳qihu360的dex文件。

继续F9运行程序,经过n次F9运行memcmp函数以后(其实这里可以做一个处理,暂时去掉mmap函数的断点,等到mmap函数断点处再次设置mmap函数的断点),再经过大约2次mmap函数运行以后,再一次调用memcmp函数即到了脱壳的地方,注意此时加固外壳apk程序呈现的堆栈和内存的状态。由于360加固自己制作了dvmDexFileOpenPartial函数,但是该函数需要调用memcmp进行dex文件的魔法字符串”dex“的比较,因此此时是脱壳的最佳时机。

OK,现在的任务就是从内存中dump出原来完整的dex文件,既可以手动的dump出内存中的dex文件,也可以通过IDC的脚本或者dumpdex的插件将原dex文件dump出来。

原apk程序的Dex文件拿到了,只需替换360加固的外壳程序的dex,删除AndroidManifest.xml文件的application标签增加的两个元素,删除assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及原来的签名,重新签名一下apk程序即可。
在删除的application标签增加的元素中,特别是在删除android:name =””的时候,一定要检查脱壳的classes.Dex文件中否重写过application类,如果脱壳后的classes.Dex文件中重写了application类,需要将application标签中android:name=””修改过来才行。
以上就是有关dex加固的方法了,举例了360加固与脱壳流程。关于更多的Android逆向与Android技术学习我们可以私信发送:“手册”《Android核心技术手册》。由阿里P10高工整理;助力初、中级Android开发有很大帮助。

文末
拓展学习
so加固
so反编译比较困难,比dex的反编译困难。一般做法是抽取Android工程的关键java代码转为c/c++, 然后生成so文件。so加密我只是了解了一下破坏.so部分头文件的方式加固。
加固里面的VMP(虚拟机)是什么?
VMP(虚拟软件保护技术)大概思路就是自定义一套虚拟机指令和对应的解释器,并将标准的指令转换成自己的指令,然后由解释器将自己的指令给对应的解释器。