プロセスアドレス空間でのDLLの読み込みに関する質問

dll portable-executable
プロセスアドレス空間でのDLLの読み込みに関する質問

さて、次のようなポータブル実行可能(PE)ファイルに関するMatt Pietrekの記事をいくつか読みました。

さらに、このテーマに関する他のいくつかの情報源を読みました。 いくつかの部分を見落としているか、質問に答えられていないかのどちらかです。

そこで、質問は次のとおりです。

EXEを読み込むとき、WindowsローダーはインポートされたDLLのリストをImporta Address Table(IAT)から読み取り、それらをプロセスのアドレス空間に読み込むことが知られています。

  1. プロセスのアドレス空間は仮想空間です。 DLLは既にある可能性があります
    いくつかの物理空間にロードされます。 これは、「KERNEL32.dll」や「USER32.dll」などのDLLで発生します。 物理アドレスと仮想アドレスの関係は何ですか? ローダーはページを割り当ててDLLをコピーするだけですか、それとも参照を作成しますか?

  2. DLLがロードされていない場合、ローダーはDLL全体をロードしますか、または単に
    必要な機能は? たとえば、 bar.dll`の関数 foo() を使用した場合、ローダーは bar.dll`全体をプロセスのアドレス空間にロードしますか? または、 `foo`のコードをプロセスのアドレス空間にロードするだけですか?

  3. EXEファイルが USER32.DLL`の関数 MessageBox() を使用すると仮定します。
    これは、 `%WINDIR%\ system32 \ user32.dll`にあります。 カスタマイズされた `USER32.DLL`を開発し、EXEファイルと同じディレクトリに配置し、カスタマイズされた
    MessageBox`がシステムのデフォルトの `MessageBox`の代わりにアプリによって呼び出されることを期待できますか?

  3  3


ベストアンサー

再1:物理アドレスは何の役割も果たさず、ここに含まれるすべてが仮想メモリです。 物理アドレスは、ページフォールトによってトリガーされる仮想メモリページがRAMにマップされるときにのみ確立されます。 多くの基本DLLは、kernel32.dllなどの複数のプロセスの同じ仮想メモリアドレスに表示されます。 プロセスは、コードの同じページを共有するだけです(データではありません)。

日時2:実際の「ロード」は行われません。使用される機能は、メモリマップファイルをサポートする機能と同じです。 これらのページの裏付けは、ページングファイルではなく、DLLファイル自体です。 ページフォールトによってWindowsがファイルからRAMにページを読み取るように強制されるまで、何も読み込まれません。 ただし、はい、DLLのコードセクション全体がマップされます。

日時3:はい、それは動作します。 しかし、プログラムが使用するuser32エクスポート_all_の代替関数を作成する必要があるため、実際に動作させることはほとんど不可能です。 他のWin32関数が使用するものを含めて、あなたは知ることができません。 APIフッキングは使用される典型的な手法であり、Microsoft LabsのDetoursは優れた手法です。

Windows Internals Edition 5は、配管の詳細を学ぶための優れた本です。

5


1)新しいプロセスを作成すると、NTカーネルローダーはプロセスにスペースを割り当て、指定された場所にすべてのPEセクションをマップします。 次に、NTローダーはインポートテーブルを調べ、DLLをプロセスメモリにロードし、必要に応じてポインターを修正します(再配置と呼ばれます)。

2)ローダーは、プロセスアドレススペースにDLL全体をロードします。

3)はい、EXEが置かれているのと同じディレクトリの `user32.dll`を使用します。 http://msdn.microsoft.com/en-us/library/7d83bc18%28v=vs.80%29.aspx [このリンク]を参照してください。 しかし、 `user32.dll`にあるほとんどのWinAPI関数として、カスタムdllはそれらの多くをエクスポートする必要があります。

2


タイトルとURLをコピーしました