360加固逆向脱壳之过反调试

来源:互联网 发布:谷歌翻译软件 编辑:程序博客网 时间:2024/06/05 18:01

   写在最前,本来是想把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,遗憾。


 

0 0
原创粉丝点击