ReadProcessMemory找到一个模式 - 粒度?

时间:2013-01-04 12:13:11

标签: c++ windows memory pattern-matching readprocessmemory

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

我的意思是:ReadProcessMemory(each_byte)听起来耗费了大量时间,而ReadProcessMemory(all_the_process_memory)的声音空间非常昂贵。是否有最佳权衡或更好的方法来设置读数的粒度?

1 个答案:

答案 0 :(得分:0)

在外部存储器上进行图案扫描时,应一次读取一个区域。区域和大小应通过使用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秒。