【问题标题】:Optimizing for loop over a large address space在大地址空间上优化 for 循环
【发布时间】:2017-01-27 15:48:19
【问题描述】:

我正在尝试调试进程的虚拟内存,这需要我在其虚拟内存中搜索一系列已知和恒定的字节,但是由于偏移量一直在动态变化,我必须遍历整个地址空间找到我需要的字节。目前我有这些循环,它们可以工作,但是它们平均需要很长时间才能运行约 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,所以我很可能会错过更好的方法。

【问题讨论】:

  • ReadProcessMemory 很慢,你试过一次读取超过 15 个字节吗?您还可以使用滑动窗口并比较双字而不是字节。
  • 您需要一个比 15 字节大得多的缓冲区,或者将进程的内存映射到您自己的内存中。另外,使用memmem() 进行搜索。最后,您没有检查块之间的潜在重叠。

标签: c++ optimization remote-debugging


【解决方案1】:

我假设您在每次迭代中从 i 开始读取 15 个字节,如果内存不相等,您将读取从 i+1 开始的接下来的 15 个字节,因此您不考虑以下事实:可能知道其他 14 个字节的相等性。如果向后看 15 个字节,您可以知道,如果缓冲区不相等,klast 字节是否相等,这允许直接向前步进 15-k 字节并且不验证 k 中的第一个字节下面的迭代。

我还没有测试过下面的代码,但我认为按照这个总体思路,它可以让步骤更快。

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

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 2015-04-15
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多