2013-07-31 23 views
5

Tôi đang sử dụng số ReadProcessMemory() của WinAPI để đọc một số thông tin "ẩn" từ trò chơi.Đọc bộ nhớ từ ".exe" + offset?

Tôi đã sử dụng Công cụ cheat để tìm ra các con trỏ tĩnh, nhưng tôi không biết cách đọc từ chúng. Cheat Engine mang lại cho tôi một con trỏ đến một cái gì đó như thế này: "mygame.exe"+1C50

Tôi thực sự mới để WinAPI, làm thế nào để chuyển đổi "mygame.exe"+1C50 đến một địa chỉ mà tôi có thể đọc với ReadProcessMemory()?

CHỈNH SỬA: Tôi đã thử đơn giản hóa vấn đề, nhưng tôi đoán tôi nên đã chỉ đưa ra mã đầy đủ ngay từ đầu. Vì vậy, tôi đang làm việc với các địa chỉ tĩnh và các con trỏ đa cấp ở đây, nhưng tôi vẫn bị mắc kẹt với việc lấy địa chỉ cơ sở hoặc w/e.

Dưới đây là toàn bộ mã và 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; 
} 

Chỉnh sửa 2: Đây là cách tôi cố gắng đọc giá trị của nuke của tôi, nhưng nó mang lại cho tôi số ngẫu nhiên, khác nhau mỗi khi tôi khởi động lại trò chơi (đôi khi nó 0, đôi khi 324324324, vv ...):

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

Bạn cần xác định địa chỉ cơ sở của "game.dll", sau đó thêm 1C50. –

Trả lời

6

các cơ sở bù đắp thường khi bắt đầu các module trong bộ nhớ, bạn có thể có được điều này với GetModuleHandle (địa chỉ này trả về là khởi đầu của PE trong bộ nhớ). Tôi nói chung bởi vì một số quy ước xác định cơ sở liên quan đến sự bắt đầu của phần mã, mà sau đó bạn cần phải đọc từ PE.

bạn có thể làm một cái gì đó như sau:

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

Trên đây chỉ hoạt động nếu bạn đang chạy trong không gian địa chỉ của quá trình bạn đang nhắm mục tiêu (thông qua tiêm dll), để làm được điều này thông qua một điều khiển từ xa quá trình (như ví dụ của bạn cho thấy) bạn cần liệt kê để xử lý các mô-đun để có được một xử lý hợp lệ cho mô-đun mà bạn quan tâm.

MSDN có một ví dụ là here, bạn có thể tạo một hàm kiểm tra tên và trả lại HMODULE nếu nó khớp, việc truyền này sẽ cung cấp cho bạn địa chỉ cơ sở mô-đun của anh ấy.

+0

Không hoạt động, nó chỉ cho tôi một số con số lạ, không phải là địa chỉ chính xác:/Tôi đã chỉnh sửa câu hỏi, tôi đã có con trỏ tĩnh '.exe' –

+0

@SkamahOne bạn đã kiểm tra xem báo cáo CE địa chỉ có liên quan đến tệp hay phần mã hay không quan hệ? và chính xác những con số "kỳ lạ" là gì? – Necrolis

+0

Không, làm cách nào để kiểm tra ...? Tôi có một con trỏ với giá trị của '" mygame.exe "+ 1C50' trỏ đến một địa chỉ khác, tôi đang cố gắng để có được" địa chỉ khác ". Và chỉ một số số nguyên lớn, '17512325403', v.v. –

Các vấn đề liên quan