18

Linux (または Solaris) では/proc/self/maps、メモリ内の 1 つ以上のアドレスに格納されているものを読み取り、書き込み、または実行できるかどうかを判断するために、手動で繰り返し解析するよりも良い方法はありますか?

たとえば、Windows ではVirtualQuery.

Linux では、mprotectこれらの値を変更できますが、読み戻すことはできません。

さらに、これらのアクセス許可がいつ変更されたかを知る方法はありますか (たとえば、誰かがmmap私の背後にあるファイルを使用したとき)、非常に侵襲的なことを行いptrace、プロセス内のすべてのスレッドで使用しsyscall、メモリに影響を与える可能性のある.地図?

アップデート:

残念ながら、私はこれを JIT 内で使用しています。この JIT は、実行中のコードに関する情報がほとんどなく、定数の近似値を取得しています。はい、Linux で使用される vsyscall ページのように、変更可能なデータの定数マップを保持できることを認識しています。最初の解析に含まれていないものは変更可能で危険であるという仮定に安全に戻ることができますが、そのオプションに完全に満足しているわけではありません

今私がしていることは/proc/self/maps、特定のアドレスの保護をバイナリ検索できる構造を読んで構築することです。私の構造にないページについて何かを知る必要があるときはいつでも /proc/self/maps 、それがその間に追加されていると仮定して読み直します。

テキストを解析してこの情報を取得し、それがいつ変更されるかを知らないのは、非常に厄介なようです。(/dev/inotifyのほとんど何も動作しません/proc)

4

2 に答える 2

6

VirtualQueryLinuxに相当するものはわかりません。ただし、機能する場合と機能しない場合がある他の方法は次のとおりです。

  • SIGBUS/SIGSEGV をトラップするシグナル ハンドラーをセットアップし、読み取りまたは書き込みを続行します。メモリが保護されている場合、シグナル トラップ コードが呼び出されます。そうでない場合、シグナル トラップ コードは呼び出されません。いずれにせよ、あなたは勝ちます。

  • 呼び出すたびに追跡mprotectして、対応するデータ構造を構築することができます。これは、領域が読み取りまたは書き込み保護されているかどうかを知るのに役立ちます。これは、 を使用するすべてのコードにアクセスできる場合に適していますmprotect

  • mprotect関数を再定義するライブラリにコードをリンクすることにより、プロセス内のすべての呼び出しを監視できますmprotect。次に、領域が読み取りまたは書き込み保護されているかどうかを知るために必要なデータ構造を構築し、mprotect実際に保護を設定するためにシステムを呼び出すことができます。

  • /dev/inotifyファイルを使用して変更を監視することを試みることができ/proc/self/mapsます。これはうまくいかないと思いますが、試してみる価値はあります。

于 2008-11-06T17:40:45.307 に答える
0

そこには /proc/[pid|self]/pagemap があり、カーネルにドキュメントがあり、ここに警告があります: https://lkml.org/lkml/2015/7/14/477 したがって、完全に無害というわけではありません.. .

于 2015-08-17T00:18:59.900 に答える