ptrace系统调用的基本原理是通过操作系统提供的接口,以PTRACE_ATTACH参数追踪目标进程,并以PTRACE_GETREGS、PTRACE_SETREGS、PTRACE_PEEKDATA、PTRACE_POKEDATA、PTRACE_SINGLESTEP、PTRACE_CONT等参数读取和修改目标进程的状态、内存和执行。具体步骤如下:ptrace启动跟踪子进程:ptrace系统调用以PTRACE_TRACEME参数启动一个子...
调试进程(如GDB)可以通过调用 ptrace(PTRACE_PEEKDATA, pid, addr, data) 立即获取被调试进程 addr 处虚拟内存地址的数据,但每次只能读取一个大小为 4字节的数据。 我们来看看 ptrace() 对 PTRACE_PEEKDATA 操作的处理过程,代码如下: asmlinkage int sys_ptrace(long request, long pid, long addr, long data)...
data.val = ptrace(PTRACE_PEEKDATA, child, addr + i *4,NULL);memcpy(backup, data.chars, j); } }/*与getdata相反,主要通过PTRACE_POKEDATA向内存写内容*/voidputdata(pid_tchild,longaddr,char*str,intlen){char*code;inti, j;unionu{longval;charchars[long_size]; }data; i =0; j = len ...
2.6、PTRACE_PEEKDATA PTRACE_PEEKDATA读取进程虚拟地址空间的任意数据。 2.7、PTRACE_POKEDATA PTRACE_POKEDATA设置进程虚拟地址空间的任意数据。 2.7.1、设置断点 PTRACE_POKEDATA可以用来实现gdb的设置断点功能,具体的设置方法可以参考如下方法。 调试器是怎么设置断点的呢?通常是将当前将要执行的指令替换成trap指令,于...
ptrace(PTRACE_PEEKTEXT, m_nPid, (void*)pRemoteAddr, 0); 1. 传入的第一个参数可以是 PTRACE_PEEKTEXT / PTRACE_PEEKDATA / PTRACE_PEEKUSER , 这三个参数效果相同 ; 传入的第二个参数是 进程号 PID , ptrace 函数可以同时调试多个进程 ;
ptrace(PTRACE_PEEKDATA, pid, addr, data) 描述:从内存地址中读取一个字节,pid表示被跟踪的子进程,内存地址由addr给出,data为用户变量地址用于返回读到的数据。在Linux(i386)中用户代码段与用户数据段重合所以读取代码段和数据段数据处理是一样的。
读取进程数据权限 :PTRACE_PEEKTEXT、PTRACE_PEEKDATA、PTRACE_PEEKUSER 写入进程数据权限 :PTRACE_POKETEXT、PTRACE_POKEDATA、PTRACE_POKEUSER 注意: 读写内存时 , 尽量在进程挂起后读写 , 否则内存数据不可靠 ; 4、进程对应的主线程寄存器读写 读取寄存器 :PTRACE_GETREGS ...
从执行结果来看,现在可以打印系统调用的名字了,但我们知道 strace 命令还会打印系统调用参数的值,我们可以通过 ptrace() 系统调用的 PTRACE_PEEKTEXT 和PTRACE_PEEKDATA 来获取参数的值,所以有兴趣的就自己实现这个效果了。 #include <sys/ptrace.h> #include <sys/user.h> #include <unistd.h> #include <stdlib...
PTRACE_PEEKTEXT, PTRACE_PEEKDATA 从内存地址中读取一个字节,内存地址由 addr 给出。 PTRACE_PEEKUSR 从USER 区域中读取一个字节,偏移量为 addr。 PTRACE_POKETEXT, PTRACE_POKEDATA 往内存地址中写入一个字节。内存地址由 addr 给出。 PTRACE_POKEUSR ...
传入的第一个参数可以是 PTRACE_PEEKTEXT / PTRACE_PEEKDATA / PTRACE_PEEKUSER , 这三个参数效果相同 ; 传入的第二个参数是 进程号 PID , ptrace 函数可以同时调试多个进程 ; 传入的第三个参数是内存地址 ,void*指针类型的 ; 传入的第四个参数默认为 0 ; ...