找出程序中分配內存的最佳方法是使用調試器。每個加載的DLL和可執行文件本身都有分配,並且它們全部分割虛擬內存。另外,使用C/C++庫和Windows API將會在您的應用程序中創建一個堆,至少會保留一大塊虛擬內存。
例如,你可以使用VirtualAlloc儲備了大量chunck虛擬內存在一個相對較小的項目,才發現,無論是的VirtualAlloc失敗,或者當它嘗試加載一個新的DLL應用程序後失敗(等)你也不能總是控制哪些DLL將被加載和在哪裏。許多A/V和其他產品將在開始時將DLL注入到所有正在運行的進程中。發生這種情況時,這些DLL通常會在加載地址上進行首次挑選 - 也就是說,它們的默認編譯/鏈接可能會被授予。在典型的32位Windows應用程序的可用2GB虛擬地址空間之外,如果DLL在該地址空間的中間加載,則可以獲得的最大單個分配/預留將少於1 GB。
如果你使用windbg,你可以看到哪些區域的內存被佔用,保留等等.lm命令將顯示所有DLL的負載地址以及EXE及其範圍。 !vadump命令將顯示進程使用的所有虛擬內存和頁面保護。頁面保護是對那裏有什麼的重要暗示。例如,在來自64位calc.exe進程的以下(部分)!vadump中,您將看到第一個區域只是一系列受保護的虛擬內存。 (除此之外,這使您無法在地址0處分配內存。)MEM_COMMIT表示內存由RAM或分頁文件支持。 PAGE_READWRITE可能是堆內存或加載模塊的數據段。 PAGE_READEXECUTE通常是加載的代碼,並且會顯示在由lm生成的列表中。 MEM_RESERVE意味着什麼呼籲的VirtualAlloc預留的內存區域,但它不是由虛擬內存管理器映射,等等......
0:004> !vadump
BaseAddress: 0000000000000000
RegionSize: 0000000000010000
State: 00010000 MEM_FREE
Protect: 00000001 PAGE_NOACCESS
BaseAddress: 0000000000010000
RegionSize: 0000000000010000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00040000 MEM_MAPPED
BaseAddress: 0000000000020000
RegionSize: 0000000000003000
State: 00001000 MEM_COMMIT
Protect: 00000002 PAGE_READONLY
Type: 00040000 MEM_MAPPED
我希望幫助解釋的事情。 Windbg是一款出色的工具,它有很多擴展功能可以幫助您找到使用內存的地方。
如果你真的只關心堆,看看堆!
Microsoft Security Essentials認爲原始問題中鏈接的「探查器」應用程序包含Win32.Bisar!rts木馬。 – 2012-03-13 20:43:05