Это читерство! Учимся взламывать игры и писать читы на простом примере
Компьютерные игры открывают перед нами новые миры. И мир читов — один из них. Сегодня мы вместе пройдем путь от теории к практике и напишем собственный чит. Если ты хочешь научиться взламывать исполняемые файлы, то это может стать неплохим упражнением.
Виды читов и применяемые тактики
Существуют разные виды читов. Можно разделить их на несколько групп.
-
External — внешние читы, которые работают в отдельном процессе. Если же мы скроем наш external-чит, загрузив его в память другого процесса, он превратится в hidden external.
Есть три основные тактики модификации поведения игры.
- Изменение памяти игры. API операционной системы используется для поиска и изменения участков памяти, содержащих нужную нам информацию (например, жизни, патроны).
- Симуляция действий игрока: приложение повторяет действия игрока, нажимая мышкой в заранее указанных местах.
- Перехват трафика игры. Между игрой и сервером встает чит. Он перехватывает данные, собирая или изменяя информацию, чтобы обмануть клиент или сервер.
Большинство современных игр написаны для Windows, поэтому и примеры мы будем делать для нее же.
Пишем игру на C
Про читы лучше всего рассказывать на практике. Мы напишем свою небольшую игру, на которой сможем потренироваться. Я буду писать игру на C#, но постараюсь максимально приблизить структуру данных к игре на C++. По моему опыту читерить в играх на C# очень просто.
Принцип игры прост: нажимаешь Enter и проигрываешь. Не особо честные правила, да? Попробуем их изменить.
Приступим к реверс-инжинирингу

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

При каждом нажатии Enter жизни игрока уменьшаются на 15. Начальное количество жизней — 100.
Изучать память мы будем при помощи Cheat Engine. Это приложение для поиска переменных внутри памяти приложения, а еще хороший дебаггер. Перезапустим игру и подключим к ней Cheat Engine.

Первым делом мы получаем список всех значений 85 в памяти.

Нажмем Enter, и показатель жизней будет равен 70 . Отсеем все значения.

Вот и нужное значение! Изменим его и нажмем Enter для проверки результата.

Проблема в том, что после перезапуска игры значение будет уже по другому адресу. Каждый раз отсеивать его нет никакого смысла. Необходимо прибегнуть к сканированию AOB (Array Of Bytes — массив байтов).
При каждом новом открытии приложения из-за рандомизации адресного пространства (ASLR) структура, описывающая игрока, будет находиться на новом месте. Чтобы найти ее, необходимо сначала обнаружить сигнатуру. Сигнатура — это набор не меняющихся в структуре байтов, по которым можно искать в памяти приложения.
После нескольких нажатий на Enter количество жизней изменилось на 55 . Снова найдем нужное значение в памяти и откроем регион, в котором оно находится.

Выделенный байт и есть начало нашего int32 -числа. 37 00 00 00 — число 55 в десятичной форме.
Я скопирую небольшой регион памяти и вставлю в блокнот для дальнейшего изучения. Теперь перезапустим приложение и снова найдем значение в памяти. Снова скопируем такой же регион памяти и вставим в блокнот. Начнем сравнение. Цель — найти байты рядом с этой сигнатурой, которые не будут меняться.

Проверим байты перед структурой.

Как видишь, выделенные байты не изменились, значит, можно попробовать использовать их как сигнатуру. Чем меньше сигнатура, тем быстрее пройдет сканирование. Сигнатура 01 00 00 00 явно будет слишком часто встречаться в памяти. Лучше взять 03 00 00 01 00 00 00 . Для начала найдем ее в памяти.

Сигнатура найдена, но она повторяется. Необходима более уникальная последовательность. Попробуем ED 03 00 00 01 00 00 00 .
В подтверждение уникальности получим такой результат:

