首页
社区
课程
招聘
[原创]360加固逆向脱壳之过反调试
发表于: 2016-10-13 09:57 23971

[原创]360加固逆向脱壳之过反调试

2016-10-13 09:57
23971

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

有兴趣的朋友可以继续寻找native void onCreate


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己搞的时候那一堆switch把我弄晕了
2016-10-16 10:23
0
雪    币: 19
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
case 29 为函数调用点。 多留意
2016-10-17 09:41
0
雪    币: 63
活跃值: (324)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
这是什么版本的360保护,像是早期版本吧,感觉这几个反调试点很常见啊
2016-10-17 09:54
0
雪    币: 19
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
8月3号的。
2016-10-17 10:42
0
雪    币: 63
活跃值: (324)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
哦,就这几个反调试检测点吗?
建议你这文档里写得反调试修改寄存器的时候把“为什么要这样修改”解释下会让人更好懂些
2016-10-17 10:57
0
雪    币: 19
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
好的。我有时间在修改下。
2016-10-17 11:13
0
雪    币: 219
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
native void OnCreate是因为360加固将OnCreate函数的代码抽出来,用C语言实现了(反射调用)。做到这样就可以了。
2016-10-19 16:03
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
希望给个完美脱壳的教程学习学习,这个壳是用了vmp的么?
2016-10-19 20:06
0
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
这个是在jni_load里面,在ini_array里面应该再说明一下怎么改
2016-10-24 09:46
0
雪    币: 19
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
这个只是一个过反调试,还没有进入ini_array, 而且在过反调试之前,360加固是没有用到 ini_array的
2016-10-24 09:57
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你好,我也是最近在学逆向的知识,在脱360的加固。但遇到问题了,运行到命令以下命令就报错。详细请大哥移步到我的话题,只有一篇文章。新手,请大哥多少指导!不盛感激。
debug115:B34C7014 SUB             SP, SP, #0x108

命令行错误提示:Error: Oops! internal error 30185 occured.
2016-11-7 09:41
0
雪    币: 1464
活跃值: (707)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
这个加固用到VMP了么?
2016-11-7 09:42
0
雪    币: 19
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
不知道VMP 是什么东东。。

反正都走到这里了,如果是你说的什么VMP,一是能脱的。
2016-11-7 10:09
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
init_array是在onload之前执行的
2016-11-30 15:25
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
怎么产看360加固的版本?
2017-2-23 09:55
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢分享!厉害了我的哥!
2017-3-13 11:37
0
雪    币: 208
活跃值: (1986)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
18
最后那个时间检测不太明白,不知道有没有大神帮忙解释下,前面的检测都懂,事件检测能否详加说明下记录的点和对比的地方
2017-3-22 12:46
0
雪    币: 35
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
大魔头 最后那个时间检测不太明白,不知道有没有大神帮忙解释下,前面的检测都懂,事件检测能否详加说明下记录的点和对比的地方
me too ,最后的时间我也断点到了,可是如何修复R0 R2的值呢? 之前的时间值又在哪里? 能否在时间判断的地方直接修改结果呢? 这样就不用去记录之前的时间值
2017-3-26 20:07
0
雪    币: 35
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
vurtneye me too ,最后的时间我也断点到了,可是如何修复R0 R2的值呢? 之前的时间值又在哪里? 能否在时间判断的地方直接修改结果呢? 这样就不用去记录之前的时间值
花了点时间去看汇编,知道在哪里修改时间点了,也成功dump出代码了,现在也是卡在onCreate 这里,没有什么思路,还请各位大神指点指点
2017-3-26 22:25
0
雪    币: 208
活跃值: (1986)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
21
vurtneye 花了点时间去看汇编,知道在哪里修改时间点了,也成功dump出代码了,现在也是卡在onCreate 这里,没有什么思路,还请各位大神指点指点
能否解释下检测时间,还有dump是后面会解密真正的dex吗能否解答下,还在进行中
2017-3-26 22:44
0
雪    币: 35
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
大魔头 能否解释下检测时间,还有dump是后面会解密真正的dex吗能否解答下,还在进行中
我的方法是断点time函数,然后按ctrl+F7返回上层调用函数,就是楼主文章中的各种case跳转的入口函数,然后你记录下时间,过了前面几个反调试之后来到楼主说的时间点,在把之前的拷贝修改R0,R2即可。 只要反调试过了,在memcpy断点不断F9,按的有点久,不过摸出自己的套路就可以很快定位到,当看到dex.035,就可以dump下来,dump出来的是解密的。
2017-3-27 06:39
0
雪    币: 35
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
dump完之后继续运行会崩溃掉,是不是后面还有线程在反调试中?
2017-3-27 07:00
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
恩,mark
2017-3-28 08:21
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
想问一下那个a0000010是怎么算出来的呢  我的原值是600f0010,该改成什么呢
还有我改完之后继续F9,jdb会报错出现异常错误:  android.content.pm.PackageManager$NameNotFoundException  (未捕获)"线程=Thread-2",  android.app.ApplicationPackageManager.getPackageInfoAsUser(),  行=147  bci=20
2017-6-17 17:46
0
游客
登录 | 注册 方可回帖
返回
//