我正在尝试在跟踪过程中注入代码...我能够正确读取寄存器(PTRACE_GETREGS
)以及PTRACE_PEEKTEXT
工作...我已经使用GDB验证了。但是,如果我使用ptrace
请求调用PTRACE_POKETEXT
它会返回0
但是在同一地址再次读取我找不到预期的字节:
void print_word(long res) {
char *datap = (char *)&res;
if (res == -1)
//check errno for errors
else
printf("%02X %02X %02X %02X\n", datap[0], datap[1], datap[2], datap[3]);
}
....
long res, data = 0xAABBCCDD;
res = ptrace(PTRACE_PEEKTEXT, pid, (void *)regs.eip, NULL);
print_word(res);
res = ptrace(PTRACE_POKETEXT, pid, (void *)regs.eip, (void *)&data);
if (res != 0)
//error
res = ptrace(PTRACE_PEEKTEXT, pid, (void *)regs.eip, NULL);
print_word(res);
第一个print_word
打印GDB显示的四个字节。第二个print_word
代替打印奇怪的字节,而不是0xAABBCCDD
。
有什么想法吗?
答案 0 :(得分:5)
从第二个ptrace(PTRACE_PEEKTEXT, ...)
获得的那些奇怪字节应与data
的地址匹配 - 将它们与&data
的值进行比较。
虽然ptrace(2)
的手册页将data
参数显示为void *
,但PTRACE_POKETEXT
请求data
保存请求值。使用 address-of 运算符,您实际上会戳取值的地址而不是值本身。正确的调用如下:
res = ptrace(PTRACE_POKETEXT, pid, (void *)regs.eip, (void *)data); // w/o &
if (res != 0)
//error