如何在流程中获取所有可读内存的范围?
VirtualQuery只允许我一次查询页面。
答案 0 :(得分:1)
无法获取可读页面列表。您需要使用VirtualQuery迭代所有内存(从包含有效内存的最低地址开始)。您可以从MEMORY-BASIC_INFORMATION结构中读取RegionSize,以了解要调用的基址。
答案 1 :(得分:0)
执行此操作的唯一方法是遍历每个内存区域。
此代码将执行此操作,并输出每个区域的开始和结束地址:
MEMORY_BASIC_INFORMATION meminfo;
unsigned char* addr = 0;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
MEMORY_BASIC_INFORMATION mbi;
while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
{
std::cout << "base : 0x" << std::hex << mbi.BaseAddress << " end : 0x" << std::hex << (uintptr_t)mbi.BaseAddress + mbi.RegionSize << "\n";
}
addr += mbi.RegionSize;
}