2015-04-29 3 views
0

им пытаются сделать приложение, которое отслеживает скорость персонажа в GTAV, внутривенно нашел адрес переменной с читов двигателя: http://i.stack.imgur.com/klyYV.pngКак использовать адрес памяти из чит-движка с помощью ReadProcessMemory?

и я сделал функцию, чтобы открыть дескриптор процесса игры:

/*returns INVALID_HANDLE_VALUE on failure*/ 
HANDLE openProcessByName(const char* name, DWORD access){ 
    PROCESSENTRY32 process; 
    process.dwSize = sizeof(PROCESSENTRY32); 

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if(Process32First(snapshot, &process) == FALSE){//failure 
     CloseHandle(snapshot); 
     return INVALID_HANDLE_VALUE; 
    } 

    while(Process32Next(snapshot, &process) == TRUE){//skips first but thats system anyway 
     if(_stricmp(process.szExeFile, name) == 0){//found it 
      HANDLE processHandle = OpenProcess(access, FALSE, process.th32ProcessID); 
      CloseHandle(snapshot); 
      return processHandle; 
     } 
    } 

    CloseHandle(snapshot); 
    return INVALID_HANDLE_VALUE;//reached if the process is not found and its handle not returned above 
} 

в основном я получить ручку и попытаться прочитать ячейку памяти так:

#include <tlhelp32.h> 
#include <iostream> 

HANDLE openProcessByName(const char* name, DWORD access); 

int main(){ 
    HANDLE processHandle = openProcessByName("GTA5.exe", PROCESS_VM_READ); 
    if (processHandle == INVALID_HANDLE_VALUE){ 
     std::cout << "invalid handle value" << std::endl; 
     return 0; 
    } 

    float speed = 0.00; 
    if (ReadProcessMemory(processHandle, (LPCVOID)0x7FF65EEA3940, &speed, (DWORD)sizeof(speed), NULL) == 0){ 
     std::cout << "failed to read value" << std::endl; 
     std::cout << GetLastError() << std::endl;//return 299 
    }else{ 
     std::cout << speed << std::endl; 
    } 

    CloseHandle(processHandle); 
    return 0; 
} 

но это не удается, и печатает «не удалось прочитать значение». im, предполагая, что это имеет какое-то отношение к смещению адреса, iv искал его, но я действительно не понимаю, о чем говорят люди. Кстати, место памяти не статично и меняется, когда игра перезапускается, но я хотел хотя бы заставить ее работать с фактическим адресом памяти, прежде чем я попытаюсь найти способ получить ее динамически.

так как я могу найти фактический адрес памяти для использования с функцией ReadProcessMemory на основе адреса, отображаемого в чит-движке.

+0

Что возвращает GetLastError()? –

+0

ERROR_PARTIAL_COPY 299 (0x12B) Выполнена только часть запроса ReadProcessMemory или WriteProcessMemory. – xFlRSTx

ответ

0

Вот как я это сделал (код был упрощен и не проверен). Адрес должен быть смещен по базовому адресу основного модуля игрового процесса.

void read() { 
    MODULEENTRY32 mainModule = {0}; 
    HANDLE process = openProcessByName(PROCESS_NAME, PROCESS_VM_READ, &mainModule); 

    float rawSpeed = 0.00f; 
    ReadProcessMemory(process, (LPCVOID)(mainModule.modBaseAddr + MEMORY_ADDRESS), &rawSpeed, sizeof(rawSpeed), NULL); 
} 

//returns INVALID_HANDLE_VALUE on failure 
HANDLE openProcessByName(const char* name, DWORD access, MODULEENTRY32* mainModule) { 
    PROCESSENTRY32 process; 
    process.dwSize = sizeof(PROCESSENTRY32); 

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 

    if (Process32First(snapshot, &process) == FALSE) {//failure 
     CloseHandle(snapshot); 
     return INVALID_HANDLE_VALUE; 
    } 

    while (Process32Next(snapshot, &process) == TRUE) {//skips first but thats system anyway 
     if (_stricmp(process.szExeFile, name) == 0) {//found it 

      HANDLE modSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, process.th32ProcessID); 
      mainModule->dwSize = sizeof(MODULEENTRY32); 
      Module32First(modSnapshot, mainModule); 

      HANDLE processHandle = OpenProcess(access, FALSE, process.th32ProcessID); 

      CloseHandle(modSnapshot); 
      CloseHandle(snapshot); 
      return processHandle; 
     } 
    } 

    CloseHandle(snapshot); 
    return INVALID_HANDLE_VALUE;//reached if the process is not found and its handle not returned above 
} 
Смежные вопросы