7 c linux ptrace systems-programming
我在这里看了一篇文章,并且正在尝试我在下面复制的代码片段: -
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> /* For constants
ORIG_EAX etc */
int main()
{ pid_t child;
long orig_eax;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
wait(NULL);
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld\n", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑究竟ORIG_EAX是什么以及为什么4*ORIG_EAX传递给ptrace调用.我最初假设ORIG_EAX,EBX,ECX等.将偏移到其中寄存器的值将被存储在特定的结构.
所以我决定在等待之后使用打印ORIG_EAX的值printf("origeax = %ld\n", ORIG_EAX);.价值是11.所以,我之前关于补偿的假设是错误的.
我知道wait当孩子进行状态更改(在这种情况下,发出系统调用)并且ORIG_EAX将包含系统调用号码时,调用将终止.
但是,为什么ORIG_EAX*4传递给ptrace调用?
Mat*_*all 10
该参数是user_regs_struct的偏移量.请注意,每个都是一个unsigned long,所以要获得第11个条目(orig_eax),以字节为单位的偏移量为44,(假设你当然是在x86机器上).
| 归档时间: |
|
| 查看次数: |
3192 次 |
| 最近记录: |