2017-02-26 21 views
0

我一直在试图找到一种很好的方式来扫描另一个程序内存上的特定值(int)。我现在所做的工作,但我相信有更好的方式和方式更快的方式。如何在另一个进程内存中扫描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的所有地址。 这需要很长时间才能完成,我相信有更好的方法,但我不知道如何。

我要补充:我是很新的C++所以任何额外的帮助总是好的:)

+1

是的,这很慢。阅读更大的内存块,然后解析它。 – OldProgrammer

+1

您可以使用VirtualQueryEx找出正在使用哪些内存部分,这也将为您节省大量时间。 –

回答

0

你的循环调用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

+0

如何从中获取内存的值? –

+0

@PauldeKoning将'i'视为基点,将'j'视为偏移量。所以'我+ j' – mpiatek

+0

可以downvoter解释为什么? – mpiatek