1

数日前、私は PE フォーマットで遊び始めました。仮想アドレスに従ってセクションをメモリにロードできる小さな PE ローダーを作成しました。たとえば.text、 virtual address に関する0x1000セクション、または.dataに関するセクションがあり0x2000ます。私の小さなアセンブリ コードを使用して、空き場所 ( 0x10000) に PE ファイルをロードし、その位置から PE セクションをロードしました。したがって、セクション.text0x11000( 0x10000 + 0x1000)に.dataあり0x12000ます。インターネットで、画像の種類ごとに固有の画像ベースのようなものを見つけました...しかし、どのようにロードできるかわかりません.code0x402000.exe0x402000たとえば、Windowsで実行されている実行可能ファイルがたくさんある場合。なぜそうなのか、どのように機能し、非常に基本的なシステムに理論的に実装するにはどうすればよいですか?

助けてください。

4

3 に答える 3

3

各実行可能ファイルは、独自の仮想アドレス空間で実行されます。したがって、2つの実行可能ファイルが0x400000の同じイメージベースを持っている場合でも、それらは異なる物理メモリを常駐/使用します。イメージベースのベースが異なると考えてください。

実行中のプロセスにロードされたモジュールのイメージベースを取得するには、GetModuleHandleを使用できます。ちなみに画像ベースと等しいハンドルをモジュールに返します。または、PEヘッダーのIMAGE_OPTIONAL_HEADER構造のImageBaseフィールドから画像ベースを取得することもできます(ここを参照)。

于 2013-03-10T16:49:12.613 に答える
3

仮想メモリとは、各プロセスのアドレス空間が独立しているため、コンピューター上のすべてのプロセスが「同じ」アドレスを使用できることを意味します。プロセス A の 0x400000は、OS によって、プロセス B の 0x400000 とは異なる物理アドレスにマップされます。それらが同じ仮想アドレス (異なる仮想アドレス空間) であってもです。

実行可能ファイルのデフォルトのベース アドレスは 0x400000 です。リンカーはそのベース アドレスを実行可能ファイルにハードコードし、アドレス参照を適切に調整します。プログラムの起動時に、実行可能ファイルがそのアドレスにロードされます。アセンブラまたはリンカは、このデフォルトのベース アドレスを変更する方法を提供する必要があります。

一方、DLL は同じプロセスに共存する必要があるため、一意のアドレスにロードする必要があることに注意してください。このため、DLL は通常再配置可能です。つまり、一意のアドレスに配置するという要件に対処するために、ロード時に任意のベース アドレスを持つことができます。(システムに複数の再配置不可能な DLL があると問題が発生する可能性がありますが、システムに複数の再配置不可能な .exe があってもまったく問題ありません。)

于 2013-03-10T16:37:09.130 に答える
1

これは複雑な問題ですが、仮想メモリとハードウェアを利用したプロセスの分離により、すべてのプロセスがロードされ、それ自体にアドレス空間全体があるという印象を与えられます。したがって、仮想メモリ内のアドレスはメモリのどこにでもマップでき、プロセスには、それに関する限り無限のメモリがあるため、すべてのイメージベースを同じアドレスから開始できます。

于 2013-03-10T16:38:21.297 に答える