【问题标题】:Why this ptrace error?为什么这个 ptrace 错误?
【发布时间】:2012-10-29 14:52:32
【问题描述】:

我只是通过ptrace() 调用测试读写内存,但是当我运行下面显示的代码时,我收到了这样的错误。

Processkey() : 0x80481240
readmem pid 3950
Original opcode : 0x4641682b
writemem pid 3950
readmem pid 3950
PEEKDATA error: No such file or directory

如您所见,readmem() 工作正常,但之后,readmem() 打印错误。

long readmem(int pid, unsigned long addr)
{
    long ret=0;
    printf("readmem pid %d\n", pid);
    ret = ptrace(PTRACE_PEEKDATA, pid, (void *)(addr), 0);
    if(ret<0)
    {
        error("PEEKDATA error");
    }
    return ret;
}

void writemem(int pid, unsigned long addr, long data)
{
    long ret=0;
    printf("writemem pid %d\n", pid);
    ret = ptrace(PTRACE_POKEDATA, pid, (void *)addr, (void *)data);
    if(ret<0)
    {
        error("POKEDATA error");
    }
}

void detach(int pid)
{
    long ret=0;
    ret = ptrace(PTRACE_DETACH, pid, NULL, NULL);
    if(ret<0)
    {
        error("detach() error");
    }
}

void attach(int pid)
{
    long ret=0;
    ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
    if(ret<0)
    {
        error("ptrace() error");
    }

    ret = waitpid(pid, NULL, WUNTRACED);
    if(ret<0)
    {
        error("waitpid ()");
    }
}

int main(int argc, char **argv)
{
    long ret = 0;
    pid_t pid = 0;
    REGS *regs;
    unsigned long processkey_addr = 0;
    int stat_value = 0;
    long op = 0;

    pid = atoi(argv[1]);
    processkey_addr = 0x80481240;
    printf("Processkey() : 0x%lx\n", processkey_addr);

    attach(pid);
    op = readmem(pid, processkey_addr);
    printf("Original opcode : 0x%lx\n", op);
    writemem(pid, processkey_addr, 0x41424344);
    printf("Changed opcode : 0x%lx\n", readmem(pid, processkey_addr));
    detach(pid);
}

但是——这让我发疯了——当我在没有函数的情况下测试代码时(只是在main() 中编写了内联代码),整个代码运行良好!

有谁知道为什么会发生这种情况...?

【问题讨论】:

  • readmem() 中的跟踪代码应该也打印出它正在读取的地址。

标签: c linux ptrace


【解决方案1】:

这似乎有点奇怪,但您的代码中至少存在一个实际错误。从手册页:

发生错误时,所有请求都返回 -1,并且正确设置了 errno。由于成功的 PTRACE_PEEK* 请求返回的值可能为 -1,因此调用者必须在此类请求后检查 errno 以确定是否发生错误。

您的代码似乎没有检查errno,它只是假设返回值为-1时发生错误。

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2016-11-25
    • 2018-06-28
    • 2023-03-09
    相关资源
    最近更新 更多