• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Ломаем игры и зарабатываем как Michael Donnelly

albanec2023

(L3) cache
Пользователь
Регистрация
14.10.2023
Сообщения
222
Реакции
305
Всем привет! В качестве активного отдыха я предпочитаю изучение новых направлений которые можно монетизировать! Я уже длительное время изучаю геймхак и предлагаю вам погрузиться в этот удивительный мир.

Можно здесь заработать или нет - у меня уже давно нет сомнений в этом вопросе.
Посмотрите сколько копий своего бота Glider продал Michael Donnelly.

Интерес к подобному ПО огромен — та же Tencent в сентябре прошлого года оценивала китайский сегмент данного черного рынка в $293 млн.

И это только в Китае, где читеров отправляют на долгий срок в тюрьму! А что в остальном мире? Огромный спрос! Особенно на игры с анти-читами - это настоящая золотая жила!

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

Что же такое геймхак?
Создание годмода, флайхака, редактирование сохранений, просмотр сквозь стены - все это геймхак.
Так как я пришел в геймхак из скама - у меня не было никакого релевантного опыта в этом деле.
На этом этапе многие сталкиваются с трудностями, а как же подступиться к той самой игре?
Поэтому мы разберем все с самых азов, начиная от нулей и единиц, заканчивая разбором полноценной игры.

И уже сегодня попробуем на практике поколупать настоящую игру!
А по мере нашего цикла статей (если он вам понравится) затронем более интересные и продвинутые техники.
А может быть кто-то нам поможет пореверсить и анти-читы!

Приступим!

Самый основной навык в геймхаке - умение редактировать память. Все что вы хотите - годмод, подкрутить бабки, телепорт - все это можно сделать с помощью редактирования памяти. Но если вы хотите создать что-то более комплексное, например, аимбот или воллхак, нам потребуется редактировать машинный код на самом низком уровне, здесь нам нужно хотя бы базовое понимание ассемблера, чтобы записывать / редактировать конструкции.

Для понимания приведу пример:
Например, у вас есть 100 HP в игре.
Вы можете создать программу, которая будет бесконечно часто перезаписывать значение HP на максимальное.
Все что требуется это найти где это значение находится в памяти и записывать туда "100" с некоторым KD в миллисекундах. Но это может очень сильно: а) нагружать систему, т. к. происходит непрерывная запись, огромное количество итераций б) подвести вас, когда вам в моменте нанесут больший урон чем значение HP.

Редактирование инструкций позволит нам изменить же самому логику нанесения урона, т. е. фактически мы можем переписать определенный игровой модуль и заменить его своим, с той логикой что нужна нам!
Если условно у вас была конструкция:

При нанесении урона персонажем с уровнем Damage "X" персонажу "B"
отнять у персонажа "B" - "X" HP

То вы можете заменить "отнять" на "прибавить". Таким образом вам не потребуется постоянно записывать что-то в память, нагружать систему, достаточно единожды изменить логику!

Помимо редактирования памяти и машинных кодов есть техника редактирования шестнадцатеричного представления на самом диске, это используют для редактирования сохранений, но мы рассмотрим это в контексте для понимания, чтобы перейти к редактированию пакетов, где редактируются не локальные файлы, а все то чем обменивается клиент с сервером. И несмотря на различные server-side проверки, почти всегда находятся лазейки, которые можно использовать.

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

Michael Donnelly продал 100 тысяч копий своего бота за 45$, а это на минуточку 4.500.000$ :smile10: o_O

Скорее всего прямо сейчас для вас загадка, если вы как и я пришли из НЕ технической области, что же там твориться в памяти? Но как и инженеры, химики, врачи не часто говорят об атомах, а об отдельных частях, веществах, органах - мы также перейдем на ступень несколько выше чем нули и единицы, но и к ней мы вернемся.

1701073806980.png


