2012-09-25 10 views
5

LoadLibraryでプラグインを読み込む作業プログラムがあります。Windowsで動的にロードされるライブラリのアドレス範囲

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

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でも、それはanother questionです)。

私が必要とする情報は、Sysinternalsユーティリティlistdllsが報告している情報なので、実装方法を調べようとしました。 NtQueryInformationProcessを使用してPEB構造を検索してLDR_DATA_TABLE_ENTRYにリンクしているsuggestionを見ました。有望に見えますが、

  • DllBaseは、各DLLの開始アドレス(それですか?)ですが、サイズがないように見えます。
  • NtQueryInformationProcessのドキュメントでは、ポータブルではないとマークしていますが、私がしようとしていることの代替案はありません。
  • 私のシステムでは、PEBの唯一のフィールドはBeingDebuggedSessionIdであり、一部にはReservedNバイトの配列です。良い記号ではありません。

プラグインのアドレス範囲を列挙するか、ポインタがプラグイン内にあるかどうかをテストする方法、またはポインタがどのプラグインにポイントしているかを調べる方法はありますか?

答えて

4

GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESSフラグは、どのモジュールがポインタを指しているかを示します。そこから、モジュールヘッダーを調べてどのセクションを調べることができます。しかし、全体の運動は面白いにおいがする。なぜあなたはポインタが指し示すプラグインを気にしますか?

関連する問題