私はプログラムメモリの特定の読み取り専用部分にアクセスするときにイベントをトリガしてキャプチャする方法を探しています。具体的には、多くの定数値(読み取り専用)を含むプログラムメモリセクションがあり、これらの値のいずれかにアクセスしたときにイベントハンドラがいくつかの処理(ある種の処理)を実行できるイベントをキャプチャしたい場合は拡張)追加して拡張値を返します。だからいくつかの質問があります。
- 可能ですか?
- それでは、どうすればこれを行うことができますか?
- (他のプロセスのメモリにアクセスせずに)どのような権限が必要ですか?
- 利用可能な技術に関する文書はありますか?
アップデート1:
ここでより多くの情報がありますが、まだ具体的な内容を見つけようとしています。
私が望むのは、プログラムでまたはコンパイル/リンク中にアクセスしたときに作成したイベントハンドラを呼び出し、許可するイベントを発生させるメモリ領域(おそらくページ以上)を表示することです。イベントを引き起こす問題を「修正」し、アクセスしようとした値を返します。目標は、実行中のコードを持つことを可能にすることであり、問題のメモリにアクセスしようとすると、イベントハンドラが呼び出され、アクセスを解決し、元のコードに戻ってアクセスを修正/修正することができます。元のコードは変更されません。 printf形式の文字列を考えてみましょう。イベントを呼び出し、フォーマット文字列を調整または置換できるようにしたいと思います。printfコードは楽しい方法で進行し続けます。
馬になる?
答え1
はい
おそらく、リンカスクリプトを使用して変数を別のメモリページに配置できます。
mprotect
ページをとして表示するために使用されますno access
。 SIGSEGVのハンドラを設定するには、sigaction
関連するアドレスに関する情報を取得できるようにSA_SIGINFOを指定します。特別な権限は必要ありません。
これは何度も行われた。もともとBourneシェルはメモリ処理のためにSIGSEGVをキャプチャしましたが、これはsigactionが登場する前でした。ハンドラでは、問題を解決して返すために必要なすべての操作を実行できます。通常、これにはアクセスパターンと生成された機械語コードの理解が必要です。