1

我正在尝试在跟踪的进程中注入代码...我能够正确读取寄存器(PTRACE_GETREGS)并且也可以PTRACE_PEEKTEXT工作...我已经使用 GDB 进行了验证。但是,如果我ptracePTRACE_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.

有任何想法吗?

4

1 回答 1

6

您从第二个获得的那些奇怪字节ptrace(PTRACE_PEEKTEXT, ...)应该与 的地址匹配data- 将它们与 . 的值进行比较&data

尽管 的手册页将参数ptrace(2)显示为,但对于请求,它包含请求值。使用address-of运算符,您实际上是戳值的地址而不是值本身。正确的调用如下:datavoid *PTRACE_POKETEXTdata

res = ptrace(PTRACE_POKETEXT, pid, (void *)regs.eip, (void *)data); // w/o &
if (res != 0)
    //error
于 2012-08-05T22:19:41.370 回答