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
)