ptrace(PTRACE_PEEKUSER)和ptrace(PTRACE_PEEKDATA)之间的区别?

kid*_*dd0 12 c ptrace system-calls strace

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

reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);
Run Code Online (Sandbox Code Playgroud)

reg_val[1] = ptrace(PTRACE_PEEKUSER, child, 4 * EBX, NULL);
Run Code Online (Sandbox Code Playgroud)

手册页中提到的差异是这样的

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

我无法从手册页中单独理解这种差异.谁能教育我更多吗?

Pav*_*ath 21

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

print count
Run Code Online (Sandbox Code Playgroud)

调试器将在内部调用ptracePTRACE_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;
};
Run Code Online (Sandbox Code Playgroud)

简而言之:

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

注意之间的等价PTRACE_PEEKDATAPTRACE_PEEKTEXT.来自man ptrace:

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