如何在另一个进程内存中扫描INT值

时间:2017-02-26 02:31:31

标签: c++ windows virtual-memory

我一直试图找到一种在特定值(int)上扫描另一个程序内存的好方法。我现在所做的工作确实有效,但我确信有更好的方式和更快的方式。

DWORD pid;
DWORD Money = 0x04661128; //Address of money in-game
int MyMoney;
int MyMoneyReal;

int main()
{
    HWND hWnd = FindWindowA(0, ("Euro Truck Simulator 2"));
    GetWindowThreadProcessId(hWnd, &pid);
    HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    cout << "Please input your exact current money value!" << pid << endl;
    cin >> MyMoneyReal;
    for (int i = 0; i < 0x7FFFFFFF; i++) {
        ReadProcessMemory(pHandle, (LPVOID)i, &MyMoney, sizeof(MyMoney), 0);
        if (MyMoney == MyMoneyReal) {
            cout << "Found a match: " << MyMoney << MyMoneyReal << " With HEX value: " << hex << i << endl;
        }
    }
    cout << "Processing...";
}

所以你可以看到,我创建了一个int MyMoney和MyMoneyReal。然后我继续在程序存储器中从0扫描到0x7FFFFFFF以查找包含MyMoneyReal的所有addressess。 这需要很长时间才能完成,我确信有更好的方法,但我不知道如何。

我应该补充一点:我对C ++很新,所以任何额外的帮助总是很好:)

1 个答案:

答案 0 :(得分:1)

你的循环调用ReadProcessMemory 2147483647次。

每次调用它都必须验证内存是否可读,然后将sizeof(int)个字节复制到缓冲区中。它有它的成本......

您可以阅读例如1MB的内存块,因此您对ReadProcessMemory的呼叫次数减少。然后,您可以像现在一样在本地处理每个块。简化版:

constexpr unsigned CHUNK_SIZE = 0x100000;
constexpr unsigned MAX_ADDRESS = 0x7FFFFFFF;
//remember to make sure stack is big enough or allocate it on heap
char buffer[CHUNK_SIZE];

for (unsigned i = 0; i < MAX_ADDRESS; i += CHUNK_SIZE) {
    if (ReadProcessMemory(hProcess, (LPVOID)i, buffer, sizeof(buffer), nullptr)) {
        for (int j = 0; j <= CHUNK_SIZE - sizeof(int); ++j) {
            int something;
            memcpy(&something, buffer + j, sizeof(int));
            //...
        }
    }
}

正如您在内部for中所看到的,我们读到CHUNK_SIZE - sizeof(int),因为我们不想读取缓冲区的末尾。但是我的示例中的外部循环没有正确处理它,我们跳过一些字节。它很容易修复,我把它留给你。

当然你的缓冲区可以更大/更小。你必须尝试衡量。

注意:这仍然是很多操作。我们只是将通话数限制为可能很昂贵的ReadProcessMemory。您应该尝试限制地址范围。我很确定大多数对ReadProcessMemory的调用都失败了。正如评论中所建议的那样,一个是使用VirtualQueryEx