首页
社区
课程
招聘
[原创]梆梆脱壳分析1-所有线程抗gdb技术实现
发表于: 2015-3-18 22:24 17499

[原创]梆梆脱壳分析1-所有线程抗gdb技术实现

2015-3-18 22:24
17499

我的博客:http://blog.csdn.net/eewolf

对于目前Android平台上的脱壳技术,方法有很多,但对于一名coder而言,如何实现那些“奇技淫巧”,对我而言更加有趣些。
对于梆梆,之前有文章讨论可以attach到其binder线程上,通过gcore、dd来dump内存中的dex。(当然,脱壳方法有很多,不一定非要用这种方法。)
但对于其最新版本,当使用gdb attach到主进程的任一线程上时,要么permission denied,要么会退出,本文章会对其实现机理进行一下分析。
eewolf原创,转载请注明。
1.      主进程fork子进程c1,c1 fork子进程c2;
2.      c1会ptrace attach到主进程的主线程与GC线程(其也会操作memory,所以需要用ptrace方法保护),这样当试图ptrace attach时,会有permission denied;
3.      主进程为了能让c1这个子进程跟踪,需要调用prctl,option为SET_DUMPABLE。但这个API比较危险,其效果与AndroidManifest文件中debuggable选项设为true等价。如果不调用这个api,子进程是不能trace父进程的;
4.      c1也会ptrace到c2进程,来对其进行保护;
5.      这个三个进程间彼此用pipe进行通信;
6.      c1会向主进程内存空间注入大约52字节的数据,应为密钥;
7.      之后c1进入pipe读阻塞sleep;
8.      c2使用inotify监控主进程的每个clone process的mem与pagemap,于是当gdb、dd试图dump内存时,mem的access事件被触发,三个进程集体退出,导致内存dump不完整;这边漏了一个,同时c2会不断打开主进程的各个status文件,看其tracerpid是否为0,非0则被attach,退出;
9.      c2并monitor主进程的task目录,来判断是否有新的clone process或现有的已消亡,来更新monitor的select loop的fd集合。

爱加密也是使用类似方法来实现其功能。
另外,梆梆还hook了write方法,来阻止在进程内部将header为dex的magic code的内容写入磁盘。

eewolf原创,转载请注明。


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

收藏
免费 3
支持
分享
最新回复 (7)
雪    币: 158
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
hook  write那个好破解 ,字节流中转出来到其他进程就好了
2015-3-19 08:45
0
雪    币: 244
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
或者写的时候,把dex,改成xxx就好啦,呵呵
2015-3-19 16:01
0
雪    币: 158
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
原来如此
2015-3-19 16:03
0
雪    币: 244
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
是文件header,不是后缀啊
2015-3-19 16:04
0
雪    币: 51
活跃值: (30)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
好奇测试了一下inotify,  给的参数是 IN_ALL_EVENTS, 我监控了/proc/%d/mem  and  status
然后使用命令行:
adb shell
cd proc/pid/
cat status
cat mem

没一个触发的, 楼主请问和解?
2016-3-21 15:20
0
雪    币: 275
活跃值: (320)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
原来如此,受教了,最近也在一直研究邦邦加固,但是没找到好的方法绕过
2016-5-16 19:43
0
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大牛开始研究梆梆啦
2016-5-16 20:00
0
游客
登录 | 注册 方可回帖
返回
//