0

特定の値に達したときに単一の静的メモリ アドレスを変更するためのフックの信頼性はどの程度ですか?

私が慣れているのは、基本的な C++ アプリケーションから読み取り/書き込みメモリを使用することですが、1 秒あたり 1000 回以上変化するアドレスでは信頼できない場合があります。多くの場合、私のアプリケーションは、ケース関数を使用してアドレスの値を別の値に変更するのに十分な時間内にキャッチできません。このフックの概念はどのように正確に機能し、値の変更を見逃すことはありますか? Win7 Ultを使用しています。x86

4

2 に答える 2

2

(関係があると思っていた質問に対する回答を再利用しましたが、そうではなかったことが判明しました。)

変数がいつ変更されたかを検出する環境固有の方法があります。MMU アクセス制御フラグを (mprotect または VirtualProtect 経由で) 使用して、最初の書き込みで例外を生成し、ハンドラー内からダーティ フラグを設定できます。(最近のほぼすべての OS は、ディスクに書き戻す必要があるかどうかを調べるために、メモリ マップト ファイルでこれを行います)。または、ハードウェア ブレークポイントを使用して、そのアドレスへの書き込みを一致させることができます (デバッガーはこれを使用して、変数にブレークポイントを実装します)。

于 2013-03-20T04:28:24.367 に答える
0

フッキングはさまざまな方法で行うことができます。ほとんどの場合、ReadProcessMemory を廃止するコードをターゲット プロセス内に配置する必要があります (ポインターを使用してそれらを逆参照するだけです)。フックしたい場合は、次のように実行できます。そのアドレスにどの命令が書き込まれるかを調べます (デバッガーのメモリ ブレークポイント)。これは関数である可能性が高いため、私が通常行うことは、最初の近くにいくつかのバイトをパッチすることです。関数が呼び出されるたびに実行されるコードに実行フローをリダイレクトするには、スタック上の戻りアドレスを変更して、戻り値を調べて制御し、実行したいコードを実行できるようにすることもあります関数が終了した後 (たとえば、スタックから情報を取得するのは、それを格納するために使用される構造を掘り下げるのが面倒だったり、

于 2013-03-20T13:21:06.943 に答える