私はmprotect
、プログラムのほとんどのメモリへのアクセスを削除するために使用するメモリ追跡ライブラリと、プログラムがページにアクセスしたときに個々のページへのアクセスを復元するためのSIGSEGVハンドラーに取り組んでいます。これはほとんどの場合うまく機能します。
私の問題は、私のライブラリがアクセスをマークしていないメモリを使用してプログラムがシステムコール(たとえばread
)を呼び出すと、システムコールは-1を返し、に設定errno
することEFAULT
です。これにより、テスト対象のプログラムの動作が奇妙な方法で変更されます。システムコールが実際にカーネルに送られる前に、システムコールに与えられたメモリの各ページへのアクセスを復元できるようにしたいと思います。
私の現在のアプローチは、メモリにアクセスする各システムコールのラッパーを作成することです。各ラッパーは、実際のシステムコールに渡す前に、与えられたすべてのメモリにアクセスします。これは、プログラムから直接行われた呼び出しでは機能するようですが、libcで行われた呼び出しでは機能しないようです(たとえば、ラッパーを使用せずに直接fread
呼び出します)。read
より良いアプローチはありますか?どうすればこの振る舞いを得ることができますか?