2013-07-31 5 views
5

Sto usando WinAPI ReadProcessMemory() per leggere alcune informazioni "nascoste" da un gioco.Memoria di lettura da ".exe" + offset?

Ho usato Cheat Engine per trovare i puntatori statici, ma non so come leggerli. Cheat Engine mi dà un puntatore a qualcosa di simile: "mygame.exe"+1C50

Sono veramente nuovo per WinAPI, come faccio a convertire "mygame.exe"+1C50 a un indirizzo che posso leggere con ReadProcessMemory()?

MODIFICA: Ho provato a semplificare il problema, ma suppongo che avrei dovuto fornire il codice completo in primo luogo. Quindi sto lavorando con indirizzi statici e puntatori multi livello qui, ma sono ancora bloccato con ottenere l'indirizzo di base o w/e.

Ecco il codice completo e a picture of my cheat engine address:

#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: Ecco come ho provato a leggere il valore della mia Nuke, ma mi dà numeri casuali, diverso ogni volta che ricomincio il gioco (a volte è 0, a volte 324324324, ecc ...):

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; 
} 
+0

È necessario individuare l'indirizzo di base di "game.dll", quindi aggiungere 1C50. –

risposta

6

la base di offset è generalmente l'inizio del modulo di memoria, è possibile ottenere questo con GetModuleHandle (l'indirizzo che restituisce è l'inizio del PE in memoria). Dico generalmente perché alcune convenzioni definiscono la base relativa all'inizio della sezione del codice, che è quindi necessario leggere dal PE.

si può fare qualcosa come il seguente:

UINT_PTR addr = (UINT_PTR)GetModuleHandle("game.dll") + 0x1C50; 
ReadProcessMemory(hProc,(void*)addr,pBuffer,nSize,&BytesRead); 

È possibile che questo funziona solo se si esegue nello spazio di indirizzi del processo ci si rivolge (via dll injection), per fare questo tramite un telecomando processo (come mostra il tuo esempio) devi enumerare per elaborare i moduli per ottenere un handle valido per il modulo che ti interessa.

MSDN ha un esempio di quello here, refactoring un po ', è possibile creare una funzione che controlla il nome e restituisce il HMODULE se corrisponde, la trasmissione di questo ti darà t lui indirizzo di base del modulo.

+0

Non funziona, mi dà solo dei numeri strani, non gli indirizzi corretti:/Ho modificato la domanda, ho già il puntatore statico '.exe' –

+0

@SkamahOne hai controllato se i rapporti CE degli indirizzi sono relativi al file o alla sezione del codice parente? e quali sono esattamente i numeri "strani"? – Necrolis

+0

No, come posso controllare che ...? Ho un puntatore con valore di "" mygame.exe "+ 1C50' che punta a un altro indirizzo, sto cercando di ottenere" l'altro indirizzo ". E solo alcuni enormi numeri interi, 17512325403' ecc. –