Первый пункт (управление аппаратным обеспечением) мы затрагивать особо не будем, так как он не затрагивает нас напрямую. Хотя в последнее время Hardware-hacking набирает обороты.

А вот второй пункт нам интересен в большей степени. Когда вы запускаете .EXE файл (например, вашу игру) операционная система понимает согласно формату (.EXE) как работать с данным файлом, помещает его с вашего hard-drive (жесткого диска) т. е. холодной памяти в "горячую", то бишь RAM (оперативная память). Если описать очень вкратце, другие детали нам пока не нужны.

1701074338008.png

Поэтому когда мы ломаем игру мы ломаем ее НЕ на диске, мы ломаем ее в оперативной памяти, RAM.
Это главное отличие между крякингом и геймхаком, в том что в 1 случае редактируют копию на диске, у нас же копия в памяти.
Т. е. выполняем все "на лету" прямо во время работы.

Один из основных инструментов которым мы будем работать - Cheat Engine.
Загрузить можно с оф. сайта: https://www.cheatengine.org/
Не забудьте снять галочки чтобы не установить спонсорский софт, т.к. CE распространяется условно-бесплатно.

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

Чтобы перезаписать условное значение HP, нам нужно обратиться к ОС и попросить ее найти нужный процесс, нужную область памяти и записать необходимое значение в переменную. Все это можно делать с помощь API.

Windows API (англ. application programming interfaces) — общее наименование набора базовых функций интерфейсов программирования приложений. Работа через Windows API — это наиболее близкий к операционной системе способ взаимодействия с ней из прикладных программ.

Чтобы записать что-то в оперативную память мы используем функцию WriteProcessMemory

По этом принципу и работает Cheat Engine.

Но как нам найти ту область, ту переменную, куда мы должны записать значение?

На помощь нам приходит Memory Scanning, т.е. сканирование памяти.

1701075360726.png

Мы можем найти что угодно, начиная от HP заканчивая XYZ (оси X, Y, Z) координатами местоположения игрока в игровом пространстве.

Но чтобы отредактировать что-то, нам нужно понимать в каком виде эти данные находятся в памяти и затем записать их в нужном формате.

Если вы сделаете дамп оперативной памяти (выгрузите содержимое) например в текстовом формате вы увидите примерно следующее:
1701075524452.png


Просто океан из нулей и единиц. Да, компьютер в самом элементарном представлении работает с двоичными данными (двоичный код). Где самая минимальная единица измерения это БИТ, который может принимать два значения: 0/1

Но инструменты могут упростить нам работу и работать мы будем уже с БАЙТАМИ, т. е. группой битов (8 бит).
1701075804895.png

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

Представим что наше значение HP = 100
Так как же нам его раскопать?

Значение 100 в нашем представлении это ДЕСЯТИЧНАЯ система, т.е. DECIMAL.
Память - ДВОИЧНАЯ, т.е. BINARY.

Используем научный метод. Нам нужно конвертировать наше значение 100 из десятичной в двоичную.
1701076310973.png


Как вы можете заметить, что в десятичной что в двоичной системе каждый столбец числа = разряд, который несет какое-то значение.
В десятичной это 1/10/100/1000/и т.д.
В двоичной это 0/2/4/8/16/32/64/128/и т.д. то есть степень двойки.

Теперь мы знаем что 01100100 соответствует нашему значение HP = 100.
Но если мы попытаемся просканировать нашу память, он найдет нам сотни и тысячи таких значений! А как же тогда нам найти именно HP?

Да, в системе множество переменных могут в данный момент иметь значение 100, да и не только в системе, но и в самой игре.

Для нахождения мы делаем следующие этапы:

1. Сканируем память, то есть на простом языке делаем ОТПЕЧАТОК памяти, копию листа бумаги, как угодно для вашего понимания.
2. Меняем значение HP в игре (например, специально провоцируем, получаем урон)
3. Наше значение HP поменялось, например, с 100 до 55.
4. Сканируем память снова, т.е. делаем еще одну копию
5. Наш инструмент накладывает две одинаковые страницы друг на друга и ищет все переменные которые изначально были равны "100" и затем ищет на второй странице те из них, что были поменяны на "55"
6. Продолжаем процесс с 2 шага по 5 до тех пор пока не придем к 1 единственному и верному значению.

