Перейти к содержанию

[Dishonored2] Не получается добраться до конечного значения по цепочке указателей


Рекомендуемые сообщения

Хотел написать программу которая ставит значение маны на максимум (как заморозка в 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:
aaaaaaaaaada.PNG

 

Если кто-то поможет, буду очень благодарен ?

Изменено пользователем Fortex
Код помещён под спойлер и картинка перемещена
Ссылка на комментарий
Поделиться на другие сайты

Зачем ты вручную читаешь адрес, если это можно сделать в цикле, решительно не понятно.
Сделай через цикл. Что-то вида:

Спойлер

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 трейнер и всё. 

Ссылка на комментарий
Поделиться на другие сайты

цикл сделал вроде-бы правильно, но проблема осталась.  при чтении в цикле при первой итерации ошибка: Вызвано исключение: нарушение доступа для чтения.
PM7 было 0xACA45A0.

 

+ когда вручную иду смотреть в Cheat Engine память там всё нулями забито. Не знаете с чем это может быть связано?

Изменено пользователем Fortex
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.