当我们获取到系统调用编号以后,就可以通过ptrace的PTRACE_CONT参数来唤醒暂停中的子进程,让其继续执行。 ptrace参数 long ptrace(enum __ptrace_request request,pid_t pid,void addr, void *data); 参数request 控制ptrace函数的行为,定义在sys/ptrace.h中。 参数pid 指定tracee的进程号。 以上两个参数是必须的,...
20)PTRACE_SETREGSET 设置目标进程的寄存器集合,通常用于GDB设置目标进程的硬断点、观察点; 二、ptrace 常见应用场景 1、gdb进程调试 gdb对目标进程进行跟踪调试,其底下依赖的主要是linux内核中的 ptrace功能、以及 signal + wait 这两个用于同步的系统调用。通过ptrace接口,gdb可以对被调试进程进行一系列的调试跟踪操作。
ptrace 支持不同的操作,而这些操作则通过一个 ptrace 请求代码来指定,值得注意的一些操作示例包括:PTRACE_ATTACH(连接到进程)、PTRACE_PEEKTEXT(从进程内存中读取)和 PTRACE_GETREGS(检索进程寄存器)。代码段 1 显示了 ptrace 的一个用例。// Attach to the remote process ptrace(PTRACE_ATTACH, pid, NULL, NULL...
PTRACE_PEEKDATA ptrace(PTRACE_PEEKDATA, pid, addr, data);从内存地址中读取一个字节,内存地址由addr给出 PTRACE_PEEKUSER ptrace(PTRACE_PEEKUSR, pid, addr, data)从USER区域中读取一个字节,偏移量为addr PTRACE_POKETEXT ptrace(PTRACE_POKETEXT, pid, addr, data);往内存地址中写入一个字节。内存地址由add...
比如设置PTRACE_PEEKTEXT,就能把目标进程的某个地址的内存读到本进程。 用户函数调用 前面说到,我们希望让目标进程调用dlopen(target.so),来实现target.so的注入。抽象出来,就是如何让目标进程调用一个用户函数(即,非系统调用的函数)。 那么如何调用?可以拆分为两步,第一步找到目标函数的地址,第二步调用它。
1--PTRACE_PEEKTEXT, 2-- PTRACE_PEEKDATA:在目标进程的内存中读取地址地址处的一个字的内容,并返回该内容。 3--PTRACE_PEEKUSER:在目标进程的用户区域的偏移地址处(参数addr指定)读入一个字的内容。关于偏移大小对应的内容,更多信息可以在sys/user.h中了解。
ptrace 支持不同的操作,这些操作由ptrace请求代码指定— 一些值得注意的示例包括 PTRACE_ATTACH(附加到进程)、PTRACE_PEEKTEXT(从进程内存读取)和 PTRACE_GETREGS(检索进程寄存器)。 使用ptrace 检索远程进程的寄存器的示例: // Attach to the remote process ptrace(PTRACE_ATTACH, pid, NULL, NULL); wait(NULL);...
然后,我们调用ptrace,使用第一个参数PTRACE_ATTACH,并将第二个参数设定为要附加的进程的PID。之后,我们需要调用wait来等待标志着附加构成完成的SIGTRAP信号。 此时,我们连接的进程已经停止,也就意味着我们可以对其进行任意地修改。 注入代码 第一步,我们必须要决定在哪里注入代码。这里存在很多可能: ...
Ptrace 可以让父进程控制子进程运行,并可以检查和改变子进程的核心image的功能(Peek and poke 在系统编程中是很知名的叫法,指的是直接读写内存内容)。ptrace主要跟踪的是进程运行时的状态,直到收到一个终止信号结束进程,这里的信号如果是我们给程序设置的断点,则进程被中止,并且通知其父进程,在进程中止的状态下,进程...
在调试器仅仅修改寄存器是不够的。调试器有时需要读取一部分内存,甚至对其进行修改。GDB 可以使用print得到一个内存位置或变量的值。ptrace通过下面的方法实现这个功能: PTRACE_PEEKTEXT和PTRACE_POKETEXT:这些允许读取和写入被跟踪者地址空间中的一个字。当然,使用这个功能时被跟踪者要被暂停。