им пытаются сделать приложение, которое отслеживает скорость персонажа в 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 на основе адреса, отображаемого в чит-движке.
Что возвращает GetLastError()? –
ERROR_PARTIAL_COPY 299 (0x12B) Выполнена только часть запроса ReadProcessMemory или WriteProcessMemory. – xFlRSTx