0

私は現在、彼のシステムコールを知るためにプログラムを追跡しなければならないツールを開発しています。今のところ、システムコールの数値パラメータを取得することはできますが、文字列に適切にアドレス指定することはできません。

これが私が進む方法です:

  long addr = ptrace(PTRACE_PEEKDATA, pid, regs.ebx, NULL);
  printf("%s", (char *) &addr);

そのコードで文字列の先頭(最初の3文字または4文字)を取得できますが、末尾が破損しているため、理由はわかりません。

解決策はありますか?ありがとうございました。

4

3 に答える 3

3
char *read_string (int child, unsigned long addr) {
    char *val = malloc(4096);
    if (!val)
        return NULL;

    int allocated = 4096, read = 0;
    unsigned long tmp =0;
    while(1) {
        if (read + sizeof (tmp) > allocated) {
            allocated *= 2;
            char *temp_val = realloc (val, allocated);
            if (!temp_val) {
                free(val);
                return NULL;
            }
            val = temp_val;
        }
        tmp = ptrace(PTRACE_PEEKDATA, child, addr + read);
        if(errno != 0) {
            val[read] = 0;
            break;
        }
        memcpy(val + read, &tmp, sizeof tmp);
        if (memchr(&tmp, 0, sizeof tmp) != NULL) break;
        read += sizeof tmp;
    }
    return val;
} // Don't forget to free the returned val.

次の関数を使用してみてください。これは、アプリケーションで作成したものの一部でした。

reg_val[1] = ptrace (PTRACE_PEEKUSER, child, 4 * EBX, NULL);
char *filepath = read_string(child, reg_val[1]);

子は、私がトレースしている子プロセスのpidです。これが機能しない場合は教えてください。

于 2012-05-09T11:35:32.413 に答える
2

代わりにこれが必要ないことを確認しますか?

printf("%lX", addr);

于 2012-04-30T15:01:22.217 に答える
0

投稿されたコードでは、ptraceの呼び出しで4バイトのデータ(つまり4文字)しか読み取っていません。親プロセスで文字列を出力する前に、デバッグプロセスからバッファ全体を読み取る必要があります。つまり、addrを読み取った後、ループする必要があります

   ptrace(PTRACE_PEEKTEXT, child, addr, NULL)
   addr+=4;

文字列全体を読むまで。

次に、printf()を使用して印刷できます。

于 2012-05-15T00:52:25.843 に答える