写在最前,本来是想把360加固全部脱壳后,写一篇教程。不过在我过了360加固调试后,最后卡在了native void onCreate函数的提取。最后就无结果了。但又发现许多人卡在了360加固的反调试,为了帮助其他人能成功(其实我没有这么伟大,只是发现写这篇文章对我没有害处,就决定放出来),而且希望,如果有人把native void onCreate函数dump下来的话,请觅我,我真的很想知道360加固的原理与逆向方法(这才是重点)。哦,对了,360加固版本是1.3,如果用的android的 art 模式,在网上有一篇文章是修改系统的,可直接dump出源码,不过我没有亲测,而我用的是dalvik模式,主要是为了弄清360加固的加固原理与反调试原理。
我的360加固1.3样本下载地址: http://pan.baidu.com/s/1pKSP22n
好了,让我们开始吧。
一、使用系统上,我用android4.4编译了一个自己的android系统,并且运行在虚拟机上运行,(由此不用把APK改为什么Debug模式了,因为我用的系统就是Debug模式)修改的地方是在Native.cpp 文件中的dvmLoadNativeCode函数中 version =(*func)(gDvmJni.jniVm, NULL); 之前加入sleep(20); 之后IDA会自动断点在sleep之后,是不是很神奇?
二、启动虚拟机,并使用编译好的android 系统包(具体怎么编译,是另外的一篇教程了,可以网上搜索到,很多的。),不过也可以直接是用jdb作为桥接。
写在第三步之前,其实这里面还有一个可有可无的东西,需要把apk用apktool可解压,但是直接用现有的apktool解压会失败,解决方法是直接去获取apktool的源码,并且修改一个地方就OK了,至于修改哪里,有兴趣的朋友可以自己查找。应该都能过的。
三、虚拟机启动后,打开一个cmd,在其中输入adb forward tcp:23946 tcp:23946
再打开一个cmd,在之中运行adb shell, 然后在运行/data/local/tmp/android_server(是用IDA里面的android_server,放入到虚拟机的,并且修改了权限,网上有很多教程,可搜索)
然后在虚拟机中运行Test360_2(也就是我制作的一个360加固的hello_world样本,已经签名好了的)
四、然后就开始用IDA attach Test360_2进程了。关键性的东西来了。
一开始,IDA会自动断点在这里
经过4,5步F7后,来到libdvm.so
红色圆圈是我在系统源码中打的调试信息,然后在BLX R10处F7,也就是进入函数jni_onload()然后来到并在红色进入F7
来到,红色出 F7
来到,并在红色处 F7
进入上面第一个红色后,鼠标滚轮往下找到switch 函数,并在case 25下断点,如下图
然后F9(好像是按了2次F9,呵呵),反正是来到case 25,然后在 case 14 下断点如图
F7进入
多次单步F7后,来到
把R3寄存器的6000010改为A000010 (这里的反调试检测,可能是检测rtld_db_dlactivity 函数,不过不太确定,因为没有看见源代码)
然后单步,把case 14与case 25的断点给取消掉,并在case 29下断点,并且进入,当BLX LR调用 strtol 的时候,需要单步出来修改一些值,来到MOV R7,R0的时候
修改R0的之后0,
并且把 R1的hex处改为0,如下图中的红色出,需要修改为0
这里以上是检测 TracePID
然后继续F9,在多次 case 29 多次下断点后,来到
在CMP处,把R0的值修改为0(这里是检测调试端口),然后F9
还是来到
在MOV R7,R0处下端点,并修改R0与R2的值,
修改为堆栈中的值(可能你的这个值不一样,因为这个值是之前调试的时候的一个时间。这里是时间检测)
然后就没有反调试的代码了,多次F9后,就来到了
来到了全新的世界。可是我最后没有dump出native void onCreate,遗憾。