2013-07-31 14 views
5

WinAPI ReadProcessMemory() bir oyundan bazı "gizli" bilgileri okumak için kullanıyorum.".exe" + ofsetinden okuma belleği?

Statik işaretçiyi bulmak için Cheat Engine'i kullandım, ancak bunlardan nasıl okunacağımı bilmiyorum. Ben ReadProcessMemory() ile okuyabilen bir adrese "mygame.exe"+1C50 dönüştürebilirim nasıl WinAPI gerçekten yeniyim "mygame.exe"+1C50

: Hile Motor bana böyle bir şey için bir işaretçi verir?

DÜZENLEME: Sorunu basitleştirmeyi denedim, ama sanırım ilk başta tam kodu vermeliydim. Bu yüzden burada statik adresler ve çok seviyeli işaretçilerle çalışıyorum, ancak hala temel adresi veya w/e'yi alıyorum.

İşte tam kodu ve a picture of my cheat engine address var:

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

Düzenleme 2: İşte benim nuke değerini okuma çalıştı nasıl, ama, rasgele sayılar Ben oyunu yeniden farklı her zaman bana verir (bazen) ... vb, bazen 0, 324324324 var:

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

"game.dll" in temel adresini bulmanız ve ardından 1C50 kodunu eklemeniz gerekir. –

cevap

6

ofset baz almaktadır genellikle bellekte modülün başlangıç, bunu elde edebilirsiniz GetModuleHandle ile (bu adres, bellekte PE'nin başlangıcıdır). Genel olarak diyorum ki, bazı sözleşmeler, üssü kod bölümünün başlangıcına göre tanımlar, ki bu da PE'den okumanız gerekir.

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

süreç size, (dll enjeksiyon yoluyla) hedefleyen bir uzaktan kumandası ile bunu yapmak adres alanında çalıştırıyorsanız yukarıdaki çalışır: aşağıdaki gibi bir şey yapabilirsiniz

Süreç (örneğinizin gösterdiği gibi), ilgilendiğiniz modüle ilişkin geçerli bir tanıtıcı elde etmek için modülleri işlemek için numaralandırmanız gerekir.

MSDN, bunun bir örneğini here, bununla ilgili bir bit isime karşı kontrol eder ve eşleşirse HMODULE'u döndürür, bu size t o modülün temel adresi.

+0

Çalışmıyor, sadece bana bazı garip eşek numaraları veriyor, doğru adresleri değil:/Sorguyu düzenledim, zaten imzam var “.exe” statik işaretçisi var –

+0

@SkamahOne adresinin CE dosyalarının göreli veya kod bölümü olup olmadığını kontrol ettiniz mi? bağıl? ve "tuhaf" sayılar tam olarak nedir? – Necrolis

+0

Hayır, bunu nasıl kontrol ederim ...? Ben "mygame.exe" + 1C50' değeriyle bir işaretçiyim, bu da başka bir adrese işaret ediyor, "diğer adres" i almaya çalışıyorum. Ve sadece bazı büyük tamsayılar, '17512325403' vb –