优化大地址空间的循环

时间:2017-01-27 15:48:20

标签: c++ optimization remote-debugging

我正在尝试调试进程的虚拟内存,这需要我在其虚拟内存中搜索一系列已知和常量字节,但是由于偏移量一直在动态变化,我必须迭代整个地址空间找到我需要的字节。目前我有这些循环,但是它们需要很长时间才能平均运行~15-30秒才能完成。

BYTE target[15] = { 0xFG, 0x93, 0x32, 0x1A, 0xB0, 0x9F, 0xC7, 0x00, 0x11, 0x00,
                        0x3F, 0x01, 0x00, 0x00, 0x00 };
    BYTE buff[15];
    int count = 0;
    DWORD target_addr = 0;
    for (DWORD i = 0x401000; i <= 0x2000000; i++)
    {
        count = 0;
        ReadProcessMemory(procName, (LPCVOID)i, (LPVOID)buff, 15, &real);
        for (int j = 0; j < 15; j++)
        {
            if (target[j] == buff[j])
                count++;
            else
                break;
        }
        if (count == 15)
        {
            target_addr = i;
            break;
        }
    }

我怎样才能大大加快这个过程?

这是我第一次使用低级内存函数和Windows的调试API,所以我可能会错过一个更好的方法。

1 个答案:

答案 0 :(得分:0)

我想你在i开始的每次迭代中读取15个字节,如果内存不相等,你会从i+1开始读取以下15个字节,因此你不需要计数您可能知道其他14个字节的相等性。如果你向后看15个字节,你可以知道,如果缓冲区不相等,那么k最后一个字节是否相等,这允许直接前进15-k个字节并且不验证{{ 1}}以下迭代中的第一个字节。

我没有测试下面的代码,但我认为有了这个一般的想法,它将允许更快的步骤。

k