Если очень сильно упростить, то процесс поиска в памяти выглядит именно так.

Здесь нам нужно понять важный момент:
Дело в том что 1 байт может нести в себе только 8 бит, а значит (если вы посчитаете) - он может нести только сумму из 8 разрядов
(128 + 64 + 32 + 16 + 8 + 4 + 2 = 255) [11111111]

Со значением HP понятно, оно чаще всего не превышает в играх 100. Но что если превышает? Или например мы ищем показатель золота или что-то другое что может превысить 255?

В таком случае мы работаем сразу с группой байт, состоящей из двух байт, четырех или восьми.
Например вот такая прекрасная иллюстрация:
1701077062419.png

Т.е. чем больше бит/байт - тем больше мы можем вместить число.

Поэтому когда мы ищем что-то, мы должны использовать научный метод и точно задавать параметры искомых значений, предполагая, какие пределы и диапазоны мог задать разработчик, как разработчик хранит переменную?

Например, если игра написана на C++, в каком формате и какой тип данных использовал разработчик чтобы сохранить HP? А что если это координаты? Может быть float (с типами данных познакомимся позже)? Тут к нам на помощь и приходит понимание языка на котором написана игра и дальнейшее построение нашей теории по поиску нужного значения.

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

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

Таким образом мы можем найти смещение (оффсет, offset) относительно этого участка N.
Например:
1701077871681.png


Чтобы вы лучше поняли давайте разберем какой-нибудь пример вместе!
Возьмем простую игру которую вы сможете быстро скачать и она запуститься даже на самых древних сундуках:

Если хотите чтобы все было как у нас в статье качайте версию как у меня (актуальная на момент статьи 1.3.0.2 LockDown Edition)
Запускаем игру и запускаем Cheat Engine, запустите игру в окне для удобства.

1701078703194.png


Вы можете заметить светящийся в верхнем левом углу значок.
Мы должны указать какую игру мы будем с вами ломать.
Выбираем процесс/окно/приложение нашей игры,
1701078742490.png

И жмем "Open"!

Сейчас наш Cheat Engine будет знать с чем ему предстоит работать.
Значение нашего HP равно 100.
Делаем "First Scan" не меняя параметров и указав в строке поиска значение "100".
Получить мы должны вот такое окно:
1701078860542.png


Теперь постарайтесь поднять на локации гранату и нанести себе немного урона! (не подходите слишком близко)
У меня получилось оставить "43" HP.

1701078959275.png


Что делать дальше?
Вписываем в строку поиска значение "43" и жмем "Next Scan". Не перепутать с "New Scan" (сброс)
Если вы случайно подорвались окончательно, после респауна нажмите New Scan, введите 100 и снова "First Scan".

Как видим, таких значений которые изменились с 100 на 43 у нас случилось не много.
А именно:
1701079050721.png

Но их два?
Черт, а как понять, какое из них наше?
Попробуем повторить процедуру и снова метнем гранату!

Можем заметить (ничего пересканить не нужно), что поменялись оба значения на 100.
Так какое из них отвечает за HP?

1701079113439.png


В данном случае мы можем предположить, что одно значение -> значение переменной ответственной за HP игрока, т.е. закреплено за ним, а другое - это значение которое тянется из "HUD", т.е. интерфейса игры, которое принимает значение из самой искомой переменной. Давайте попробуем изменить одно из значений.

Добавим обе переменных в таблицу ниже нажав на каждое:
1701079247827.png

А после кликом нижней таблицы по значению Value попробуем изменить его.
Поменяв первое значение я получил следующее:

1701079295062.png


