0

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

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

4

1 回答 1

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 秒。

于 2020-04-20T00:17:32.647 回答