天天看点

linux之ptrace

经典博客:

Linux内存替换系列(包括实验 实验可行)  就是要注意下是64位还是32位的。。。。

https://blog.csdn.net/Dearggae/article/details/47379245

玩转ptrace:

http://www.cnblogs.com/wangkangluo1/archive/2012/06/05/2535484.html

ptrace系统调用

ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像(包括寄存器)的值。其基本原理是: 当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED。而父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行。

其原型为:

#include sys/ptrace.h

long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

ptrace有四个参数:

1). enum __ptrace_request request:指示了ptrace要执行的命令。

2). pid_t pid: 指示ptrace要跟踪的进程。

3). void *addr: 指示要监控的内存地址。

4). void *data: 存放读取出的或者要写入的数据。

ptrace是如此的强大,以至于有很多大家所常用的工具都基于ptrace来实现,如strace和gdb。

来自 https://www.cnblogs.com/tangr206/articles/3094358.html

【描述】

提供父进程观察和控制另一个进程执行的机制,同时提供查询和修改另一进程的核心映像与寄存器的能力,主要用于执行断点调试和系统调用跟踪。

【功能】

Request参数决定了系统调用的功能:(第一个参数决定ptrace的行为也决定了接下来其它3个参数是怎样被使用的)

• PTRACE_TRACEME

本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。

• PTRACE_PEEKTEXT, PTRACE_PEEKDATA

从内存地址中读取一个字节,内存地址由addr给出。

• PTRACE_PEEKUSR

从USER区域中读取一个字节,偏移量为addr。

• PTRACE_POKETEXT, PTRACE_POKEDATA

往内存地址中写入一个字节。内存地址由addr给出。

• PTRACE_POKEUSR

往USER区域中写入一个字节。偏移量为addr。

• PTRACE_SYSCALL, PTRACE_CONT

重新运行。

• PTRACE_KILL

杀掉子进程,使它退出。

• PTRACE_SINGLESTEP

设置单步执行标志

• PTRACE_ATTACH

跟踪指定pid 进程。

• PTRACE_DETACH

结束跟踪

Intel386特有:

• PTRACE_GETREGS

读取寄存器

• PTRACE_SETREGS

设置寄存器

• PTRACE_GETFPREGS

读取浮点寄存器

• PTRACE_SETFPREGS

设置浮点寄存器

init进程不可以使用此函数

来自 https://blog.csdn.net/Dearggae/article/details/47144393

将代码插入到自由空间

在前面的例子中我们将代码直接插入到了正在执行的指令流中,然而,调试器可能会被这种行为弄糊涂,所以我们决定把指令插入到进程中的自由空间中去。通过察看/proc/pid/maps可以知道这个进程中自由空间的分布。

小结:

ptrace函数可能会让人们觉得很奇特,因为它居然可以检测和修改一个运行中的程序。这种技术主要是在调试器和系统调用跟踪程序中使用。它使程序员可以在用户级别做更多有意思的事情。已经有过很多在用户级别下扩展操作系统得尝试,比如UFO,一个用户级别的文件系统扩展,它使用ptrace来实现一些安全机制。

来自 http://www.cnblogs.com/wangkangluo1/archive/2012/06/05/2535484.html

断点的实现原理,就是在指定的位置插入断点指令,当被调试的程序运行到断点的时候,产生SIGTRAP信号。

来自 https://www.cnblogs.com/tangr206/articles/3094358.html

继续阅读