2016-11-21 102 views
3

我想了解C++在內存中讀取/寫入的方式。 我所擁有的是,我試圖從一個指針得到一個地址。我有指針指向我想要的地址。 就像我有我想用來讀取值的當前地址一樣,假設地址是14C9862但是由於每次我再次運行程序時,此地址都會改變。我有寫到這個地址的指針(我正在使用作弊引擎),它說這個指針等於eax + ePSXE.exe + A82020至於eax = 77420ePSXE.exe = 1718(忽略零),所以我怎麼能用C++編寫這個程序,以便我可以在每次再次運行程序時都能得到ADDRESS。C++獲取指針的地址

當前代碼:

int readTest {}  
ReadProcessMemory(handle, (LPBYTE*)ePSXe+pointer?, &readTest, sizeof(readTest), 0); 
     std::cout << readTest << std::endl; 

正如我在想,現在LPBYTE是一個指向一個字節所以可能不是像(A82020*)????我只是要瘋了,我不知道該怎麼去做吧。

回答

0

如果知道ePSXE.exe模塊的基地址,看起來您的目標地址可以計算出來。

#include <windows.h> 
#include <TlHelp32.h> 

DWORD procId = 0; // <-- Replace with real process ID 
MODULEENTRY32 lpModuleEntry = {0}; 
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId); 
if(!hSnapShot) 
{ 
    return NULL; 
} 

DWORD baseAddress = 0; 
lpModuleEntry.dwSize = sizeof(lpModuleEntry); 
BOOL bModule = Module32First(hSnapShot, &lpModuleEntry); 
while(bModule) 
{ 
    if(!strcmp(lpModuleEntry.szModule, "ePSXE.exe")) 
    { 
    CloseHandle(hSnapShot); 
    baseAddress = reinterpret_cast<DWORD>(lpModuleEntry.modBaseAddr); 
    } 
    bModule = Module32Next(hSnapShot, &lpModuleEntry); 
} 
CloseHandle(hSnapShot); 

最後,您需要地址的靜態部分與模塊基址相結合:

你可以利用下面的代碼得到它

ReadProcessMemory(handle, reinterpret_cast<LPVOID>(baseAddress + 0xA82020), &readTest, sizeof(readTest), NULL); 
+0

是不是應該lpModuleEntry.szModule是一個const char而不是WCHAR? Visual給我一個錯誤 –

+0

@MatthewSouza實際上,它是'TCHAR',當你的項目配置爲Unicode字符集時,它是'wchar_t'。上面的代碼沒有經過測試,它應該讓你知道如何處理地址。 – Nikita

+0

謝謝你的回覆確實是正確的,它的工作!但是如果沒有EAX值,它會給出另一個地址的隨機數字。我不知道你寫的一半是什麼東西,但我會很努力地研究它。感謝您的答覆! –