2013-11-23 74 views
0
tibiaWindow = FindWindow(L"TibiaClient", NULL); 

    DWORD PID; 
    GetWindowThreadProcessId(tibiaWindow, &PID); 

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); //Open Process for Read/Write 
    short mana = 0; 
    void* ptr = (void*)hProcess+0x3C2D00; 
    if(!ReadProcessMemory(hProcess, ptr, &mana, 2, 0)){ 
     return false; 
    } 
    else{ 
     statusBar()->showMessage(QString::number(mana), 3000); 
    } 

    return true; 

這應該是讀取位於tibia.exe + 0x3CD2D00的遊戲的法力值。但它不起作用。誰能幫我?我如何獲得該窗口的基址?exe的基地址?

+1

定義「不起作用」,如果您遇到了看不見的錯誤,您需要檢查返回碼。 –

+1

PID是否有效?流程句柄是否有效?你的抵消是否有效?遊戲是否有反熱?不工作是不是很豐富。 – user2176127

+2

'hProcess'是一個進程**'HANDLE' **。解釋爲指向進程基址的指針相當有創意。當然不是你想要的。 – IInspectable

回答

5

要獲得另一個進程中的模塊的基本地址需要兩個步驟:

  1. 檢索所有模塊處理加載到使用EnumProcessModules過程。
  2. 迭代模塊句柄列表並使用GetModuleFileNameExGetModuleBaseName查詢模塊名稱,直至找到匹配項。

從步驟2獲得的模塊句柄是查詢過程地址空間中模塊的基地址。

您發佈的偏移(0x3CD2D00)可能不是實際的圖像的一部分tibia.exe。這意味着該模塊的大小至少爲63MB,這聽起來不對。它可能駐留在一些其他模塊的靜態數據中,或者可能位於堆內存中,使得您提出的方法無用。

+0

+1。很好的答案。 – Xearinox