2013-07-31 2 views
5

Я использую WinAPI's ReadProcessMemory(), чтобы прочитать «скрытую» информацию из игры.Чтение памяти из «.exe» + смещение?

Я использовал Cheat Engine, чтобы узнать статические указатели, но я не знаю, как их читать. Чит Engine дает мне указатель на что-то вроде этого: "mygame.exe"+1C50

Я действительно новичок в WinAPI, как преобразовать "mygame.exe"+1C50 на адрес, который я могу читать с ReadProcessMemory()?

EDIT: Я пробовал упростить проблему, но, я думаю, я должен был просто дать полный код в первую очередь. Итак, я работаю со статическими адресами и указателями на несколько уровней здесь, но я все еще придерживаюсь получения базового адреса или w/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: Вот как я пытался прочесть значение моей ядерной бомбы, но это дает мне случайные числа, различный каждый раз, когда я перезапустить игру (иногда это 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; 
} 
+0

Вам необходимо найти базовый адрес «game.dll», а затем добавить 1C50. –

ответ

6

Базовое смещение, как правило, начало модуля в памяти, вы можете получить это с GetModuleHandle (адрес, который возвращает это начало PE в памяти). Я говорю вообще, потому что некоторые соглашения определяют базу относительно начала раздела кода, которую затем вам нужно прочитать из PE.

вы можете сделать что-то такое, как:

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

выше работает только если вы работаете в адресном пространстве процесса вы ориентируетесь (с помощью инъекции длл), чтобы сделать это с помощью пульта дистанционного управления (как показывает ваш пример) вам необходимо перечислить модули процесса, чтобы получить действительный дескриптор интересующего модуля.

В MSDN есть пример этого here, реорганизуя его немного, вы можете создать функцию, которая проверяет имя и возвращает HMODULE, если он совпадает, приведение этого даст вам t его базовый адрес модуля.

+0

Не работает, это просто дает мне некоторые странные номера задницы, а не правильные адреса:/Я отредактировал вопрос, у меня уже есть статический указатель '.exe' –

+0

@SkamahOne вы проверили, является ли адрес CE-отчета файлом относительным или секцией кода относительный? и что конкретно представляют собой «странные» цифры? – Necrolis

+0

Нет, как я могу проверить, что ...? У меня есть указатель со значением '" mygame.exe "+ 1C50', который указывает на другой адрес, я пытаюсь получить« другой адрес ». И только некоторые огромные целые числа, '17512325403' и т. Д. –

Смежные вопросы