首页
社区
课程
招聘
[原创]使用 ptrace 过 ptrace 反调试
发表于: 2020-7-16 21:01 16750

[原创]使用 ptrace 过 ptrace 反调试

2020-7-16 21:01
16750

ptrace 反调试的原理是进程只能被一个进程附加。

当一个应用使用了 ptrace 反调试的时候,以 objection 为例,附加时候会出现这种现象:
图片描述
查看进程 /proc/self/status 目录,会看到 TracerPid 不为0,其值为附加它的父进程 pid ,这里是 zygote进程。
图片描述

图片描述

它的原理也很,加上 ptrace(PTRACE_TRACEME); 就行。

过掉它的方法很多,下面介绍使用 ptrace 怎么过掉 ptrace :
1、使用 ptrace 附加 zygote 进程。
2、拦截 zygotefork 调用,在 fork 子进程时候获取当前子进程名称,判断是不是我们想要的那个应用,如果是,就保存子进程 pid
3、获取到子进程 pid 后,再拦截子进程的系统调用,判断此系统调用是不是 ptrace,并且参数是 PTRACE_TRACEME
4、拦截到指定系统调用后,修改调用参数,让 ptrace(PTRACE_TRACEME); 执行失败。

最后效果如下,可以看到 TracerPid = 0 了
图片描述

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

 

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

收藏
免费 8
支持
分享
最新回复 (7)
雪    币: 1096
活跃值: (374)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
不错,有点意思,不去patch调用ptrace(PTRACE_TRACEME)的代码,去搞实现功能的zygote。
2020-7-17 09:07
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
先做个点。
2020-7-17 10:45
0
雪    币: 1110
活跃值: (3274)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
如果最后实现的效果是把 TracerPid 改成 PPid,而不是 0,那就更好了
2020-7-17 12:37
0
雪    币: 12502
活跃值: (3053)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
有些手机,比如龙岗无敌手的个别机型,内核层就没开启ptrace,其实完全大胆一点,给他返回失败就行了。
2020-7-20 11:15
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
楼主,能放个附件出来,学习下吗?谢谢!
2020-7-27 17:30
0
雪    币: 102
活跃值: (2050)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
mark
2022-3-11 23:00
0
雪    币: 45
活跃值: (1369)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好思路。
这句一点笔误,regs.ARM_r0 = 0; // 伪造一个成功的返回值
应该是伪造一个参数
2023-1-12 21:54
0
游客
登录 | 注册 方可回帖
返回
//