В игре поменялось значение HP в интерфейсе, но это еще не значит, что это соответствует настоящему значению HP.
Вторая переменная при этом не поменяла значение со 100 на 50.
1701079354293.png

Скорее всего мы поменяли значение в HUD. Давайте проверим!

Попробуем нанести себе немного урона!
1701079392625.png


Как видим, значение упало до 25 при близком взрыве. И поменялись обе переменные, т.е. при обновлении значения HP обновился (подтянулся) и HUD.
1701079423971.png


Можем сделать вывод что вторая переменная это и есть HP.
Попробуем отредактировать значение HP до 10000, а затем снова подорвать гранату!
1701079564043.png

1701079570619.png

Наша гипотеза, кажется, верна!
Обновились обе переменные, значение изменилось с 10000 до 9928.
Давайте перепроверим.
Поменяем значение 1 переменной на 100 и снова бросим гранату!

Наш HUD обновился до 100. Но изменился ли показатель HP?
1701079682985.png

После очередного подрыва HP и HUD снова откатились до настоящих значений.
1701079709780.png

1701079717982.png


А значит наша искомая переменная HP - вторая!

Вот таким незатейливым способом и применением логики и происходит обратная разработка игр, поиск нужных переменных и других интересностей.

После перезапуска игры адреса этих переменных изменятся? А как же их найти?
Если вам интересная данная тематика, то оставляйте обратную связь и мы будем продвигаться к более продвинутым техникам, инструментам и играм такие как CSGO, Dota и т.п.
Научимся делать Aimbot и Wallhack, способы инжекта, обход простых античитов.
Нравится ли вам такой формат? :smile10:

Ваш Albanec специально для xss.pro!
 
поставил лайк за старание, но, блин, мануал по использованию артмани в 2к23, на илитном хакерском форуме... хотя бы онлайн игру взломал, что ли.
я сто лет назад пользовался WPE Pro, некоторые простые игры доверяли клиентам и позволяли делать спидхаки и воллхаки "на коленке" с помощью подмены отправляемых пакетов.
 
поставил лайк за старание, но, блин, мануал по использованию артмани в 2к23, на илитном хакерском форуме... хотя бы онлайн игру взломал, что ли.
я сто лет назад пользовался WPE Pro, некоторые простые игры доверяли клиентам и позволяли делать спидхаки и воллхаки "на коленке" с помощью подмены отправляемых пакетов.
Я планирую развивать как ветку от самых Азов до продвинутых техник, чтобы это было доступно каждому, кто не имеет бэка технического вообще.

Я мог сделать этот ман коротким, показать как прожать кнопки и заспуфить золото, условно.

Но никто бы не понял происходящего, а тут я попытался объяснить что происходит "за кадром", то есть здесь суть не то "как" Заспуфить HP, а показать что происходит там, внутри памяти, что использует инструмент в процессе работы, как понять что переменная наша, что такое этот двоичный код и всё такое =)

Чтобы в следующем уроке уже показать смещение как искать относительно клиентских модулей в памяти, как искать указатели, как искать те которые будут жить дольше и тп

Но если человек не будет видеть самых основ, он потом дальше просто не поймёт, а это всё таки на новичков рассчитано, а те кто умеет им это и не надо будет, они и так всё знают :D

Так что дальше будет только веселее!
 
Надеюсь, "продвинутые техники" - это не Code Injection и AOB injection при работе с одной инструкцией, это и для школьников просто. Хотелось бы продвинутые техники по поиску значений (например, для поиска таймера, если через неизвестное значение не находит), ведь загвоздка чаще всего именно в том, чтобы найти. А вот на "Создание флайхака, редактирование сохранений, просмотр сквозь стены" было бы интересно посмотреть (сохранения обычно зашифрованы).
 
