私はWinAPIのReadProcessMemory()
を使用して、ゲームからいくつかの「隠された」情報を読み取っています。".exe" +オフセットからメモリを読み込んでいますか?
私は、静的ポインタを見つけるためにチートエンジンを使用しましたが、私はそれらから読み込む方法がわかりません。私は私がReadProcessMemory()
で読むことができますアドレスに"mygame.exe"+1C50
を変換しないか、WinAPIのには本当に新しいです"mygame.exe"+1C50
: チートエンジンはこのような何かに私にポインタを与えますか?
編集:私は問題を単純化しようとしましたが、私は最初に完全なコードを与えておくべきだったと思います。 私はここで静的アドレスとマルチレベルポインタで作業していますが、まだベースアドレスまたはw/eを取得することに固執しています。
#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:ここでは
は完全なコードとa picture of my cheat engine addressです ここで私は(ゲームを再起動するたびに、私は私の核兵器の値を読み取るしようとした方法ですが、それは私に乱数を与え、異なります時にはそれが)...など、時々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;
}
"game.dll"のベースアドレスを探して、1C50を追加する必要があります。 –