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 領域のオフセット addr で単語を読み取ります

この違いは、man ページだけでは理解できません。これについてもっと教えてくれる人はいますか??

4

1 に答える 1

24

PTRACE_PEEKDATA子のデータ/コードセクションを読み取るためのものです(プロセス一般-いわゆるtracee)。ご存知のように、デバッガーptraceは多くを使用します。この呼び出しを使用して、変数の値を調べることができます。たとえば、でGDB/DBX、あなたが言うなら

print count

デバッガーは内部ptraceでwithを呼び出し、PTRACE_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_PEEKDATAとの間の同等性に注意してくださいPTRACE_PEEKTEXT。差出人man ptrace

Linuxには個別のテキストアドレススペースとデータアドレススペースがないため、これら2つの要求は現在同等です。

于 2012-03-21T11:54:25.900 に答える