[0x1]Легкий Геймхакинг: Шаг за шагом

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор Unseen
Источник: https://xss.is


Хо-хо-хо Форумчане! Скоро Новый год и что-то подтолкнуло начать писать цикл статей на тему взлома игр(далее - Геймхакинг).

Целью является передача материала на данную тематику более подробно,

особенно довести суть и логику на понятном языке для начинающего геймхакера.

Так что же из себя представляет геймхакинг?

Наверное каждый из нас сталкивался со случаем, когда заходил поиграть в любимый онлайн шутер и во время матча замечал, как один игрок из вражеской команды делал нереальные убийства. Попадать точно в голову(Aimbot) и видеть Вас сквозь стены(WallHack). Такие преимущества над другими игроками дают в играх определенно – читы. Это ПО, которое манипулирует памятью игры, читает и вносит(записывает) некоторые изменения в память. В итоге Вы получаете, те самые супер способности. Об этом подробно поговорим в технической части статьи.

Как можно хорошо зарабатывать с этого?

Для себя я отметил два способа заработка в этой тематике, а именно:

1) Написание приватных читов и последующая продажа по подписке (Модель SaaS - ПО как услуга).

В данном направлении главный упор делается на богатый функционал и обход античита(пример – VAC, Faceit, EAC).

План реализации:
Разработать продукт->Собрать базу клиентов ->Поддерживать базу клиентов = $ 🤑

2) Написание бесплатных читов(с ограниченным функционалом) и добавление туда дроппер/стиллер/бэкдор и т.д. ;)

Все зависит от Ваших фантазий в данном случае. Для примера представим сценарий:

Вы написали чит с базовыми функциями( WH, Aimbot, Triggerbot)-> встроили туда стиллер и распространяете на разных платформах: чит-форумы/ютуб/телега и т.д. = Получение массовых данных(далее Логи) с компьютеров кто запустил ваш чит.
Схема сценария:
Screenshot_4.png


На этом этапе у Вас два варианта:

1)Отработка логов и получение выгоды в виде, аккаунтов стим/соц. сетей, крипты, сохраненных карт(CVV code) если таковы имеются. Жирный профит, но уходит время на отработку.

2)Продажа логов или фиксированный % от их отработки - средний профит, но быстро.

Здесь уже выбор зависит от Ваших личных технических навыков и желания.

Сразу договоримся , методом обучения будет переход от простого к сложному. Важно: Всегда старайтесь закреплять изученное практикой. Экспериментируйте!
Теперь когда немного разобрались что это за направление и поняли как с него можно получать хороший заработок, пора приступить к технической части статьи.😬

Техническая часть…
Для начала нужно понять, что же происходит когда мы запускам ту или иную программу в компьютере. После запуска программы наша операционная система (далее ОС) загружает ее в оперативную память (RAM) компьютера, где происходит инициализация и подготовка к выполнению. ОС выделяет ресурсы, необходимые для работы программы, такие как выделение виртуального пространства памяти, установка прав доступа и регистрация системных событий. Если программа зависит от внешних библиотек или модулей(пример dll), они также загружаются в память. Виртуальное пространство разработана для того чтобы один процесс не имел доступа к памяти другого процесса. Для работы с памятью другого процесса в Windows, мы сначала должны получить хэндл этого процесса при помощи WinApi. Подробнее поговорим в следующей части.

Оперативная память же состоит из одинаковых ячеек памяти, каждая из которых имеет свой уникальный номер, называемый адресом. Запись информации, а так же чтение ее из ячейки происходит по адресам. Ячейка содержит восемь двоичных разрядов, каждый из которых может находиться в одном из двух состояний, обычно обозначаемых как ноль и единица. Это значит ячейка как единое целое может находиться в одном из 2ⁿ состояний, где n – количество разрядов в ячейке, так, если разрядов 8, возможных состояний ячейки будет 2⁸ = 256, или , иначе говоря, ячейка может хранить числа от 0 до 255. В современных компьютерах одна ячейка памяти из 8 бит = 1байт.
Более наглядно можем увидеть:
RAM.png



