ReadProcessMemory找到一个模式粒度



我需要在另一个进程的内存中找到一个模式,我使用ReadProcessMemory。由于我使用像rabin karp或类似的算法(模式匹配),并且由于ReadProcessMemory将内存(ram -> ram)复制到缓冲区,因此涉及一些轻微的开销。我想知道每次读取的最佳内存量是多少才能完成我的任务

我的意思是:ReadProcessMemory(each_byte)听起来很费时间,ReadProcessMemory(all_the_process_memory)听起来很费空间。是否存在最佳的权衡或更好的方法来设置读数的粒度?

在对外部内存进行模式扫描时,应该一次读取一个区域。应该使用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秒。

最新更新