在外部存储器上进行模式扫描时,您应该一次读取一个区域。应使用 VirtualQueryEx() 检索区域和大小。您还应该过滤掉不是 MEM_COMMIT 或 PAGE_NOACCESS 区域的区域。
下面是一个逻辑示例:
char* buffer{ nullptr };
char* addr{ nullptr };
char* match{ nullptr };
SIZE_T bytesRead;
MEMORY_BASIC_INFORMATION mbi{ 0 };
while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
{
delete[] buffer;
buffer = new char[mbi.RegionSize];
ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);
char* internalAddr = Compare(pattern, mask, buffer, bytesRead);
if (internalAddr != nullptr)
{
//calculate from internal relative buffer to external absolute
match = mbi.BaseAddress + (internalAddr - buffer);
break;
}
}
addr += mbi.RegionSize;
}
return match;
这个过程通常需要不到 2 秒,即使在非常大的过程中也不应该超过 10 秒。