короче, пытаюсь сделать программу на плюсах, которая будет читать значение адреса и оффсета и выписывать его, но вместо предполагаемого значения, мне выводит 0. как это фиксить GetModuleBaseAddress и GetPointerAddress писал не я, а какой то челик из ютуба #include <Windows.h> #include <TlHelp32.h> #include <iostream> #include <tchar.h> #include <vector> #include <stdlib.h> using namespace std; DWORD GetModuleBaseAddress(TCHAR* lpszModuleName, DWORD pID) { DWORD dwModuleBaseAddress = 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID); // make snapshot of all modules within process MODULEENTRY32 ModuleEntry32 = { 0 }; ModuleEntry32.dwSize = sizeof(MODULEENTRY32); if (Module32First(hSnapshot, &ModuleEntry32)) //store first Module in ModuleEntry32 { do { if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) // if Found Module matches Module we look for -> done! { dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr; break; } } while (Module32Next(hSnapshot, &ModuleEntry32)); // go through Module entries in Snapshot and store in ModuleEntry32 } CloseHandle(hSnapshot); return dwModuleBaseAddress; } DWORD GetPointerAddress(HWND hwnd, DWORD gameBaseAddr, DWORD address, vector<DWORD> offsets) { DWORD pID = NULL; // Game process ID GetWindowThreadProcessId(hwnd, &pID); HANDLE phandle = NULL; phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); if (phandle == INVALID_HANDLE_VALUE || phandle == NULL); DWORD offset_null = NULL; ReadProcessMemory(phandle, (LPVOID*)(gameBaseAddr + address), &offset_null, sizeof(offset_null), 0); DWORD pointeraddress = offset_null; // the address we need for (int i = 0; i < offsets.size() - 1; i++) // we dont want to change the last offset value so we do -1 { ReadProcessMemory(phandle, (LPVOID*)(pointeraddress + offsets.at(i)), &pointeraddress, sizeof(pointeraddress), 0); } return pointeraddress += offsets.at(offsets.size() - 1); // adding the last offset } int main() { HWND hwnd = FindWindowA(NULL, "Euro Truck Simulator 2"); if (hwnd != FALSE); DWORD pID = NULL; GetWindowThreadProcessId(hwnd, &pID); HANDLE phandle = NULL; phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); if (phandle == INVALID_HANDLE_VALUE || phandle == NULL); char gamemodule1[] = "eurotrucks2.exe"; DWORD gamebaseaddress1 = GetModuleBaseAddress(_T(gamemodule1), pID); // Getting the module Base Address // Money DWORD moneyammoAddr = 0x01C87BF8; vector<DWORD> moneyammoOffsets{ 0x10, 0x10 }; DWORD moneyammoPtrAddr = GetPointerAddress(hwnd, gamebaseaddress1, moneyammoAddr, moneyammoOffsets); while (true) { // MEMORY EDITING int number = 0; ReadProcessMemory(phandle, (LPVOID*)(moneyammoPtrAddr), &number, 4, 0); cout << number << endl; } return 0; } C #include <Windows.h> #include <TlHelp32.h> #include <iostream> #include <tchar.h> #include <vector> #include <stdlib.h> using namespace std; DWORD GetModuleBaseAddress(TCHAR* lpszModuleName, DWORD pID) { DWORD dwModuleBaseAddress = 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID); // make snapshot of all modules within process MODULEENTRY32 ModuleEntry32 = { 0 }; ModuleEntry32.dwSize = sizeof(MODULEENTRY32); if (Module32First(hSnapshot, &ModuleEntry32)) //store first Module in ModuleEntry32 { do { if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) // if Found Module matches Module we look for -> done! { dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr; break; } } while (Module32Next(hSnapshot, &ModuleEntry32)); // go through Module entries in Snapshot and store in ModuleEntry32 } CloseHandle(hSnapshot); return dwModuleBaseAddress; } DWORD GetPointerAddress(HWND hwnd, DWORD gameBaseAddr, DWORD address, vector<DWORD> offsets) { DWORD pID = NULL; // Game process ID GetWindowThreadProcessId(hwnd, &pID); HANDLE phandle = NULL; phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); if (phandle == INVALID_HANDLE_VALUE || phandle == NULL); DWORD offset_null = NULL; ReadProcessMemory(phandle, (LPVOID*)(gameBaseAddr + address), &offset_null, sizeof(offset_null), 0); DWORD pointeraddress = offset_null; // the address we need for (int i = 0; i < offsets.size() - 1; i++) // we dont want to change the last offset value so we do -1 { ReadProcessMemory(phandle, (LPVOID*)(pointeraddress + offsets.at(i)), &pointeraddress, sizeof(pointeraddress), 0); } return pointeraddress += offsets.at(offsets.size() - 1); // adding the last offset } int main() { HWND hwnd = FindWindowA(NULL, "Euro Truck Simulator 2"); if (hwnd != FALSE); DWORD pID = NULL; GetWindowThreadProcessId(hwnd, &pID); HANDLE phandle = NULL; phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); if (phandle == INVALID_HANDLE_VALUE || phandle == NULL); char gamemodule1[] = "eurotrucks2.exe"; DWORD gamebaseaddress1 = GetModuleBaseAddress(_T(gamemodule1), pID); // Getting the module Base Address // Money DWORD moneyammoAddr = 0x01C87BF8; vector<DWORD> moneyammoOffsets{ 0x10, 0x10 }; DWORD moneyammoPtrAddr = GetPointerAddress(hwnd, gamebaseaddress1, moneyammoAddr, moneyammoOffsets); while (true) { // MEMORY EDITING int number = 0; ReadProcessMemory(phandle, (LPVOID*)(moneyammoPtrAddr), &number, 4, 0); cout << number << endl; } return 0; }
Replacer, вроде все норм, мб я в глаза долблюсь (это из чит енджина) <?xml version="1.0" encoding="utf-8"?> <CheatTable> <CheatEntries> <CheatEntry> <ID>8</ID> <Description>"money static address"</Description> <LastState Value="8617971" RealAddress="1E190FBA5F0"/> <VariableType>4 Bytes</VariableType> <Address>"eurotrucks2.exe"+01C87BF8</Address> <Offsets> <Offset>10</Offset> <Offset>10</Offset> </Offsets> </CheatEntry> </CheatEntries> </CheatTable>