2016-03-08 52 views
-3

問了一個問題Call CloseHandle on handle that is a function parameter?編輯的代碼有問題

人編輯的代碼後,我更新了它發現代碼不再按預期工作。

intptr_t readMem(HANDLE processHandle, intptr_t address, int sizeToReadBytes) 
{ 
    intptr_t memValue = 0; 

    bool success = ReadProcessMemory(processHandle, (LPVOID)address, memValue, sizeToReadBytes, NULL); 
    if (!success) 
     std::wcout << "Memory read failed on address: " << std::hex << address << "\n"; 

    return memValue; 
} 

在線路

ReadProcessMemory(processHandle, (LPVOID)address, memValue, sizeToReadBytes, NULL); 

memValue不會沒有(LPVOID)(LPCVOID)石膏編譯,但是與它們的代碼不再讀取存儲器(或在的情況下,寫入使用的功能WriteProcessMemory

最初(現在我已經改變了它在我的小程序中)它使用參考&memValue和工作正常。我的問題是:

應該這樣工作嗎? 或者是編輯正確,我的程序的其餘部分可能是錯誤的?

如果需要,我可以提供更多的代碼,只是不知道哪些位,並不想堵塞屏幕比我更...還應該回滾編輯?

+0

寫道:或 '(LPCVOID)' 時,它的唯一 '(LPVOID)' 這...這在'WriteProcessMemory'函數中... –

+1

*「和我的程序的其餘部分可能是錯誤的嗎?」* - 如果你不得不問,答案是平常的ly:是的,可能。您正在使用一種超越您的頭腦的API。如果投射具有挑戰性,那麼你不應該在運行過程中閱讀記憶。試着寫一個掃雷遊戲,看看它是如何工作的。你以後可以回來作弊。通常比學習打球更困難。計劃投資5年,如果這是你的最終目標。 – IInspectable

+1

不,代碼在你的最後一個問題中也是錯誤的 –

回答

0

ReadProcessMemory()的第三個參數是函數將讀取數據寫入的調用過程中的內存地址。雖然你沒有傳遞內存地址。在原始問題的第三個修訂版本中顯示的代碼中,您將未初始化的整數變量的鍵入到內存指針中。所以函數會嘗試寫入隨機存儲器。現在你已經刪除了類型轉換,所以代碼甚至不應該再編譯了。您的readMem()功能設計不正確。你需要這樣或者改變它:

  1. 呼叫者分配所需大小的存儲器中,然後該函數簡單地填充內存:

    bool readMem(HANDLE processHandle, intptr_t address, void *memValue, int sizeToReadBytes) 
    { 
        bool success = ReadProcessMemory(processHandle, (LPVOID)address, memValue, sizeToReadBytes, NULL); 
        if (!success) 
        std::wcout << "Memory read failed on address: " << std::hex << address << "\n"; 
        return success; 
    } 
    

    intptr_t memValue = 0; 
    readMem(processHandle, address, &memValue, sizeof(memValue)); 
    
  2. 功能分配內存並將其返回給調用者:

    void* readMem(HANDLE processHandle, intptr_t address, int sizeToReadBytes) 
    { 
        uint8_t memValue = new uint8_t[sizeToReadBytes]; 
        bool success = ReadProcessMemory(processHandle, (LPVOID)address, memValue, sizeToReadBytes, NULL); 
        if (!success) { 
        std::wcout << "Memory read failed on address: " << std::hex << address << "\n"; 
        delete [] memValue; 
        memValue = NULL; 
        } 
        return memValue; 
    } 
    

    intptr_t *memValue = (intptr_t*) readMem(processHandle, address, sizeof(intptr_t)); 
    ... 
    delete [] memValue; 
    

    或者:

    bool readMem(HANDLE processHandle, intptr_t address, int sizeToReadBytes, std:vector<uint8_t> &memValue) 
    { 
        memValue.resize(sizeToReadBytes); 
        bool success = ReadProcessMemory(processHandle, (LPVOID)address, &memValue[0], sizeToReadBytes, NULL); 
        if (!success) 
        std::wcout << "Memory read failed on address: " << std::hex << address << "\n"; 
        return success; 
    } 
    

    std::vector<uint8_t> buffer; 
    readMem(processHandle, address, sizeof(intptr_t), buffer); 
    intptr_t memValue = (intptr_t*) &buffer[0]; 
    
+0

我懷疑該函數實際上是要返回指定地址的整數值。這使'sizeToReadBytes'參數變得毫無意義,但可以解釋OP爲什麼認爲該函數正在工作(如第一次修訂所示)。 :-) –