Если бы в нашей игре был уровень жизни равный 100, то двоичное представление выглядело бы, как на картинке выше по адресу ячейки 0001( или же 0x1 в hex формате) 01100100 = 100. Или уровень брони как по адресу 0003(0x3) 00110010 = 50. А по адресу 0002(0x2) видно, что все разряды равны единице и образует число 255.
А что если у нас имеется количество монет/денег персонажа или другие данные которые превышают значение, которое может хранить ячейка, то есть больше чем 255, что делать тогда ?
В этом случае мы будем уже работать с группой байт(ячеек), ведь для представления чисел, которые не вместились в одну ячейку приходится взять 2 и более байт(ячеек), чтобы вместить нужные данные. Эти знания нам еще понадобятся, а пока просто читаем.

Вообще для взлома игры, как говорил ранее, мы работаем с памятью игры и главная задача это правильно найти допустим адреса здоровья, брони, сила прыжка и т.д. в памяти и произвести над ними какие то операции. Прочитать значение координат врага в игре и вывести его на экран или записать большое число в адрес силы прыжка от чего наш персонаж будет как Марио =) Обычно для поиска адресов используются сканеры памяти, конечно можно было бы свой сканер написать , но думаю это возможно будет в будущих статях. А пока обойдемся мощной и чудесной программой Cheat Engine. Ссылка на сайт(Не реклама) Cheat Engine Думаю трудностей со скачиванием и установкой не возникнет. Я поставил плюс к нему русификатор.

Эксперименты…

Решил написать мини игру для наших тестов. Думаю, для демонстрации выше полученных знаний самое то! Логика нашей игры заключается в получении урона при нажатии на Enter и выводить количество здоровья. Еще решил, что будет правильно вывести адрес ячейки(ек), где хранится наше здоровье, для полноты картины. Ссылка на исходник для компиляции(gcc) и собранный вариант оставлю в конце статьи. Пароль от архива: xss.is
Запускаем игру:

game_dis.png



Далее запускаем Cheat Engine и видим такую картинку:

cheat2.png



Нажимаем просмотр процессов и выбираем нашу игру в моем случае a.exe.
Далее для сканирования памяти в целях поиска нужных нам адресов со значениями здоровья нам нужно ввести в поле:
cheat3.png



1)«Значение» искомые данные, в нашем случае здоровье 100.

2) «Тип значения» Немного про программирование. Обычно при написании игры разработчик создает переменные, в них будут храниться данные игры. Как обсуждали выше про оперативную память: переменную можете представить как ячейку или группу ячеек(байтов) памяти, куда разработчик записывает значения брони, здоровья, координаты персонажа и тд. Так, переменные имеют свой тип для хранения. Например тип 4Байта – это 4байтов(ячеек) * 8битов = 32бит информации или же 232 степени. Этого предостаточно для хранения количества здоровья. Раньше при разработке из-за дефицита памяти(ОЗУ) ее экономили, и в случае нашей игры я как разработчик мог бы хранить число 100 в 1байте или 2байтах памяти. Подробнее про типы переменных будет в следующей статье.

3) «Поиск» После установки нужных значений и типов(4байт в данном случае) нажимаем поиск.

Как видим у нас нашлось 7 адресов и в одном из них хранится наше искомое значение.
cheat4.png



Но так как я в нашей игре вывожу адрес переменой, где у нас хранится здоровье мы можем заметить этот адрес присутствует в нашем списке. Но в реальных играх мы не знаем заранее этот адрес и идем дальше искать. Значит имеем 7 адресов и нужно отсеять не нужные нам адреса. Переходим в игру и нажимаем Enter – получили урон в 5 единиц. Теперь переходим в сканер и вводим в поле значение наше новое значения здоровья 95 и нажимаем «Отсев».

cheat5.png


