我正在尝试在一个可跟踪的进程中注入代码...我能够正确地读取寄存器(PTRACE_GETREGS)并且PTRACE_PEEKTEXT也可以工作...我已经与GDB进行了验证。但是,如果我用PTRACE_POKETEXT请求调用ptrace,它会返回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显示的4个字节。第二个print_word打印奇怪的字节,而不是0xAABBCCDD。
有什么想法吗?
发布于 2012-08-06 06:19:41
从第二个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)
//errorhttps://stackoverflow.com/questions/11820260
复制相似问题