2016-11-21 322 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值,它会给出另一个地址的随机数字。我不知道你写的一半是什么东西,但我会很努力地研究它。感谢您的答复! –