2017-05-22 13 views
0

ptraceは、エントリ/終了のシステムコール時にレジスタとメモリのデータを取得できます。しかし、もしlinux syscallハンドラがいくつかのメモリを変更した場合、スタック内のいくつかの場所が含まれています。どのメモリが変更されたかを知るにはどうすればいいですか?ptrace syscallで変更されたメモリを取得する

答えて

0

できません。たとえばstrace(これはptraceを使用します)はほとんどの(すべて?)システムコールのセマンティクスを認識し、変更されたメモリを表示できます。

たとえば、syscall-numberが0の場合、straceはread() -syscallが呼び出され、カーネルが2番目のパラメータで指定されたアドレスに書き込むことを認識します。そこに書き込まれたバイト数は、システムコールの戻り値と同じです。

ここでは、これらのメモリ位置の内容をPTRACE_PEEK*と読んで表示することができます。

しかし、未知のまたはそれほど厳密でないセマンティクス(例えば、提案されたシステムコールwrite_to_random_memory_location())を伴うカスタムシステムコールに関しては、 ptrace()で一般的に(カーネルからもユーザー空間からも)メモリの変更を判断することはできません。

達成する必要があるかどうかに応じて、一般的な解決策は、ある種の仮想化(たとえば、ユーザー空間でのvalgrindの使用)のみを利用し、すべてのメモリアクセスをシミュレート/監視することができます。

関連する問題