Lesen den Speicher aus “.exe" + offset?

Bin ich mit WinAPI ist ReadProcessMemory() zu Lesen, einige "versteckte" Informationen aus einem Spiel.

Ich habe Cheat Engine, um herauszufinden, die statische Zeiger, aber ich weiß nicht, wie zu Lesen, von Ihnen.
Cheat Engine gibt mir einen Zeiger auf so etwas wie dieses: "mygame.exe"+1C50

Ich bin wirklich neu auf WinAPI, wie konvertiere ich "mygame.exe"+1C50 an eine Adresse, die ich Lesen kann mit ReadProcessMemory()?

EDIT: ich habe versucht, die Vereinfachung des Problems, aber ich denke, ich sollte habe den vollständigen code in den ersten Platz.
Also ich arbeite mit statischen Adressen und multi-level-Zeiger hier, aber ich bin immer noch stecken mit immer die Basis-Adresse oder w/e.

Hier ist der vollständige code und ein Bild von meinem cheat engine Adresse:

#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;
}

Edit 2:
Hier ist, wie ich versuchte zu Lesen, den Wert meiner nuke, aber es gibt mir Zufallszahlen, verschiedene jedes mal wenn ich das Spiel neu starten (manchmal ist es 0 manchmal 324324324, etc...):

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;
}
Sie müssen suchen Sie die Basis-Adresse "game.dll" und dann fügen Sie 1C50.

InformationsquelleAutor Skamah One | 2013-07-31

Schreibe einen Kommentar