Използвам ReadProcessMemory()
на WinAPI, за да прочета малко "скрита" информация от игра.
Използвах Cheat Engine, за да открия статичните указатели, но не знам как да чета от тях. Cheat Engine ми дава насока към нещо подобно: "mygame.exe"+1C50
Наистина съм нов в WinAPI, как да конвертирам "mygame.exe"+1C50
в адрес, който мога да прочета с ReadProcessMemory()
?
РЕДАКТИРАНЕ: Опитах се да опростя проблема, но предполагам, че трябваше просто да дам пълния код на първо място. Така че работя със статични адреси и многостепенни указатели тук, но все още съм заседнал с получаването на основния адрес или w/e.
Ето пълния код и снимка на моя адрес на cheat engine:
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
HANDLE GetProcessHandle(const char *procName);
int main()
{
const char *procName = "prism3d.exe";
HANDLE hProc = GetProcessHandle(procName);
if (hProc) {
/* This works if I use the dynamic address (f.e. 0x02C2C4DC),
but it changes every time I restart the game.
I need to use the static address (prism3d.exe+A1C) to get
the dynamic address for my "nuke".
*/
float nuke;
ReadProcessMemory(hProc, (void*)0x02C2C4DC, &nuke, 4, 0);
cout << nuke;
}
CloseHandle(hProc);
return 0;
}
HANDLE GetProcessHandle(const char *procName)
{
HANDLE hProc = NULL;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe32)) {
do {
if (!strcmp(pe32.szExeFile, procName)) {
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
return hProc;
}
Редактиране 2: Ето как се опитах да прочета стойността на моя nuke, но ми дава произволни числа, различни всеки път, когато рестартирам играта (понякога е 0
, понякога 324324324
и т.н...):
if (hProc) [
DWORD baseAddr = (DWORD)GetModuleHandle(procName) + 0xA1C50; // also tried this with GetModuleHandle(NULL)
DWORD mainAddr;
ReadProcessMemory(hProc, (void*)(baseAddr + 0x111C), &mainAddr, 4, 0);
// Nuke
float nuke;
DWORD nukeAddr;
ReadProcessMemory(hProc, (void*)(mainAddr + 0x48), &nukeAddr, 4, 0);
ReadProcessMemory(hProc, (void*)nukeAddr, &nuke, 4, 0);
cout << nuke;
}