1

呼び出しでメモリの読み取りと書き込みをテストしているだけです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())、このコード全体が正常に動作しました!

どうしてこうなったかわかる方いますか...?

4

1 に答える 1

3

少し奇妙に思えますが、コードには少なくとも 1 つの実際のエラーがあります。マニュアルページから:

エラーが発生すると、すべてのリクエストが -1 を返し、errno が適切に設定されます。成功した PTRACE_PEEK* 要求によって返される値は -1 になる可能性があるため、呼び出し元は、そのような要求の後に errno をチェックして、エラーが発生したかどうかを判断する必要があります。

あなたのコードは をチェックしていないようですerrno。戻り値が -1 の場合にエラーが発生したと想定しているだけです。

于 2012-10-29T15:44:17.413 に答える