首页
社区
课程
招聘
[讨论]如何阻止ptrace
发表于: 2014-6-10 18:01 45068

[讨论]如何阻止ptrace

2014-6-10 18:01
45068
最近开始了解一些APK版本安全问题,这里保护不是源代码,而是阻止二次打包,无论加壳,dex动态加载,签名验证等都只是一定程度上阻止罢了,无论如何处理,只要破解者通过gdb动态调试,dump出dex文件,稍加分析,就可以比较轻松的实现二次打包。
      所以考虑在前面安全措施的情况下,如何阻止被动态调试,首先是关闭android:debugable="false",然后是在so中ptrace主进程,但是这样做不全面,因为每个应用都有一个进程组,里面有很多进程,只要附着到任意一个组进程上,都可以实现动态调试,此前一篇文章中梆梆加密就是如此破解的。
       今天看到inotify,感觉有戏,就在so中对proc/xxx/task和proc/xxx/status进行检测,理论上,无乱是是task下增加或者删除进程,都会被处罚,相应的增加或删除对status的修改的检测,因为默认情况下status中TracerPid值为0,只有被调试时才会出现调试进程的id。
       但是现实很骨感,首先proc/xxx/task下的内容是在kernel中创建删除的,不经过文件系统,自然得不到触发(机器是支持inotify的,在data下手动添加删除文件是可以被触发的)。然后是status的改变也是得不到触发,不知道是因为系统改变的方式还是因为权限问题。
       此前也尝试在so中对应用的组进程下的每个进程都进行ptrace,但是因为权限原因失败,对应一个产品,不可能要求值运行在root权限下,这样不现实,所以也没继续下去。
       不知道各位是如何阻止动态调试的?

[课程]Linux pwn 探索篇!

收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 93
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
补充下都是具有读权限的
2014-6-10 18:09
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
想完全阻止也是不可能的吧,只能尽可能增加复杂度而已。我觉得光靠反ptrace防止dump内存还不行,还要研究一下怎么让它dump出来的东西也没法分析~
2014-6-11 10:15
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
再补充一点,/proc/xx/task里面的线程应该是附属于当前进程的吧,我觉得ptrace的话应该不会出现权限问题啊~
2014-6-11 10:20
0
雪    币: 93
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
目前测试的结果却是是inotify检测没有被触发,我尝试在so中进行检测的进程获取执行su获取root权限,或者在应用中获取su权限,也还是如此。可能inotify只能检测通过文件系统进行的操作,而通过内核直接修改的文件无法得到触发吧。
      不管如何,想要dump,首先的ptrace附着到目标的进程上,无论是阻止ptrace还是在动态检测,一旦被ptrace上立刻终止应用,都能比较简单的阻止动态调试,这个的对象是第三方应用,如果过于复杂,会造成系统负担以及稳定性和被第三方检测为木马程序的风险。
2014-6-11 11:09
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
inotify还没有研究~不过我觉得在so中直接调用ptrace TRACEME将主进程置于调试状态对复杂应用来说是有点问题的,因为处于被调试状态的进程只要接受到除SIGKILL之外的信号都会暂停执行,交给调试它的父进程处理,还是双进程或者多进程处理ptrace靠谱~
     你尝试把遍历/proc/xx/task,把所有线程也都ptrace了么?
2014-6-11 16:31
0
雪    币: 93
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不行,我已经尝试了遍历所有task,创建单独的进程,分别ptrace到group下每个进程,权限不够,无论是在app还是so中进行sysyem("su");都是提示权限不足。
    目前唯一可行的做法就是,遍历group下每个进程,读取status文件,判断tracePid值,大于0说明被调试,但是这样做,只能起一个进程,固定时间间隔扫描,对系统有一定的负担,目前学习可以这样来,作为产品是不行的。
2014-6-11 17:44
0
雪    币: 93
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
刚有测试了下inotify检测proc/pid/status的状态变化,确认是和权限无关,在adb手动cat时会被触发,但是代码中使用ptrace(PTRACE_TRACEME,0 ,0 ,0);后status的变化不会被触发,读取status确认tracePid值确实是发生了变化。
      唯一的确别就是一个是通过文件系统,一个是底层kernel直接维护,inotify这条路基本上行不通了。
      最新的android4.4如果打开selinux的话,ptrace是无法连接上的,目前我们自己做的项目android4.4是没打开selinux的,而且破解者也可以通过修改selinux的配置,将最大连接数改为0,使之失效。
2014-6-11 18:04
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
     我搞的貌似还没有楼主厉害,自己试了试主进程直接traceme,结果简单应用可以正常运行,但是复杂点的就不行了;还试了双进程,但是我子进程怎么也不能attach父进程,不知道别人怎么做成的,现在也没搞明白~
2014-6-13 14:14
0
雪    币: 95
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
在安卓平台上,注入和dump这种根本都是防不了的,甚至你的软件正在运行的系统都是不值得信任的,破解者完全可以自己改一个系统。
2014-6-13 16:09
1
雪    币: 93
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
如果不能ptrace的话,怎么附着到我的进程上,如何进一步dump。
   当然如果系统都有问题,什么都是白搭,想要什么数据都可以导出。
   目前所考虑的就是增加破解成本,本来就不是非常有价值的产品,只要成本大于价值,那么就安全了。
2014-6-13 18:31
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好东西,受益匪浅
2014-6-16 22:00
0
雪    币: 11
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我遇到一个是应用自己调用类似gdbserver附加自己,如果denied,说明已经被调试
2014-8-20 17:14
0
雪    币: 189
活跃值: (192)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
TracerPid 不为0的监测早被破了
某加密新版动态脱壳 http://bbs.pediy.com/showthread.php?t=190384
2014-8-21 09:33
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这篇文章进行操作的前提也是你attach到进程之上进行修改,一般的反调试是attach到当前进程直接断掉。
2014-8-21 09:39
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
非常赞同。 自己编译个系统去做逆向非常正常。
2014-11-14 10:57
0
雪    币: 196
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
android 5.0的selinux加强了安全限制,完全阻止了。
2014-11-20 19:46
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
开启线程查询Ptrace id需要一定的资源
有没有试过检测 gDvm.debuggerConnected这个结构来实现呢
或者有新的方法
2015-1-30 08:44
0
雪    币: 419
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这是开源系统,任何阻止ptrace的措施都是无效的,白忙
2015-3-1 23:31
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
The reason you could not attach your parent process is that your pp is not dumpable. So processes that are not dumpable can not be attached via ptrace PTRACE_ATTACH.

The solution is to set your parent process be dumpable. And how to do it, I think you could google that!
2015-3-3 16:05
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这个我已经搞明白了,thankyou~
2015-3-23 00:41
0
雪    币: 267
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
你好,请问允许子进程ptrace attach父进程是通过在主进程里调用prctl(PR_SET_DUMPABLE,1,0,0,0)吗?
2015-8-24 16:39
0
雪    币: 51
活跃值: (30)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
23
你好, 我也想知道怎么解决的,能共享一下吗?
2016-3-10 11:41
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
谢谢分享思路
2016-5-20 22:48
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
25
那篇文章的大神写的是对的呢,他用的启动附加呢,人家的反attach写在so里面呢,启动附加的方式,人家的so都木有运行起来,你可以用ida想怎么附加就怎么附加,,这是一种思路,免去了直接hook fgets函数,寻找安全点的反调试办法
2016-6-4 14:18
0
游客
登录 | 注册 方可回帖
返回
//