3

私はいつも興味がありました

  1. プロセスはメモリ内でどの程度正確に見えますか?
  2. その中の異なるセグメント(パーツ)は何ですか?
  3. プログラム(ディスク上)とプロセス(メモリ内)はどの程度正確に関連していますか?

私の前の質問:実行可能プログラム(プロセス)のメモリレイアウトに関する詳細

私の探求において、私はついに答えを見つけました。私のクエリのほとんどをクリアしたこの優れた記事を見つけました:http ://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html

上記の記事では、作成者はプロセスのさまざまなセグメント(LINUX)を取得する方法を示し、対応するELFファイルと比較します。私はここでこのセクションを引用しています:

プロセスセグメントの実際のレイアウトを知りたいですか?/ proc//mapsファイルを使用してそれを明らかにすることができます。観察したいプロセスのPIDです。先に進む前に、ここで小さな問題があります。テストプログラムは非常に高速に実行されるため、関連する/procエントリをダンプする前に終了します。これを解決するためにgdbを使用します。return()を呼び出す前にsleep()を挿入するなど、別のトリックを使用できます。

コンソール(またはxtermなどのターミナルエミュレーター)では、次のようにします。

$ gdb test
(gdb) b main
Breakpoint 1 at 0x8048376
(gdb) r
Breakpoint 1, 0x08048376 in main ()

ここを押したまま、別のコンソールを開いて、プログラム「test」のPIDを見つけます。簡単な方法が必要な場合は、次のように入力します。

$ cat /proc/`pgrep test`/maps

以下のような出力が表示されます(異なる出力が得られる場合があります)。

[1]  0039d000-003b2000 r-xp 00000000 16:41 1080084  /lib/ld-2.3.3.so
[2]  003b2000-003b3000 r--p 00014000 16:41 1080084  /lib/ld-2.3.3.so
[3]  003b3000-003b4000 rw-p 00015000 16:41 1080084  /lib/ld-2.3.3.so
[4]  003b6000-004cb000 r-xp 00000000 16:41 1080085  /lib/tls/libc-2.3.3.so
[5]  004cb000-004cd000 r--p 00115000 16:41 1080085  /lib/tls/libc-2.3.3.so
[6]  004cd000-004cf000 rw-p 00117000 16:41 1080085  /lib/tls/libc-2.3.3.so
[7]  004cf000-004d1000 rw-p 004cf000 00:00 0
[8]  08048000-08049000 r-xp 00000000 16:06 66970    /tmp/test
[9]  08049000-0804a000 rw-p 00000000 16:06 66970    /tmp/test
[10] b7fec000-b7fed000 rw-p b7fec000 00:00 0
[11] bffeb000-c0000000 rw-p bffeb000 00:00 0
[12] ffffe000-fffff000 ---p 00000000 00:00 0

注:参照として各行に番号を追加します。

gdbに戻り、次のように入力します。

(gdb)q

したがって、合計で12のセグメント(仮想メモリ領域--VMAとも呼ばれます)が表示されます。

しかし、私はWindowsプロセスとPEファイル形式について知りたいです。

  1. Windowsで実行中のプロセスのレイアウト(セグメント)を取得するためのツールはありますか?
  2. このテーマについてさらに学ぶための他の良いリソースはありますか?

編集:

PEファイルsectionsとVAの間のマッピングを示す良い記事はありますsegmentsか?

4

3 に答える 3

5

Sysinternals VMMapは、プロセスのVAスペースを視覚化するための優れたツールでもあります。

VMMapスクリーンショット
(ソース:microsoft.com

于 2010-01-25T22:20:14.967 に答える
2

実行中のプロセスでWinDbgで「!address」を実行します。プロセス内のすべての仮想メモリセグメントが、イメージ、メモリマップトファイル、スタック、ヒープ、PEB、TEBなどの分類で表示されます。

Windows Internalsは、このようなことについて常に良いリファレンスです。

メモ帳の最初のいくつかのエントリは次のとおりです。

        BaseAddress      EndAddress+1        RegionSize     Type       State                 Protect             Usage
----------------------------------------------------------------------------------------------------------------------
*        0`00000000        0`00be0000        0`00be0000             MEM_FREE    PAGE_NOACCESS                      Free 
*        0`00be0000        0`00bf0000        0`00010000 MEM_MAPPED  MEM_COMMIT  PAGE_READWRITE                     MemoryMappedFile "PageFile"
*        0`00bf0000        0`00bf7000        0`00007000 MEM_MAPPED  MEM_COMMIT  PAGE_READONLY                      MemoryMappedFile "PageFile"
*        0`00bf7000        0`00c00000        0`00009000             MEM_FREE    PAGE_NOACCESS                      Free 
*        0`00c00000        0`00c03000        0`00003000 MEM_MAPPED  MEM_COMMIT  PAGE_READONLY                      MemoryMappedFile "PageFile"
*        0`00c03000        0`00c10000        0`0000d000             MEM_FREE    PAGE_NOACCESS                      Free 
*        0`00c10000        0`00c12000        0`00002000 MEM_MAPPED  MEM_COMMIT  PAGE_READONLY                      MemoryMappedFile "PageFile"
*        0`00c12000        0`00c20000        0`0000e000             MEM_FREE    PAGE_NOACCESS                      Free 
*        0`00c20000        0`00c21000        0`00001000 MEM_PRIVATE MEM_COMMIT  PAGE_READWRITE                     <unclassified> 
*        0`00c21000        0`00c30000        0`0000f000             MEM_FREE    PAGE_NOACCESS                      Free 
*        0`00c30000        0`00c97000        0`00067000 MEM_MAPPED  MEM_COMMIT  PAGE_READONLY                      MemoryMappedFile "\Device\HarddiskVolume2\Windows\System32\locale.nls"
于 2010-01-25T18:27:42.227 に答える
1

もう1つの仮想メモリビューアはVMValidatorです。メモリレイアウトのビジュアルデータに加えて、メモリページとメモリ段落のデータ。

PEファイルのレイアウトについては、Expert .Net 2.0 ILアセンブラーの第4章をお勧めします。ネイティブファイルではなく、主にマネージド(.Net)PEファイルを対象としていますが、すべてのレイアウトについて説明しています。

次に、PEファイルを読み取るソースコード(C ++)を確認したい場合は、PEファイル形式DLLを確認する必要があります。DLLの使用方法を示すGUIもあります。ソースのライセンスはオープンソースであり、GPLによって制限されていません。

編集:別の本の推奨事項は、DavidASolomonとMarkERussinovitch(別の回答で言及されているVMMapを書いた人)によるInside Microsoft Windows 2000(3rd Edition)です。この本には、ページテーブルレイアウトからよりマクロスケールのメモリ管理に至るまでのメモリ管理に関するセクションと、プロセス、スレッド、および関連するデータ構造に関連するさまざまな問題に関する別の章があります。

PEレイアウトと仮想アドレスレイアウトに関して、DLLは、VirtualAlloc()によって割り当てられた段落境界(x86では64K)にあるメモリ領域にロードされます。この中のさまざまなページ(x86では4K、x64では8K)のメモリ保護は、PEファイルでの各セクションの記述方法(読み取り専用、読み取り/実行、読み取り/書き込み)などに応じて設定されます。したがって、PEを知ることができます。ファイルレイアウトは便利なので、私はそれについて言及しました。

DLLの変更やインストルメンテーションの実行を計画している場合は、DLLの内容を簡単に表示できるツールがあると非常に便利です。したがって、PEファイル形式DLLへのリンク。それはまたあなた自身の特定の要件のために始めるのに良い基盤です。

于 2010-03-31T12:18:54.773 に答える