LINUX 3.5.4 PTRACE (系列七)

来源:互联网 发布:java 读取cad文件 dwg 编辑:程序博客网 时间:2024/06/03 14:48

本文主要研究父进程利用ptrace系统调用访问子进程的内存。

跟踪进程能够查看被跟踪进程的地址空间并且查看进程某个内存地址锁存储的变量的值。在这里我们需要使用linux内核的nm工具对程序进行分析从而获取到符号的地址信息。

本文分析的例子就是通过变量的地址修改变量的值。具体程序如下:

child4:

#include "ptrace.h"void main(int argc,char *argv[]){  pid_t traced_process;  traced_process=atoi(argv[1]);  ptrace(PTRACE_ATTACH,traced_process,NULL,NULL);  wait(NULL);  int data=ptrace(PTRACE_PEEKDATA,traced_process,0x080496f4,0);  printf("data=%d\n",data);  data=245;  ptrace(PTRACE_POKEDATA,traced_process,0x080496f4,data);  ptrace(PTRACE_DETACH,traced_process,0,0);}

list9.c

#include "ptrace.h"int i;void main(){  i=143;  printf("child 4 start ...\n");  while(i!=245);   printf("child 4 outside loop ...\n");}


首先在一个中断后台运行child4.o

#./child4.o\ &

然后使用ps命令查看该进程的进程号

最后时候nm命令获取到该进程的符号信息,即变量i所对应的内存地址。操作完了之后,可以将PEEKDATA/POKEDATA中变量i的地址修改为nm输出中的变量i的地址

然后编译运行list9.o

#list9.o pid

通过上述的操作我们可以发现:本来child4.o程序是一个死循环,然后通过list9.o中使用PTRACE_ATTACH来跟踪child4.o进程。修改data变量的值,从而使得child4.o进程退出死循环。

在这里我们需要说明的一点是:PTRACE_ATTACH会导致子进程停止,我们可以采用前面的方法捕获进程停止的信号。

PTRACE_ATTACH会将子进程置于SIGSTOP.的状态。(通过WIFSTOPPED捕获,在此不再赘述)。

从这里我们也可以看出:PTRACE_TRACEME和PTRACE_ATTACH虽然都是对进程进行监控,但是实际的实现原理还是不同的。

可以总结为:

PTRACE_TRACEME是子进程主动请求被跟踪,该命令不会使得子进程停止,只是改变了子进程对信号的处理方式。比如前面CTRL+C的例子。

而PTRACE_ATTACH回事的子进程停止。然后通过PTRACE_DETACH让子进程重新运行。

 

 

1 0
原创粉丝点击