[英]How can I read process memory in chunks and scan for exact address of Values?
我在 C++ 中编写了一个简单的 memory 扫描仪,但是速度很慢,有人说读取 memory 的块会加快速度,但是我如何获得每个正确的地址?
这是一个示例源代码:
#include <iostream>
#include <Windows.h>
#include <string>
#define CHUNK_SIZE 0x80000
#define MAX_ADDRESS 0x7ffffff
using namespace std;
int main()
{
DWORD pid;
char buffer[CHUNK_SIZE];
std::cin >> pid;
int something;
int someValue = 0;
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
SIZE_T numberRead;
if (process)
printf("opened process.\n");
else
printf("could not open process.\n");
for (DWORD i = 0; i < MAX_ADDRESS; i += CHUNK_SIZE) {
if (ReadProcessMemory(process, (void*)i, &buffer, sizeof(buffer),
&numberRead)) {
for (int j = 0; j < sizeof(buffer); j++)
{
someValue = (int)buffer[i];
if (someValue == 220)
{
printf("found value %d at 0x%x.\n", someValue, i + j);
}
}
}
}
}
最好使用 VirtualQueryEx 循环遍历所有有效的 memory 并避免在无效的 memory 上调用 ReadProcessMemory
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);
for (int j = 0; j < bytesRead; j++)
{
if ((int)buffer[j] == 220)
{
printf("found value %d at 0x%x.\n", someValue, mbi.BaseAddress + j);
}
}
}
}
addr += mbi.RegionSize;
}
return match;
请记住,这将返回 memory 的区域,其中两个变量的部分组合时与 integer 表示中的值具有相同的位。 这意味着您可能会得到误报
#define CHUNK_SIZE 0x1
for (DWORD i = 0x000000; i < MAX_ADDRESS; i += CHUNK_SIZE) {
ReadProcessMemory(process, (void*)i, &buffer, sizeof(CHUNK_SIZE), 0);
for (int j = 0; j < CHUNK_SIZE; j++)
{
if (buffer[j] == value)
{
count++;
printf("found value %d at 0x%x.\n", buffer[j], i + j);
//fprintf(f, "0x%x\n", i + j);
printCheatTable(f,i + j,count);
results[k] = i + j;
k++;
}
}
}
这段代码一定有问题。 基本上我想将一大块 memory 读入 ReadProcessMemory。
之前的代码有一些修改,即“results[k]”数组和function printCheatTable,但对代码来说并不重要。 另一个变化是“CHUNK_SIZE”现在是“0x1”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.