• Обратная связь: [email protected]

    Наш канал в telegram: https://t.me/ru_sfera

    Группа VK: https://vk.com/rusfera

    Пользователи могут писать на форуме ТОЛЬКО ЧЕРЕЗ 7 ДНЕЙ после регистрации

Уроки GameHacking. Часть-1


MKII

Просветленный
Просветленный
Регистрация
03.10.2022
Сообщения
264
Репутация
197
В данном цикле статей мы поговорим про геймхакинг.
Будем говорить от простого, к сложному.

Что из себя представляет геймхакинг?
Геймхакинг - Это чтение и изменение памяти игры по определенным адресам.
В данной статье мы рассмотрим WinApi функцию .
Данная функция позволяет нам прочитать память приложения по определенном адресу.

Для примера мы возьмем игру CS:GO.
На GitHub есть пост, в котором сливают оффсеты игры, используем его и сэкономим немного нашего времени .

Для удобства, возьмем темплейт ReadProcessMemory.
C++:
template<typename T> T RPM(SIZE_T address) {
    T buffer;
    ReadProcessMemory(hProcess, (LPCVOID)address, &buffer, sizeof(T), NULL);
    return buffer;
}

Так-же, нам надо получить адрес DLL в которой содержатся функции игры, в нашем случае это - "client.dll".

C++:
uintptr_t GetModuleBaseAddress(const char* modName) {
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE) {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry)) {
            do {
                if (!strcmp(modEntry.szModule, modName)) {
                    CloseHandle(hSnap);
                    return (uintptr_t)modEntry.modBaseAddr;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
}

Можно приступить к созданию нашего первого "Чита".

Для начала, нам надо получить HANDLE нашего окна с игрой, адрес client.dll и процесс айди.
C++:
HWND hwnd;
hwnd = FindWindowA(NULL, "Counter-Strike: Global Offensive - Direct3D 9");
GetWindowThreadProcessId(hwnd, &procId);
moduleBase = GetModuleBaseAddress("client.dll");
hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procId);

Следующим делом надо получить указатель на нашего игрока.
C++:
uintptr_t LocalPlayer() {
    return RPM<uintptr_t>(moduleBase + 0xDE7964);
}

0xDE7964 - Это смещение, которое нам надо прибавить к адресу client.dll, узнать это смещение можно на странице с оффсетами на ГитХабе.
CTRL + F -> dwLocalPlayer
1669450380163.png

1669450397359.png


Мы получили адрес нашего персонажа, давайте через RPM узнаем кол-во наших жизней.

Создадим переменную типа int с названием Health.
Далее, на странице оффсетов надо найти нужное смещение.
Нужное смещение: m_iHealth.
1669450582059.png


Теперь нужно к LocalPlayer прибавить m_iHealth, делается это так:
C++:
int Health = RPM<int>(LocalPlayer() + 0x100);

Результат:
1669450673775.png


На этом думаю стоит закончить 1 часть.
Во 2 части разберем функцию и сделаем что-то посерьезнее.
 
Последнее редактирование модератором:

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 195
Репутация
8 325
Отлично!
Даже мне понятно и прикольно что С++.)
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 195
Репутация
8 325
А чего в оффтопе ?
А создал раздел специальный:GameHacking
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 195
Репутация
8 325
Хорошие статьи простые и понятные, как устроены читы в играх.
Если будет желание/время продолжай постить, думаю очень полезно.)
 
Верх Низ