Как видно у нас остался один адрес и он совпадает с адресом, который отображается в самой игре. Предлагаю проверить данное совпадение, чтобы убедиться, что это то, что мы искали. В окне Cheat Engine выбираем этот адрес и два раза кликаем на него. Переместили его в нижнее окошко сканера :

cheat6.png



Видим сам адрес и значение, которое хранится в нем. Попробуйте изменить это число на другое, например на число 1000. Два раза кликаем на само значение, у нас открывается окошко, вводим туда нужное число и нажимаем - подтвердить. Переходим в игру и получаем урон. Как видим количество изменилось с 95 на 995, почему 995,а не 1000? Потому что наша игра после получения урона вычла из значения здоровья 5 и вывела новое значение 995. Поздравляю Вы только что произвели запись в память.

Давайте немного посмотрим, как выглядит память нашей игры… Выбираем адрес и нажимаем Ctrl+B или же ПКМ по адресу и пункт «Просмотреть этот регион памяти».

Открывается новое окно со всем байт кодом:

cheat7.png



1) 3EFA7FFAC8 и E3 03 это наши адрес и значение в шестнадцатеричной форме расположенной в нем.
2) Здесь так же адрес и значение. Давайте подтвердим нашу гипотезу про хранение данных в ячейках и размерах ячейки.

Для лучшего понимания нажмите ПКМ на значение в нижней части окошка просмотра памяти => «Тип отображения » => 1Байт(шестнадцатеричное) . Так же ПКМ и «Разделители» => 4байта.

Как мы помним значение находится в 4байтах(ячейках) памяти - это адреса C8 C9 CA CB. А мы знаем, что 1байт это 8бит = 4байт * 8бит = 32бита то есть 2 в 32 степени = 4294967295 это максимальное число, которое можем хранить в 4байтах памяти. Давайте перейдем в начальное окно Cheat Engine и поменяем наше значение на 4294967295, подтверждаем.

Снова переходим в окно просмотра памяти и видим:

cheat8.png



Все 4 ячейки стали FF FF FF FF в шестнадцатеричной системе. То есть при поисках значений нужно заранее предположить сколько мог выделить разработчик для хранения тех или иных данных в игре. Это сильно упростит наш поиск. Проявляйте смекалку друзья :)

После перезапуска игры вы можете заметить, что адрес который мы нашли уже не будет рабочим. Дело в том, что при каждой загрузки программы в исполнение, ОС помешает его в случайные области памяти. В следующей части попробуем решить эту проблему, чтобы научиться заранее узнавать каким будет адрес. Поговорим про типы переменных, смещения(оффсеты) и уже напишем первую свою программу для чтения и записи в память других программ(игр).

Эта статья больше получилось об устройстве памяти ОЗУ, системы счисления, представление данных в памяти, но без понимания этого нет смысла идти дальше. Теперь у нас есть полноценная картина, что же происходит закулисами монитора в самой игре. Конечно не все моменты разобрали, но важную часть думаю освоили.

На этом думаю можно закончить нашу статью, ибо сразу все не освоишь, да и нужно дать время мозгу переварить полученные знания.

Хотелось бы добавить для новичков пару рекомендаций. Параллельно со статей начните учить язык С/С++ если этого еще не сделали, это даст больше понимания об низкоуровневом программировании. Да и вообще хороший программист должен понимать, что у него творится за капотом его исполняемого кода. Язык ваш инструмент. Изучив, Вы точно не останетесь в убытки, потому что знания - это самое ценное =)

Сам исходный код игры:

C: Скопировать в буфер обмена
Код:
#include <stdio.h>

int main(){

    int HP = 100; //type int = 4byte
    int damage = 5;

    while(HP > 0)
    {
    printf("==============================================\n");
    printf("\tSpecial for XSS.IS | Author Unseen\n");
    printf("==============================================\n");
    printf("[+]Adress: [%p] Value HP: [ %d ]\n", &HP, HP);
    printf("[-]Enter = +damage...");
    getchar();
    HP -= damage;
    system("cls");
    }

    return 0;

}

Ссылка на архив с игрой Скачать
 
Сверху Снизу