Нам необходимо найти отступ от сигнатуры, чтобы получить ее стартовый адрес, а не адрес жизней. Пока сохраним найденную сигнатуру и отложим на некоторое время. Не беспокойся, мы к ней еще вернемся.
Жизненный цикл external
Используя функцию OpenProcess , внешние читы получают дескриптор для нужного процесса и вносят необходимые изменения в код (патчинг) или считывают и изменяют переменные внутри памяти игры. Для модификации памяти используются функции ReadProcessMemory и WriteProcessMemory .
Так как динамическое размещение данных в памяти мешает записать нужные адреса и постоянно к ним обращаться, можно использовать технику поиска AOB. Жизненный цикл external-чита выглядит так:
- Найти ID процесса.
- Получить дескриптор к этому процессу с нужными правами.
- Найти адреса в памяти.
- Пропатчить что-то, если нужно.
- Отрисовать GUI, если он имеется.
- Считывать или изменять память по мере надобности.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Как ломают видеоигры и выкладывают их пиратские копии
Каждая компания, создающая игры, существует за счет проданных копий игры. Конечно же есть люди, которые считают необязательным платить деньги за то, что фактически можно получить бесплатно. Их называют пираты.
10 показов
7.9K открытий
Но возникает резонный вопрос: как появляются популярные игры в открытом доступе?
Для таких целей существуют целые группировки хакеров. Они за счет махинаций получат желаемое и перепродают по более низкой цене на своих сайтах с непроходимыми рекламными баннерами. Конечно же это просто колоссальный ущерб для компаний-разработчиков. Потому и изобретают новые и обновляют старые технологии защиты от пиратства.
Что такое Denuvo
На сегодняшний день самая популярная и эффективная технология от пиратства носит название — Denuvo .
Denuvo Anti-Tamper, или Denuvo — технология защиты от несанкционированного взлома, разработанная австрийской компанией Denuvo Software Solutions GmbH, была выпущена в 2014 году.
Сразу встал вопрос: как он работает?
На сегодняшний день компания Denuvo Software Solutions не раскрывает тайну шифрования. Однако в ноябре 2014 появились сообщения, что «технология постоянно зашифровывает и расшифровывает себя на носителе так, что невозможно сломать». Но сразу же появилось контр-сообщение от самой компании: «технология не постоянно зашифровывает и расшифровывает любые данные на носителе. Для этого не было бы никакой пользы с точки зрения безопасности или производительности».
Уже 1 декабря 2014 появилось сообщение от китайской варез-группы 3DM, утверждавшей, что сломала эту технологию. Группа отметила, что эта технология включает в себя «64-битную шифровальную машину», которая требует криптографических ключей, уникальных для конкретного оборудования каждой установленной системы.
И пошли «кряки» игр…
Позже, в начале декабря та же группа выпустила «кряк» для игры Dragon Age: Inquisition, которая использовала Denuvo Anti-Tamper для защиты. Большой шаг для пиратов и еще больший шаг для компаний.
Ведь на то, чтобы сломать эту игру, 3DM нужно было потратить почти месяц непрерывной и кропотливой работы. Это, безусловно, удивило всех, ведь обычно так долго игры еще не держались. В конце концов, компания Denuvo заявила: «каждая защищенная игра в конечном итоге может быть сломана».
По итогам Ars Technica основная масса законных продаж игры происходит в течение 30 дней. Аргументируясь этим утверждением, компании могут спокойно положиться на технологию Denuvo.
Известно только о принципе работы технологии. Игры, защищенные Denuvo, требуют повторной онлайн-активации для каждого обновления аппаратной части. Denuvo ограничивает количество активаций на 4 обновления оборудования в течение 24 часов.
Работа над прочностью
Технология постоянно обновлялась. И в январе 2016 года варез-команда 3DM заявила, что прекращает свое исследование по Denuvo Anti-Tamper на год.
Причиной тому явилась чрезмерная сложность, с которой столкнулась команда во время взлома Just Cause 3.
Последние слова в феврале звучали так: «пиратство игр умирает и примерно через два года совсем прекратит свое существование».
Но сыграло очередное воспаление биполярных расстройств. Через несколько дней, после «официального» завершения дел, основательница 3DM Су Фэйфей заявляет что они НИКОГДА не сдавались, и у них есть решение как сломать Just Cause 3, FIFA 16. Несмотря на это заявление, официально «кряк» не получился, его можно было получить только посторонними способами.
И с того момента началось настоящее сражение Добра и Зла.
Одинокий самурай Voksi
Ровно через полгода, 6 августа, на сайте Skidrow появляется «кряк» игры DOOM от неизвестной команды REVOLT. Это событие было настоящим праздником для мира пиратов. Ведь крякнуть игру удалось хакеру с псевдонимом Voksi своими силами. После этого на ресурс были залиты кряки Rise of the Tomb Raider, Just Cause 3, INSIDE и другие. Но полноценным взломом это было назвать сложно. Скорее, это был обход защиты.
Но праздник длился недолго. Уже 8 августа компания Valve исправила этот «баг» с обходом Denuvo через Steam. И после этого все «кряки» было принято считать неактуальными. Выводом стало утверждение, что это был не злом, даже не обход Denuvo, а просто баг Steam, которым вовремя пользовался Voksi.
В тот же день, 8 августа, команда хакеров CONSPIR4CY (далее CPY) выложила в сеть полноценный взлом Denuvo в виде «кряка» для игры Rise of the Tomb Raider, который уже не нуждается в Steam вообще.
Игра в одни ворота
23 августа появился пост на Reddit, что CPY взломали новую игру, которая снова больше не нуждается в Steam. Жертвой стала INSIDE. И началась игра в одни ворота.
7 сентября 2016 CPY выпускает полноценный «кряк» уже для игры DOOM. А 23 ноября тем же CPY был выпущен «кряк» для Deus Ex: Mankind Divided. Такие безумные темпы возмутили компании, в продуктах которых была Denuvo. Одна за другой они стали отказываться от защиты Denuvo Anti-Temper и делали свои игры бесплатными. Так разработчики игры INSIDE убирают Denuvo из своей игры и она становится доступна в сервисе GOG. И уже 8 декабря id Software тоже удаляет Denuvo из своей игры DOOM. Но через 2 дня, 10 декабря, технология Denuvo была удалена компанией Crytek из своей игры The Climb.
Как ответила Denuvo
После этого Denuvo пошла в кардинальные меры. Компания добавила двойную защиту под названием IDMProtect. Первой игрой, имевшей такую защиту, стала Assassins Creed: Origins. Но все очень быстро поняли, что эта защита очень сильно «ест» производительность процессора. Такой расклад не устроил даже держателей горячих AMD FX. Хотя, несмотря на этот фактор, игра продержалась целых 3 месяца. Успешно.
И тогда в ход пошла Denuvo 5.0. Продукт, который без устали восхваляли разработчики. К сожалению, она была сломана через 2 недели. Да-да, это снова дело рук того же Voksi. После чего в его дом наведалась полиция и забрала его в отделение.
Какие игры держались дольше всех
Итак, игры взломались в день релиза, и компании не получали желаемую прибыль. Более того, они несли большие убытки. Чтобы вы понимали, годовое использование Denuvo 5.0 для игры Crysis: remastered, компании Crytek обходилось в 126 тысяч евро. Кстати эти данные были получены в результате взлома серверов Crytek и Ubisoft. Как иронично…
Хотя в любом случае даже такой термин без взлома — своего рода победа. Рекордсменами в качестве защиты стала известная компания Rockstar Games и их игра Red Dead Redemption 2. Она была не по зубам хакерам в течение 11 месяцев. Почти год! И хотя это может вас удивить, но Denuvo там даже не пахло.
На обороне стояли сразу две системы защиты — Digital.IO и персональная защита от Rockstar вшитая в SocialClub. Все дело в том, что в RDR 2 большое количество спецэффектов, и когда игра понимала, что ее хакнули — срабатывали разного рода «костыли». По типу вечно пьяной камеры, мешавшей решетке, потемнение в глазах и т. п.
Интересным фактом является то, что компания CDProject Red отказалась от какой-либо защиты своего Cyberpunk 2077. И основную выручку компании произвели пользователи, испытавшие игру на PlayStation.
Мы уже узнали, что статус настоящего крепкого орешка имеет игра Red Dead Redemption 2.
Также свою мощь показали: Dying Light 2: Stay Human, которую сломали только через 183 дня после релиза, и Guardians of the Galaxy, которую сломали только через 248 дней после релиза. Рекордсменом также является игра The Quarry, которая на сегодняшний день носит статус «не сломана», и держится 77 дней. Дополнительные сведения о статусе игр можно просмотреть по ссылке .
А какая же игра продержалась меньше всего?
Да, выше было сказано, что большинство игр крякают в день релиза. Но настоящим рекордсменом по ненадежности стала игра Hitman 2, которая была крякнута… за 3 дня до официального релиза!
В это трудно поверить, но кряк получился раньше официальной версии. К сожалению, пиратская версия становилась не на все системы.
Это сражение будет вечным. Добро со злом. Пираты с компаниями. Пока не найдется один компромисс, который устроит всех. «Сломать можно все что угодно, не существует полностью безопасной системы» — цитата из фильма «V — значит Vendetta».
Основы реверсивной инженерии или как взламывают игры
Реверсивная инженерия — изучение того, как устроено какое-то программное обеспечение, с целью понять механизм его работы. Эта информация может использоваться в будущем для создания похожего продукта или внесения изменения в уже существующий.
30 показов
75K открытий
Я хочу рассказать о том, как с помощью реверсивной инженерии можно вносить изменения в игры на ПК. Не обязательно с целью взлома, иногда это используется для исправления багов, которые разработчики не исправили по каким-то причинам. Так, например, существует проект Forged Alliance Forever, будучи участником которого я исправил пару багов в игре Supreme Commander, которая пользуется большой популярностью до сих пор, но из-за проблем между издателем и разработчиком поддержка игры была прекращена.
Эта статья будет интересна тем, кто занимается разработкой программного обеспечения на языках высокого уровня и интересуется тем, как оно работает на более низком уровне. А также всем тем, кто просто любит игры и хочет знать об их устройстве больше.
Как это работает
Когда мы пишем какое-то ПО, то чаще всего, мы выбираем инструментарий, подходящий лучше всего под эту задачу. В современных играх код пишется на компилируемых языках высокого уровня. Конечно, можно вспомнить Minecraft на Java, который в конечном итоге все-таки переписали на плюсах.
Здесь стоит уточнить, что часто та часть приложения, которая критична для производительности, пишется на компилируемом языке, в то время как логика может быть на чем-то скриптовом, типа Lua, который уже обращается к ядру движка.
Код на языке высокого уровня с помощью компилятора превращается в машинный код, состоящий из инструкций для процессора определенной архитектуры. При запуске, процессор последовательно выполняет инструкции, а наше приложение работает.
А как мы можем на это повлиять?
Для того, чтобы внести изменения в ход работы программы, нам необходимо отредактировать эти самые инструкции. Для этого нам потребуется определенный инструментарий, позволяющий нам внедряться в работу программы. Основным инструментом нам послужит дебаггер, я пользуюсь x64dbg.
Дебаггер — программа, которая подключается к (например) игре и позволяет ковыряться в ней во время ее работы. Она позволяет выполнять инструкции последовательно, менять содержимое регистров и стека.
Надеюсь, вы еще не запутались окончательно.
Регистры — это небольшие участки памяти процессора, которые он использует при выполнении команд. У каждого регистра есть своя задача, например, один используется для возвращаемого функцией значения, другой хранит в себе аргументы, а третий — следующую инструкцию, которая будет выполнена.
Стек используется для хранения информации, которая используется программой. Он нам мало интересен, кроме его особенности в хранении информации в упорядоченном виде.
Вот так выглядит приложение под в режиме отладки (дебага) в x64dbg
Хватит нудятины, когда будем взламывать?
Уже скоро, осталось только уяснить особенности взлома игр и способы достижения результата.
Получение дополнительных ресурсов
Тут все предельно просто — находим ячейку в памяти, в которой хранится количество патронов или жизней, меняем на то, которое позволяет собственная жадность. Главное, чтобы жадность не превышала размер типа данных, иначе приложение рухнет. Этим многие из нас баловались еще во времена ArtMoney.
Хочу видеть через стены!
Это посложнее, здесь мы уже перехватываем выполнение функций графической подсистемы. (Чаще всего DirectX или OpenGL). Для этого мы создаем динамическую библиотеку DLL, которая меняет адрес нужной нам функции на нашу, которая потом вызывает и оригинальную функцию, и наш код, рисующий врагов!
DLL подменяет адрес функции в таблице адресов программы, кажется, мы подсмотрели это поведение у кукушек.
Хочу раздавать хэдшоты в каэсочке!
Здесь мы тоже получаем информацию о противниках из памяти игры, а разница между позицией игрока и противника и будет вектором, куда нам надо стрелять. Останется только повернуть игрока в нужном направлении, раз он сам не в состоянии.
Ну что народ, погнали?
Поскольку в реальной жизни отладка занимает просто колоссальное количество времени, мы опробуем свои силы на чем-то простом, чтобы уложиться в рамки статьи. У меня под рукой оказалась The Outer Worlds, над которой мы сегодня и будем паразитировать.
В игре есть механика заточки оружия, платим деньги — получаем улучшенное оружие.
Первым делом попробуем исправить баг с необходимостью платить за это. Для этого найдем в памяти адрес, где хранится количество украденных предварительно денег. Проще всего это делать все-таки с помощью Cheat Engine, ибо он дает возможность быстро отсортировать измененные значения и показывает адрес памяти.
Находим количество денег, тратим немного, фильтруем те значения, которые нас устраивают. В итоге остается одно значение, которое и является нашим количеством денег.
Теперь берем адрес памяти, в котором хранятся деньги, подключаем дебаггер к игре и просим его оставить выполнение программы, если она попытается изменить значение переменной в следующий раз.
Синяя линия внизу — текущая команда процессора. Именно в этом месте и меняется значение денег. Огибающие линии сверху показывают, что мы находимся в нескольких уровнях вложенности, а команды jl как раз и являются проверками каких-то условий.
Далее мы поднимаемся немного наверх, добираемся до начала функции и попеременно меняем условия, которые в дебаггере подсвечиваются желтым цветом. Опытным путем мы узнаем, что если третье условие сработает, то мы не потратим деньги. Почему? Хороший вопрос, для этого надо проследить ход выполнения программы более внимательно, но результат не хочет ждать, поэтому вместо условия jl ставим безусловный переход командой jmp и наслаждаемся бесплатными улучшениями.
Измененная команда в дебаггере.
Самое сложное в реверсивной инженерии то, что изначально мы как слепые котята тыкаемся и меняем условия с надеждой на достижение результата. Но если разобраться в том, что делают команды и как работают компиляторы, то со временем вы начнете находить логические последовательности, понимать, как передаются в функции аргументы и т.д.
Исправление ошибки с максимальным уровнем снаряжения
Еще в игре есть досадная ошибка разработчиков, влияющая на баланс, — оружие можно улучшать только на пять уровней выше персонажа. Что ж, исправим это!
Первым делом необходимо найти в памяти уровень персонажа. Это можно сделать предварительно накрутив себе опыта. Как только у нас есть информация об уровне персонажа, мы снова любезно просим дебаггер приостановить работу игры в момент обращения к памяти по этому адресу.
Когда нужно что-то найти в памяти, Cheat Engine приходится очень кстати. Чаще всего необходимо найти базовый адрес, это делается довольно просто, но немного выходит за рамки статьи.
Игра показывает нам сообщение о том, что нельзя улучшить снаряжение, когда мы наводим на него курсор, а чтобы убедиться в этом, ей необходимо сравнить уровень снаряжения с текущим уровнем игрока. Именно в этих местах мы вместо уровня персонажа подсунем ей число.
Редактируем команду — заменяем обращение к адресу в памяти [rax+310] константным значением 1000
После чего доверчивая игра позволяет нам ковать столько, сколько вздумается.
Обратите внимание на уровень персонажа и уровень винтовки, теперь можно отыгрывать Men In Black, у нас же все-таки рпг, не так ли?
Фиксируем прибыль
После того, как мы исправили все баги в игре, мы хотим чтобы они больше не появлялись ни у нас, ни у наших друзей. Для этого мы должны пропатчить исполняемый файл игры. Исправляем файл, кладем рядом с оригинальным и в следующий раз запускаем уже его.
Список изменений в программе, которые будут внесены в исполняемый файл
Таким образом мы с вами познакомились с чудесным миром реверсивной инженерии, разобрались, как взламывают игры и, на примере The Outer Worlds, исправили несколько багов в игре. Конечно, в реальной жизни это занимает гораздо больше времени и чаще всего взлому подвергаются онлайн-игры, которые имеют свою специфику из-за клиент-серверной архитектуры, но принципы работы остаются те же.
Реверсивная инженерия довольно непростой инструмент, требующий огромного количества времени и усидчивости, но цена чаще всего оправдывает себя.
