【发布时间】: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