【发布时间】:2023-03-12 14:50:01
【问题描述】:
我正在尝试编写一个进程内存扫描程序来扫描内存中的非零值:
MEMORY_BASIC_INFORMATION mbi;
char* addr = 0;
dtype readVal = 0;
while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi))) { // HANDLE hProc is defined earlier
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS) {
for (int i = 0; i < mbi.RegionSize; i += sizeof(readVal)) {
BOOL ret = ReadProcessMemory(hProc, (char*) mbi.BaseAddress + i, &readVal, sizeof(readVal), 0);
printf("ReadProcessMemory returns %d\n", ret); // returns 5 (ERROR_ACCESS_DENIED)
if (readVal != 0) {
printf("Found a good value!");
system("pause");
}
}
}
addr += mbi.RegionSize;
}
我在chrome.exe 上尝试过,扫描仪发现了大量非零值。但是当我在带有反作弊功能的游戏进程上尝试它时,它无法工作,ReadProcessMemory 在每次调用ReadProcessMemory 时都会返回ERROR_ACCESS_DENIED。句柄hProc 连接到游戏进程没有问题,并且找到了正确的 PID。为什么会这样?我们如何增加绕过反作弊的特权?
【问题讨论】:
-
你只是问,因为你印象深刻,想自己做同样的事情,对吧?
-
readVal未初始化,在评估readVal之前,您没有检查ReadProcessMemory()的返回值是否成功,因此使用readVal的任何结果都是indeterminate. -
添加错误检查,让错误值告诉你问题所在
-
@RemyLebeau 假设
dtype是一个 POD(它可能是),这不是问题。 ReadProcess 应该写入/初始化它,所以只要ReadProcess成功,从readVal读取就不是未定义的。 -
@sba 有问题的代码从不评估从特定内存位置读取是否安全。因此,结果总是未定义。代码有可能不会失败的事实并不意味着代码没有被破坏。正是由于 Remy 指出的原因,它被破坏了。
标签: c++ winapi readprocessmemory