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

Child 是我正在跟踪的子进程的 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 回答