12

在发布了很多关于ptrace(最近的 5 个问题是我的问题:()之后,我终于在更换时得到了所需的输出

reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);

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

手册页中提到的区别是这样的

  • PTRACE_PEEKTEXT在孩子记忆中的位置 addr 读取一个单词
  • PTRACE_PEEKUSER在孩子的 USER 区域中的 offset addr 处读取一个单词

我无法单独从手册页中理解这种差异。任何人都可以在这方面教育我更多吗?

4

1 回答 1

24

PTRACE_PEEKDATA用于读取孩子的数据/代码部分(一般的过程 - 所谓的跟踪)。如您所知,调试器使用ptrace很多。他们可以使用此调用来检查变量的值。例如,在 中GDB/DBX,如果你说

print count

调试器将在内部调用ptracewithPTRACE_PEEKDATA并找到它的值。

PTRACE_PEEKUSER用于读取包含寄存器内容和其他信息的孩子的 USER 区域的内容。sys/user.h列出了其他信息。

例如 USER 区域包含,

struct user_regs_struct
{
  long int ebx;
  long int ecx;
  long int edx;
  long int esi;
  long int edi;
  long int ebp;
  long int eax;
  long int xds;
  long int xes;
  long int xfs;
  long int xgs;
  long int orig_eax;
  long int eip;
  long int xcs;
  long int eflags;
  long int esp;
  long int xss;
};

简而言之

  • PTRACE_PEEKDATA用于程序数据(例如变量)和代码;
  • PTRACE_PEEKUSER用于寄存器值和其他调试信息之类的东西;

注意 和 之间的等价PTRACE_PEEKDATAPTRACE_PEEKTEXT。来自man ptrace

Linux 没有单独的文本和数据地址空间,因此这两个请求目前是等价的。

于 2012-03-21T11:54:25.900 回答