Последнее редактирование:
Надеюсь, "продвинутые техники" - это не Code Injection и AOB injection при работе с одной инструкцией, это и для школьников просто. Хотелось бы продвинутые техники по поиску значений (например, для поиска таймера, если через неизвестное значение не находит), ведь загвоздка чаще всего именно в том, чтобы найти. А вот на "Создание флайхака, редактирование сохранений, просмотр сквозь стены" было бы интересно посмотреть (сохранения обычно зашифрованы).
И Code Injection посмотрим :D
Конечно бро, двигаемся от простого к сложному, сам понимаешь, в этом деле не получится ничего "пропустить", иначе дальше просто не поймешь. А так как развивать планирую направление как именно пошаговое руководство, то затронем все аспекты. И зашифрованные сохранения, и поиск таймера :):smile10:
 
хм.
поставил лайк за старание, но,
вот с этими словами я соглашусь. Старания - море, но читатели - уперты как волнорез.
Заголовок - в одну сторону (зарабатываем как Майкл_кто-то_там...а кто это? миллионы), а содержание - в другую.
Если заработок, то это заработок.
Пусть не road map, но все-таки что-то от простого к сложному. в баксах желательно...

Не уверена что читерство у всех ассоциируется с заработком.
Может я уже привыкла считать каждый гвоздик, но как-то хотелось бы видеть связь: научились - заработали.
или научимся- можем сделать так-то и так-то. С той игрой, с тем сайтом...

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

Это не может вдохновлять. Нужно найти золотую середину между баблом и кодом. ..как-то так.
 
Нужно найти золотую середину между баблом и кодом. ..как-то так.
В который раз убедился сам, что где бабло — там код.

И либо ты сам этот код пишешь, либо кому-то платишь.

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

Потом в процессе конечно на это времени нет, и требования другие к вещам, но тебя уже не "обуть" и ты отличаешь дилетанта.

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

Но одно дело создать WH и толкать его по 100 рублей, а другое дело настоящий хайп проект и продать 20.000 копий в месяц по 30$ =)

И так потом каждый месяц базу подписчиков содержать.

Какие бабки во многих отраслях крутятся, можно свой нейроресурс поднапрячь да покодить =)

Ну а если совсем к этому не тянет, то и много денежных отраслей без этого есть :D
 
поставил лайк за старание, но, блин, мануал по использованию артмани в 2к23, на илитном хакерском форуме... хотя бы онлайн игру взломал, что ли.
я сто лет назад пользовался WPE Pro, некоторые простые игры доверяли клиентам и позволяли делать спидхаки и воллхаки "на коленке" с помощью подмены отправляемых пакетов.

я неправильно сформулировала основную мысль, наверное. Хотела сказать примерно тоже, что и в цитате, только с другого конца.
Статья конечно, интересная, задумка правильная, кодерам полезная- дадада. Но.
Я только о конкретной реализации. Только об этом, а не о том, что кодить муторно, дешево и вредно для здоровья.

Методика изложения хромает, на мой взгляд. Заголовок - кликбейт. Нет введения и плана статей. И понимания объемов.
Как если бы учебник не имел содержания. А ведь содержание имеют даже статьи.
Хорошо бы структурировать то что собрался писать (и уже написал).

Хаос отпугнет читателей (я не о себе). И труд станет полунапрасным.
А тут, кстати, я думаю в нескольких уроках мы дойдем до простых игр которые уже можно монетизировать, условно.

Вот об этом бы поподробней. Было бы замечательно.


Я предпочитаю учиться сейчас все с чем приходится работать — реализовывать самостоятельно, от крипта до лаунчера.
Это здорово, но не всем дано...
 
Методика изложения хромает, на мой взгляд. Заголовок - кликбейт. Нет введения и плана статей. И понимания объемов.
Как если бы учебник не имел содержания. А ведь содержание имеют даже статьи.
Хорошо бы структурировать то что собрался писать (и уже написал).
Принято! Сделаем ко второй статье!
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Не знаю что касается технической части ,но мне было очень интересно читать .Написано отлично и завлекает .
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх