/proc/self/maps
可以看到已映射的页面。结果,我可以编写一个程序来读取和解析已映射的页面。如何去关于Windows做类似的事情?是否有相同的API?如果没有,您对此有什么建议吗?您有什么可以链接我的参考文献吗?
#1 楼
VirtualQueryEx()使用有关包含查询地址的连续页面范围的信息填充MEMORY_BASIC_INFORMATION记录。从0开始,然后使用mbi.BaseAddress + mbi.RegionSize作为要查询的下一个地址,可以使用它遍历进程的地址空间。 GetMappedFileName()可以为您提供映射二进制文件(mbi.Type == MEM_IMAGE)和映射文件(MEM_MAPPED)的名称。当32位进程在64位计算机上运行查询时,地址溢出是一个问题位过程;在这种情况下,VirtualQueryEx()似乎无法失败,而是使有问题的字段饱和(通过将其设置为0xFFFFFFFF)。但是,这没有记录,因此不可靠。替代测试是
mbi.RegionSize > DWORD_PTR(-1) - mbi.BaseAddress
或迭代时的next_va <= curr_va
。32位进程查询64位notepad.exe的结果:
00000000 10000 -
00010000 00010000 10000 c m rw-- rw--
...
FF5F0000 FF5F0000 1000 c i rwxc r--- notepad.exe
FF5F0000 FF5F1000 B000 c i rwxc r-x-
FF5F0000 FF5FC000 4000 c i rwxc r---
FF5F0000 FF600000 2000 c i rwxc rw--
FF5F0000 FF602000 1000 c i rwxc rw-c
FF5F0000 FF603000 22000 c i rwxc r---
FF625000 FFFFFFFF -
overflow -> aborting
Dito对于64位进程:
0000000000000 10000 -
0000000010000 0000000010000 10000 c m rw-- rw--
...
00000FF5F0000 00000FF5F0000 1000 c i rwxc r--- notepad.exe
00000FF5F0000 00000FF5F1000 B000 c i rwxc r-x-
00000FF5F0000 00000FF5FC000 4000 c i rwxc r---
00000FF5F0000 00000FF600000 2000 c i rwxc rw--
00000FF5F0000 00000FF602000 1000 c i rwxc rw-c
00000FF5F0000 00000FF603000 22000 c i rwxc r---
00000FF625000 7FDFB2CB000 -
007FEFA8F0000 007FEFA8F0000 1000 c i rwxc r--- winspool.drv
...
007FFFFFE0000 007FFFFFE0000 10000 r r--- !---
评论
sysinternal工具中的vmmap.exe可以执行此操作。但是,我不知道它使用哪些API。