1

トレースされたプロセスでコードを挿入しようとしています...レジスター(PTRACE_GETREGS)を正しく読み取ることができ、動作しPTRACE_PEEKTEXTます...GDBで検証しました。ただし、リクエストを使用して呼び出すptraceと返されますが、同じアドレスで再度読み取ると、予期されたバイトが見つかりません。PTRACE_POKETEXT0

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);

1つ目print_wordは、GDBによって表示される4バイトを正確に出力します。2番目print_wordは、代わりに、ではなく奇妙なバイトを出力します0xAABBCCDD

何か案は?

4

1 に答える 1

6

2番目から取得するこれらの奇妙なバイトは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
于 2012-08-05T22:19:41.370 に答える