首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用请求PTRACE_POKETEXT的ptrace失败

使用请求PTRACE_POKETEXT的ptrace失败
EN

Stack Overflow用户
提问于 2012-08-06 05:34:59
回答 1查看 3.7K关注 0票数 1

我正在尝试在一个可跟踪的进程中注入代码...我能够正确地读取寄存器(PTRACE_GETREGS)并且PTRACE_PEEKTEXT也可以工作...我已经与GDB进行了验证。但是,如果我用PTRACE_POKETEXT请求调用ptrace,它会返回0,但是在相同的地址再次读取,我没有找到预期的字节:

代码语言:javascript
复制
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

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-06 06:19:41

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

尽管ptrace(2)的手册页将data参数显示为void *,但对于PTRACE_POKETEXT请求,data保存的是请求值。使用address-of操作符,实际上是指向值的地址,而不是值本身。正确的调用如下:

代码语言:javascript
复制
res = ptrace(PTRACE_POKETEXT, pid, (void *)regs.eip, (void *)data); // w/o &
if (res != 0)
    //error
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11820260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档