2016-09-04 1 views
0

私は、ptraceを使って、read、write、openなどのシステムコールをトレースしています。 openのシステムコールがある場合、このシステムコールに渡された引数はuser_regs_structから取得できます。最初の引数はrdiレジスタに格納されます。 rdiの内容は、unsigned long long intです。これから文字列ファイル名を取得するにはどうすればいいですか?システムコールをオープンするために渡されたfoo.txt?Cでlinuxシステムコールに渡された引数を取り出す方法は?

+0

これは、その文字列がプロセスのメモリ内のどこにあるかを示すポインタです。 –

+0

はい、私は同じことを読むことができません。プロセスのアドレス空間を読み取る特別な方法はありますか?空文字列か<エラー:アクセスできません..>のいずれかが表示されます。 – Sagar

+0

はい、 'ptrace'を使用します。 'PTRACE_PEEKTEXT'と' PTRACE_PEEKDATA'を探します。 –

答えて

0

openに渡される引数(およびシステムコールが文字列を受け取るその他の場合)は、メモリ内の文字列の場所へのポインタです。

残念ながら、これらのポインタはデバッグのアドレス空間用であり、デバッガのアドレス空間から直接参照することはできません。

のドキュメントでは、一度に4文字(またはプラットフォームに応じて8バイト)の文字列を繰り返し取得することがあります。あなたは古いfakeroot-ng codeでこれを行う方法の例を見ることができます。そのコードはGPLの下にあるので、互換性のあるライセンスのコードを書かない限り、そのままコピーしないでください。

幸いにも、もっと簡単なデータを取得する方法があります。の方が高速です。移植性は低いですが、ptraceコードを書いている場合は、通常は気にしません。

トレーサスレッドは、ファイル/proc/pid/mem、pidは、もちろん、debugeeの数値です)を開くことができます。 pidのptracerだけがそのファイルを開くことができます。

ファイルが開かれたら、希望のアドレスのオフセットでpread(2)を取得し、debugeeのアドレススペースから直接データを取得できます。 readインターフェイスは4バイトに限定されていないため、文字列の長さを推測し、そのバイト数を読み込み、NULLを終了して正確な文字列を知ることができます。

システムコールが少ないため、この方法は簡単ではなく、はるかに高速です。

関連する問題