簡體   English   中英

如何在另一個過程存儲器中掃描INT值

[英]How do I scan for an INT value in another process 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...";
}

如您所見,我將一個整數MyMoney和MyMoneyReal。 然后,我從程序存儲器中的0掃描到0x7FFFFFFF,以查找包含MyMoneyReal的所有地址。 這需要很長時間才能完成,我敢肯定還有更好的方法,但是我不知道如何做到。

我應該補充:我是C ++的新手,所以任何額外的幫助總是很不錯的:)

您的循環調用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM