我看到在Linux机器上检查/proc/self/maps可以看到已映射的页面。结果,我可以编写一个程序来读取和解析已映射的页面。

如何去关于Windows做类似的事情?是否有相同的API?如果没有,您对此有什么建议吗?您有什么可以链接我的参考文献吗?

评论

sysinternal工具中的vmmap.exe可以执行此操作。但是,我不知道它使用哪些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---  !---