C ++从指针获取地址

时间:2016-11-21 16:31:47

标签: c++ memory

我试图理解C ++在内存中读/写的方式。 我所拥有的是,我试图从指针中获取一个地址。我有指针指向我想要的地址。 就像我有想要用来读取值的当前地址一样,让我们​​说地址是 14C9862 但是每当我再次运行程序时,这个地址就会改变。我有指向该地址的指针(我使用作弊引擎)并且指示指针等于 eax + ePSXE.exe + A82020 ,如 eax = 77420 < / strong>和 ePSXE.exe = 1718 (忽略零),所以我怎么能用C ++写这个,每次我再次运行程序时都能得到ADDRESS。

当前代码:

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

正如我现在想的那样LPBYTE是指向一个字节的指针,所以不能像 (A82020*)???? 我只是疯了我不会#&## 39;不知道怎么做。

1 个答案:

答案 0 :(得分: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);