首页
社区
课程
招聘
[原创][原创]根据”so劫持”过360加固详细分析
发表于: 2018-1-5 22:18 17217

[原创][原创]根据”so劫持”过360加固详细分析

2018-1-5 22:18
17217

 参考:https://bbs.pediy.com/thread-223699.htm

http://blog.csdn.net/luoshengyang/article/details/8923483


前几日看到大神写的 https://bbs.pediy.com/thread-223699.htm这篇博客感觉受益匪浅,但是其中有一些自己的理解想跟大家一起分享,算不上原创,希望各位大侠不要嘲笑。共同学习。

一:思路分析:

 

一个经过360加固的APK的运行过程应该为图中左边所示,在以上这种so劫持的思路为:第一步通过hook loadlibrary方法先加载自己的so,即:libhook.so

第二步在libhook.so中再加载libjiagu.so,并执行其中的JNI_Onload方法,完成最后的解释。

这样做有个最大的好处是:就是在libhook.so中通过hook 注册函数dvmUseJNIBridge()得到oncreate函数的地址,更好的进一步分析360的虚拟解释函数。因为360壳比较复杂,前面有一堆的解密等操作,这样做可以直接切入要害。

二、此思路能否过反调试?

1.原作者这种巧妙的运用sleep(9),不以调试模式启动,等在sleep(9)的时候直接附加,这个时候360在JNI_Onload中的反调试已经运行完了,所以不会触发反调试。

2.以下这种是在以调试模式启动的时候过反调试的基本操作:

首先看Dalvik虚拟机JNI方法的注册过程分析,通过老罗的分析博客,(老罗的分析真的很到位,此处盗用老罗的图)可以大致知道运行图如下:


因此来说在整个so劫持的关于JNI方法注册大致是如下:


从中我们可以看出要想在调试运行过程中在new_dvmUseJNIBridge()函数处下断点,必然是要触发反调试,接下里就是想办法过掉反调试。

三、过反调试

首先等APP加载起来在 LoadSo_InitJni()函数处,下断点,等运行到如图所示的时候F7进去分析如下,就进入了熟悉的libjiagu.so的JNI_Onload函数里面。


第一处反调试:rtld_db_dlactivity函数

作用功能发挥:

从linker通过符号表,找到函数rtld_db_dlactivity对应的模块中的地址(这里直接使用了简单的遍历符号表Sym结构的方式),然后返回。如果地址里面的值不为0则会调用raise函数发送一个结束进程的信号终止程序。

rtld_db_dlactivity函数:

这个函数实则默认情况下为空函数,这里的值应该为0,而当有调试器时,这里会被改为断点指令,0xDE10实则为thumb指令的断点。函数的功能是用于处理一些调试器的特殊情况的。比如调试器对模块的某个地址进行下断,但这个地址实际不存在,得在模块加载后才存在等的特殊情况下的函数。起的作用就是类似于协商解决特殊问题。

方法一:在乐固中也会调用raise函数进行进程的终止,可以通过在这个函数处下断点,然后,对这个函数中的函数体做响应的操作,无论在哪调用或者怎么调用,都不会使得反调试起作用,但是在360中我们知道第一处的反调试也是会通过调用这个函数,但是我在实验的过程中发现,等把raise函数体改变以后,整个程序不能跑,因此看来只能一步一步的往下跟。。

方法二:

思考:因为从上面可以知道要通过linker找到函数对应的模块地址,首先肯定会通过mmap函数把linker映射到内存中,因此首先在mmap函数处下断点,等到调用时返回就OK。

方法三:

由于在360加固中的核心的函数libjiagu.so中的核心分支点为:case 31和33,并且在31处中的BLX  LR来执行不同的函数,在此处下断点,看R0的返回值。


如图所示,对应的直接把将DE 10修改为nop指令 C0 46或者00 00,就OK了,过掉第一处反调试。

第二处反调试:TracePid

对于TracePid的检测,此处LR的值为strtol,将其返回值修改为0,

我这里是由于把系统内核的TracePid进行了修改,因此会出现:以下R0是0.


第三处反调试:端口的检测


对于端口的检测,这个好过,直接在刚开始调试的时候通过“./xyy -p7359”把端口换掉就可以了。

第四处反调试:

这个一看就是对于时间前后差值就行检测,如下图所示:


F5以后更为明显:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 4
支持
分享
最新回复 (17)
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发
2018-1-6 10:43
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
把样本传上来来啊
2018-1-6 12:53
0
雪    币: 324
活跃值: (384)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
无边 把样本传上来来啊
厉害
2018-1-6 13:52
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
无边 把样本传上来来啊
为了测试大神那个是不是可以直接过反调试我直接用了大神的样本https://bbs.pediy.com/thread-223699.htm
2018-1-6 14:35
0
雪    币: 303
活跃值: (179)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
非常棒,样本还是上篇文章的,其实我个人也是认为,这个思路,早在小三时就有了HOOK过反调试,和梆梆so的主动加载,但HOOK还是只能作为辅助手段,对上篇帖子,我仔细想了一下,如果说可以,那是非常巧合的情况,首先sleep要睡死,其次要不走jnionload,直接到oncreate的翻译函数,但那样也是调式不下去的,因为360反调试并不是那么僵硬
2018-1-6 14:37
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
感谢原作者和七少月,通过仔细的分析,原作者这种巧妙的运用sleep(9),不以调试模式启动,等在sleep(9)的时候直接附加,这个时候360在JNI_Onload中的反调试已经运行完了,所以不会触发反调试。
2018-1-7 19:42
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
之前原作的文章我访问说用户组权限不足,该怎么弄才能看到呢
2018-1-8 16:03
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
过往烟云 之前原作的文章我访问说用户组权限不足,该怎么弄才能看到呢
可能放到会员专区了,需要发表一篇精华文章就才可以看到
2018-1-8 19:47
0
雪    币: 324
活跃值: (384)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
不知世事 可能放到会员专区了,需要发表一篇精华文章就才可以看到
~~~
2018-1-8 21:29
0
雪    币: 178
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
Lucaks [em_7]~~~
哈哈还好有个叫google  cache的
2018-1-9 10:36
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
但是有的企业版是开的线程在用while间隔一定时间检测是否有调试        这种方式会不会就不行了
2018-1-9 15:56
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
13
bluth 但是有的企业版是开的线程在用while间隔一定时间检测是否有调试 这种方式会不会就不行了
看反调试函数的位置,如果在.init/.init_array或者JNI_Onload处使用sleep()时附加是可以的。如果反调试函数在应用层的话,需要分析清反调试函数的种类,可以使用HOOK  或者写一些脚本来过掉。比如hook  time函数等
2018-1-9 17:15
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
再请教下,我的理解是这种方式是在sleep下反调试没有检测到IDA,但是此时的循环还在继续,那sleep之后循环的的第二轮检测来了是不是不行了   
2018-1-9 18:30
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
bluth 再请教下,我的理解是这种方式是在sleep下反调试没有检测到IDA,但是此时的循环还在继续,那sleep之后循环的的第二轮检测来了是不是不行了 [em_1]
2018-1-9 21:17
0
雪    币: 35
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主可以发样本吗?  看不到原帖
2018-2-7 20:04
0
雪    币: 237
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
原帖看不到,求样本
2018-2-27 11:52
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
看了原贴之后 有些地方没看懂 这里感谢大佬解惑  
2019-11-17 15:09
0
游客
登录 | 注册 方可回帖
返回
//