ptrace请求PTRACE_POKETEXT失败

时间:2012-08-05 21:34:59

标签: linux ptrace

我正在尝试在跟踪过程中注入代码...我能够正确读取寄存器(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

有什么想法吗?

1 个答案:

答案 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