我看到/proc/self/maps在 Linux 机器上检查可以让我看到已映射的页面。因此,我可以编写一个程序来读取和解析它已映射的页面。
如何为 Windows 做类似的事情?是否有相同的 API?如果没有,您对如何做到这一点有什么建议吗?你有任何可以链接到我的参考资料吗?
我看到/proc/self/maps在 Linux 机器上检查可以让我看到已映射的页面。因此,我可以编写一个程序来读取和解析它已映射的页面。
如何为 Windows 做类似的事情?是否有相同的 API?如果没有,您对如何做到这一点有什么建议吗?你有任何可以链接到我的参考资料吗?
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--- !---