ptrace
ptrace 是 Linux 提供的一个系统调用,它允许一个进程(通常是父进程)监控和控制另一个进程(通常是子进程)。这个系统调用非常强大,因为它可以拦截系统调用、读取或修改被监控进程的内存和寄存器等。ptrace 常用于实现调试器(如 gdb)、系统调用跟踪工具(如 strace)以及其他需要监控进程行为的工具。ptrace 的基本用法包括以下几个方面:- 监控进程的系统调用:通过
PTRACE_TRACEME或PTRACE_ATTACH可以让父进程监控子进程的系统调用。当子进程执行系统调用时,它会被暂停,父进程可以检查和修改子进程的状态,然后让子进程继续执行。
- 读取和修改内存:使用
PTRACE_PEEKDATA和PTRACE_POKEDATA可以读取和修改子进程的内存内容。
- 读取和修改寄存器:通过
PTRACE_GETREGS和PTRACE_SETREGS可以获取和设置子进程的寄存器值。
- 单步执行:
PTRACE_SINGLESTEP可以让子进程单步执行,即执行一条指令后暂停。
- 设置断点:可以通过修改子进程的内存内容来设置断点,当子进程执行到该位置时会触发断点并暂停。
- 附加到运行中的进程:
PTRACE_ATTACH允许父进程附加到一个已经运行中的子进程上进行监控。
- 从监控中脱离:
PTRACE_DETACH可以让父进程停止监控子进程,子进程将继续独立运行
Seccomp
Seccomp(Secure Computing Mode)是Linux内核的一个安全特性,它允许进程限制自己可以执行的系统调用集合。Seccomp 有几种模式,包括严格模式(strict mode)、过滤模式(filter mode)、日志模式(log mode)和通知模式(notify mode)。其中,过滤模式(Seccomp BPF)是最灵活的,它使用Berkeley Packet Filter(BPF)程序来定义哪些系统调用是允许的。主要用来过滤我们要监控的系统调用, 配合ptrace来断点修改数据。
ptrace+seccomp的好处是足够的底层, 可以hook到系统调用, 避免aps使用svc防止inline hook, 来获取真实信息。
简单实现
跟踪: recvmsg ,recv,recvfrom系统调用
fork子进程, 设置 ptrace(PTRACE_SETOPTIONS, pid, NULL,default_ptrace_options | PTRACE_O_TRACESECCOMP);
拦截__NR_recvmsg 和 __NR_recvfrom 做modify修改mac返回值
- 作者:拓森Leo
- 链接:https://www.uzilol.cn/article/1b1cab7a-a8a5-426b-86d9-bddffc3a5385
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



