/proc/self/maps 在 Windows 上等效

逆向工程 视窗 linux 虚拟内存
2021-06-21 04:37:11

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

如何为 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---  !---