Windows では、関数EnumProcessModulesが、指定されたプロセス用にロードされた多数のモジュールを返すことがわかります (これらの一部は、guard32.dll、version.dll などのシステム dll である必要があります)。
私の質問は: これらのモジュールはプロセスの仮想空間にマップされていますか? メイン アプリ コードから、これらのモジュールの 1 つにある命令にジャンプできますか (もちろん、アドレスはわかっています)。
Windows では、関数EnumProcessModulesが、指定されたプロセス用にロードされた多数のモジュールを返すことがわかります (これらの一部は、guard32.dll、version.dll などのシステム dll である必要があります)。
私の質問は: これらのモジュールはプロセスの仮想空間にマップされていますか? メイン アプリ コードから、これらのモジュールの 1 つにある命令にジャンプできますか (もちろん、アドレスはわかっています)。
はい、DLL はプロセスの仮想アドレス空間にマップする必要があります。そのページのコードが実行されていない場合、マッピングは実際の物理ページによってサポートされない場合があります。もちろん、コードを適切に実行するための適切な初期化またはセットアップなしでコードの「ランダムな」ビットを実行します (たとえば、処理関数の呼び出し別の関数に割り当てる必要があるデータを使用する) は、明らかに悪い定義で終わります。また、同じコードを実行するたびに異なるアドレスに DLL がロードされる可能性があることにも注意してください。そのため、DLL のアドレスが一定であることに依存することはできません。別のマシンでは完全に異なる可能性があります。 .
はい、独自の実行可能ファイルから直接呼び出すことができる DLL コードはすべて、プロセス空間にマップする必要があります。SysInternal の VMMap ユーティリティを使用して、プロセスの仮想メモリ空間の正確なグラフを取得できます: http://technet.microsoft.com/en-us/sysinternals/dd535533
他の回答で述べたように、仮想アドレス空間は、完全ではないにしても大部分が動的です。
特定の共有ライブラリがプロセスから直接アクセスできない場合があります。これらは通常、サンドボックス化された (保護された) カーネルまたはドライバー ライブラリであり、パラメーターの検証を実行し、別の仮想プロセス アドレス空間へのリング/コンテキスト スイッチを実行する特別な安全なレイヤー/API を介して呼び出されるか、安全なプロセス経由でコマンドを渡します。スレッド間通信キュー。これらはコストのかかる操作であるため、通常、システムの安定性にメリットがある場合にのみ使用するために予約されています。
GetProcAddress
はい、から取得したモジュールを使用して呼び出すだけですEnumProcessModules
。GetProcAddress
モジュール内の関数オフセットを計算します。