В данном цикле статей мы поговорим про геймхакинг.
Будем говорить от простого, к сложному.
Что из себя представляет геймхакинг?
Геймхакинг - Это чтение и изменение памяти игры по определенным адресам.
В данной статье мы рассмотрим WinApi функцию
Данная функция позволяет нам прочитать память приложения по определенном адресу.
Для примера мы возьмем игру CS:GO.
На GitHub есть пост, в котором сливают оффсеты игры, используем его и сэкономим немного нашего времени
Для удобства, возьмем темплейт ReadProcessMemory.
Так-же, нам надо получить адрес DLL в которой содержатся функции игры, в нашем случае это - "client.dll".
Можно приступить к созданию нашего первого "Чита".
Для начала, нам надо получить HANDLE нашего окна с игрой, адрес client.dll и процесс айди.
Следующим делом надо получить указатель на нашего игрока.
0xDE7964 - Это смещение, которое нам надо прибавить к адресу client.dll, узнать это смещение можно на странице с оффсетами на ГитХабе.
CTRL + F -> dwLocalPlayer
Мы получили адрес нашего персонажа, давайте через RPM узнаем кол-во наших жизней.
Создадим переменную типа int с названием Health.
Далее, на странице оффсетов надо найти нужное смещение.
Нужное смещение: m_iHealth.
Теперь нужно к LocalPlayer прибавить m_iHealth, делается это так:
Результат:
На этом думаю стоит закончить 1 часть.
Во 2 части разберем функцию
Будем говорить от простого, к сложному.
Что из себя представляет геймхакинг?
Геймхакинг - Это чтение и изменение памяти игры по определенным адресам.
В данной статье мы рассмотрим 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
Мы получили адрес нашего персонажа, давайте через RPM узнаем кол-во наших жизней.
Создадим переменную типа int с названием Health.
Далее, на странице оффсетов надо найти нужное смещение.
Нужное смещение: m_iHealth.
Теперь нужно к LocalPlayer прибавить m_iHealth, делается это так:
C++:
int Health = RPM<int>(LocalPlayer() + 0x100);
Результат:
На этом думаю стоит закончить 1 часть.
Во 2 части разберем функцию
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
и сделаем что-то посерьезнее.
Последнее редактирование модератором: