Гость Fortex Опубликовано 28 июля, 2021 Поделиться Опубликовано 28 июля, 2021 (изменено) Хотел написать программу которая ставит значение маны на максимум (как заморозка в cheat engine) на с++, но не получается получить доступ к памяти игры (постоянно вылетает либо exeption, или ReadProcessMemory заполняет буффер и кол-во прочитанных байт в 0) подозреваю что что-то не так делаю с указателями и их арифметикой. Вот мой код (Интересующие строчки пометил комментами): Спойлер #include <windows.h> #include <psapi.h> #include <stdio.h> #include <string.h> #define ManaOffset 0x20 #define exeName L"Dishonored2.exe" HWND hWnd; HANDLE hProcess; DWORD DishonoredEXE_base = 0; LPDWORD PM1; LPDWORD PM2; LPDWORD PM3; LPDWORD PM4; LPDWORD PM5; LPDWORD PM6; LPDWORD PM7; LPDWORD PM8; void get_process_handle() { HWND hwnd; DWORD pid = 0; hWnd = FindWindow(0, L"Dishonored 2 using VoidEngine v1.77.9.0"); if (hWnd == 0) { printf("FindWindow failed, %08X\n", GetLastError()); return; } GetWindowThreadProcessId(hWnd, &pid); hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); if (hProcess == 0) { printf("OpenProcess failed, %08X\n", GetLastError()); return; } HMODULE hMods[1024]; int i; if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &pid) == 0) { printf("enumprocessmodules failed, %08X\n", GetLastError()); } else { for (i = 0; i < (pid / sizeof(HMODULE)); i++) { char szModName[MAX_PATH]; char GameName[260] = "Dishonored2.exe"; memset(GameName, '\0', 260); if (K32GetModuleFileNameExA(hProcess, hMods[i], (LPSTR)szModName, sizeof(szModName) / sizeof(CHAR))) { if (strstr(szModName, "Dishonored2.exe") != 0) { printf("Dishonored.exe base: %08X\n", hMods[i]); DishonoredEXE_base = (DWORD)hMods[i]; } } } int i = 0; } } int read_process_memory(PVOID addr, void* buf, int num) { SIZE_T sz = 0; int r = ReadProcessMemory(hProcess, addr, buf, num, &sz); if (r || sz == 0) { printf("RPM Error: %08X\n", GetLastError); return 0; } return 0; } void manaAbuse() { for (;;) { DWORD MANA_value = 0; DWORD buffer = 0; size_t BytesRead = 0; /*Вот эта часть меня интерисует*/ PM8 = 0;// (DWORD64*)(DishonoredEXE_base + 0x02ED4580); ReadProcessMemory(hProcess, PM8, &buffer, sizeof(LPDWORD), &BytesRead); PM7 = (LPDWORD)((char*)PM8 + 0x8); PM6 = (LPDWORD)((char*)*PM7 + 0x8); PM5 = (LPDWORD)((char*)*PM6 + 0x798); PM4 = (LPDWORD)((char*)*PM5 + 0x98); PM3 = (LPDWORD)((char*)*PM4 + 0xB8); PM2 = (LPDWORD)((char*)*PM3 + 0x30); PM1 = (LPDWORD)((char*)*PM2 + 0x20); MANA_value = *PM1; *PM1 = 110; /*--------------------------------------*/ } } int main() { get_process_handle(); manaAbuse(); CloseHandle(hProcess); system("pause"); } ссылка на изображение указателя из CheatEngine: Если кто-то поможет, буду очень благодарен ? Изменено 29 июля, 2021 пользователем Fortex Код помещён под спойлер и картинка перемещена Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 29 июля, 2021 Поделиться Опубликовано 29 июля, 2021 Зачем ты вручную читаешь адрес, если это можно сделать в цикле, решительно не понятно. Сделай через цикл. Что-то вида: Спойлер unsigned FindAddressByOffset(unsigned baseaddr, std::vector<unsigned>& offsets) { unsigned final_address = baseaddr; for (auto el : offsets) { __try { final_address = *reinterpret_cast<unsigned*>(final_address); final_address += el; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } } return final_address; } только переделай под то, что у тебя external трейнер и всё. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Fortex Опубликовано 29 июля, 2021 Поделиться Опубликовано 29 июля, 2021 (изменено) цикл сделал вроде-бы правильно, но проблема осталась. при чтении в цикле при первой итерации ошибка: Вызвано исключение: нарушение доступа для чтения. PM7 было 0xACA45A0. + когда вручную иду смотреть в Cheat Engine память там всё нулями забито. Не знаете с чем это может быть связано? Изменено 29 июля, 2021 пользователем Fortex Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения