これは重複した質問である可能性があります。Windows プロセスのメモリ マップがどのように見えるか知りたいですか? 詳細を探しています。ブログ、記事、その他の関連文献へのリンクを提供してください。
1 に答える
理論を読むだけでなく、実際に物事を見ることができるようになることを常に望んでいます。このブログ投稿によると、windbg を使用してプログラムを開くと、実行されていない場合でも、アドレス空間にマップされているかのようにマップされることが判明しました。したがって、逆アセンブリ ウィンドウは比喩的に (これらの正確なアドレスにコードをロードするとは限りません)、コードに関してそれらのアドレスにあるものを示します。
もちろん、ASLR のおかげでこれらのアドレスを保証することはできませんが、アイデアが得られ、考えさせられます: メモリ アドレスも単なるコードです。コードとメモリは、ほとんどの最新のコンピューターが実装しているフォン ノイマンアーキテクチャに従って、同じ (仮想) 空間に格納されます。残念ながら、スタックやヒープなどがないため、それらを移動して見ることはできません。
Microsoft のこのブログ投稿では、仮想アドレス空間の概要を説明しています。ご覧のとおり、半分はオペレーティング システムで使用するために予約されており、残りの半分は自分が持っているもの (コード、malloc
呼び出し、スタック割り当てなど) で埋めることができます。
ユーザー側でアドレス空間がどのように機能するかという点で、この図は理解に役立ちました。これは、さまざまな可能なマップに関する一連の適切なリンクを提供するこの質問にリンクされています。ただし、メモリ内のレイアウトはパーツによって異なることに注意してください。
覚えておくべき重要な点は、プログラム、データ、スタック、ヒープ、カーネルのすべてが、実際のメモリ アドレスに変換される場合と変換されない場合がありますが、1 つの大きな一連のメモリ アドレスであるということです。
作業中に、実行可能ファイルがディスク上でどのように表示されるかにも関心があるかもしれません。この記事とこの記事では、特にPE ファイル形式の詳細な分析を提供します。後者の記事には、データがどのように mmap されるかを大まかに示す小さな図もあります。