5

でプラグインをロードする作業プログラムがありますLoadLibrary

新しい要件: コードのある時点でポインターが与えられ、このポインターがプラグインのコードまたは静的データを指しているかどうかをテストする必要があります。

bool is_pointer_into_plugin(void *p, HMODULE h);

同様に、ポインターが指しているプラ​​グインがある場合は、それを取得する必要があります。また、ポインタがメイン プログラムのコードまたは静的データを指しているかどうかを知る必要があります (理想的には、読み取り専用領域と読み書き可能領域を区別します)。

HMODULE plugin_containing_pointer(void *p);

同様に、プラグインがマップされている範囲 (アドレスとサイズ) を取得できる必要があります。メインプログラムにもこの情報が必要です。

is_pointer_into_plugin、またはplugin_containing_pointer、または同等のものをどのように実装できますか?

必要に応じて通話を変更できますLoadLibrary。ルックアップは可能な限り高速である必要がありますが、ロード時のコードは高速である必要はありません。プラグインを別々のプロセスで実行し、共有メモリを介して通信することはオプションではありません。プログラムは Windows XP 以降 (および Linux ですが、それは別の問題です) で実行する必要があります。

必要な情報は多かれ少なかれ Sysinternals ユーティリティlistdllsが報告するものなので、それがどのように実装されているかを調べてみました。にリンクする構造を取得するために を使用するという提案を見ました。有望に見えますが:NtQueryInformationProcessPEBLDR_DATA_TABLE_ENTRY

  • DllBase各 DLL の開始アドレスのように見えるa が表示されますが (そうですか?)、サイズはありません。
  • のドキュメントはNtQueryInformationProcessそれを移植不能とマークしていますが、私がやろうとしていることの代替案を示唆していません。
  • 私のシステムでは、 と のフィールドPEBBeingDebuggedSessionId、さらにいくつかのバイト配列だけです。これは良い兆候ではありません。ReservedN

プラグインのアドレス範囲を列挙したり、ポインターがプラグイン内にあるかどうかをテストしたり、ポインターが指しているプラ​​グインを特定したりするにはどうすればよいですか?

4

1 に答える 1

4

GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESSフラグを使用すると、ポインターがどのモジュールを指しているかがわかります。そこから、モジュール ヘッダーを調べて、どのセクションかを判断できます。しかし、演習全体が変なにおいがします。ポインターがどのプラグインを指すかを気にするのはなぜですか?

于 2012-09-26T00:15:42.727 に答える