2010-01-25 38 views
2

我一直很好奇用於瞭解Windows中正在運行的進程的佈局(段)的任何工具?

  1. 過程如何在內存中查找?
  2. 它有哪些不同的細分(部分)?
  3. 程序(在磁盤上)&進程(在內存中)究竟有什麼關係?

我剛纔的問題:more info on Memory layout of an executable program (process)

在我的追求,我終於找到了答案。我發現,清除了絕大部分我查詢的這個優秀的文章:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html

在上面的文章中,作者展示瞭如何獲取進程(LINUX)的不同區段&他與其對應的ELF文件進行比較。我在此處引用此部分:

Courious看到 過程段的真實佈局?我們可以使用 /proc // maps文件來揭示它。 是我們 想要觀察的過程的PID。在我們繼續前,我們 這裏有一個小問題。我們的測試 程序運行速度非常快,以至於在我們甚至可以轉儲相關的 /proc條目之前它會結束 。我使用gdb來解決這個問題。 在調用 return()之前,您可以使用另一個技巧,如 插入sleep()。

在一個控制檯(或終端仿真 如xterm)做:

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

就在這裏舉行,打開另一個控制檯 並找出程序 「測試」 的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)問

所以,在總,我們看到12段(也稱爲虛擬內存區域 - VMA)。

但我想知道關於Windows進程&的PE文件格式。

  1. 任何用於獲取Windows中運行進程的佈局(段)的工具?
  2. 其他有關此主題的更多優秀資源?

編輯:

有什麼好看的文章,顯示PE文件sections & VA segments之間的映射?

回答

2

在運行過程中運行WinDbg中的「!地址」。你會看到每個虛擬內存段都有一些分類 - 圖像,內存映射文件,堆棧,堆,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" 
+0

真棒!這是我正在尋找的。單日就解決了很多謎團。 :) – claws 2010-01-25 18:34:36

+1

是否有任何好的文章,你知道哪些顯示我在PE文件節和VA節之間映射? – claws 2010-01-26 04:14:44

1

另一個虛擬內存觀衆VMValidator 。內存佈局的可視化數據,以及內存頁面和內存段落中的數據。

至於PE文件的佈局,我推薦書第Expert .Net 2.0 IL Assembler,第4章。它主要針對一個託管(.Net)PE文件而不是本地文件,但它確實描述了它的全部佈局。

然後,如果你想看到一些讀取PE文件的源代碼(C++),你應該看看PE File Format DLL。還有一個GUI,向您展示如何使用該DLL。源的許可證是開源的,不受GPL的限制。

編輯:另一本書推薦將由David A Solomon和Mark E Russinovitch的Inside Microsoft Windows 2000 (3rd Edition)(編寫VMMap的人在不同的答案中提到)。本書包含有關內存管理權限的章節,從頁表格佈局到更宏觀的內存管理,另一章內容涉及與進程,線程和相關數據結構有關的各種問題。

關於PE佈局和虛擬地址佈局,將DLL加載到由VirtualAlloc()分配的段落邊界(x86上64K)的內存區域中。根據每個部分在PE文件中的描述方式(只讀,讀/執行,讀/寫)等,設置各種頁面(x86上的4K,x64上的8K)的內存保護。因此,知道PE文件格式很有用,這就是我提到它的原因。

如果您打算嘗試修改DLL或執行檢測,則有一個工具可讓您輕鬆查看DLL內容,這非常有用。因此鏈接到PE文件格式DLL。它也是從您自己的特定要求開始的好基礎。

+0

你的意思是「Expert .NET 2.0 IL Assembler」(http://www.amazon.com/dp/1590596463)書?如果是,請將鏈接添加到書中。它只是避免了可能的混淆。 – claws 2010-03-31 17:03:44

+0

+1另外,我不想要PE文件的佈局。我想要PE文件段和它的進程的'Segments'之間的映射。實際上,對於ELF文件,在ELF本身中有一個「程序頭表」,它清楚地顯示了這個映射 – claws 2010-03-31 17:12:59

+0

我的意思是「專家...」,不知道我在寫帖子時錯過了什麼。我修改了帖子。 – 2010-03-31 17:26:35

相關問題