- 论坛徽章:
- 0
|
学习《玩转ptrace》这篇教程中一段代码的疑惑,最下面附上代码,谢谢各位高手指点
我理解trace的基本流程是
1,子进程 ptrace(PTRACE_TRACEME, 0, NULL, NULL); 表示接受trace
2,循环处理, 父进程 wait(&status); 表示 当子进程有事件(系统调用)的时候暂停他,拿到控制权
3, orig_eax=ptrace(PTRACE_PEEKUSER,。。) 表示窥探子进程系统调用数据
4, 在这个循环中可以通过orig_eax得知系统调用号码, 并作自己需要的处理
5, ptrace(PTRACE_SYSCALL, child, NULL, NULL);
就是这个我不明白,如果说这个是表示需要让子进程停在系统调用上,那么wait(&status)不是已经让子进程停在系统调用了么
如果说这个是表示继续,那么我把它换成 ptrace(PTRACE_CONT,)程序不工作。。。
请问高手这个到底怎么个意思呢?
int main()
{
pid_t child;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
long orig_eax;
long params[3];
int status;
char *str, *laddr;
int toggle = 0;
while(1) {
wait(&status);
if(WIFEXITED(status))
break;
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
if(orig_eax == SYS_write) {
if(toggle == 0) {
toggle = 1;
params[0] = ptrace(PTRACE_PEEKUSER,
child, 4 * EBX,
NULL);
params[1] = ptrace(PTRACE_PEEKUSER,
child, 4 * ECX,
NULL);
params[2] = ptrace(PTRACE_PEEKUSER,
child, 4 * EDX,
NULL);
str = (char *)calloc((params[2]+1)
* sizeof(char));
getdata(child, params[1], str,
params[2]);
reverse(str);
putdata(child, params[1], str,
params[2]);
}
else {
toggle = 0;
}
}
ptrace(PTRACE_SYSCALL, child, NULL, NULL);
}
}
return 0;
} |
|