找出程序中分配内存的最佳方法是使用调试器。每个加载的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