Как изменить данные в игре. Защищаем исходный код. Защищаем память игры

  • Unity ,
  • Информационная безопасность ,
  • Реверс-инжиниринг
    • Перевод
    • Tutorial

    Когда речь идёт о программном обеспечении, термин «взлом» зачастую ассоциируют с пиратством и нарушением авторских прав. Данная статья не об этом; напротив, я решительно не одобряю любые действия, которые прямо или косвенно могут навредить другим разработчикам. Тем не менее, эта статья всё же является практическим руководством по взлому. Используя инструменты и методы о которых далее пойдёт речь, вы сможете проверить защиту собственной Unity игры и узнаете, как обезопасить её от взлома и кражи ресурсов.

    Введение

    В основе взлома лежит знание : необходимо понимать особенности компиляции Unity-проекта, чтобы его взломать. Прочитав статью, вы узнаете, каким образом Unity компилирует ресурсы игры и как извлечь из них исходные материалы: текстуры, шейдеры, 3D-модели и скрипты. Эти навыки будут полезны не только для анализа безопасности проекта, но также для его продвинутой отладки. В связи с закрытостью исходного кода, Unity часто работает как «черный ящик» и порой единственный способ понять, что именно в нём происходит - это изучение скомпилированной версии скриптов. Кроме прочего, декомпиляция чужой игры может стать серьёзным подспорьем в поиске её секретов и «пасхальных яиц». Например, именно таким образом было найдено решение финальной головоломки в игре FEZ.

    Находим ресурсы игры

    Рассмотрим для примера игру, собранную под ОС Windows и загруженную через Steam. Чтобы добраться до директории, в которой находятся нужные нам ресурсы, откроем окно свойств игры в библиотеке Steam и в закладке «Local files» нажмём «Browse local files…».

    Когда Unity компилирует проект под Windows, ресурсы всегда упаковываются по схожей схеме: исполняемый файл (например, Game.exe) будет находится в корне директории игры, а по соседству расположится директория, содержащая все игровые ресурсы - Game_Data .

    Извлекаем текстуры и шейдеры

    Большинство ресурсов Unity-проекта упаковываются в файлы проприетарного формата с расширениями.assets и.resources . Наиболее популярный на сегодняшний день инструмент для просмотра таких файлов и извлечения из них ресурсов - Unity Assets Explorer .

    Графический интерфейс программы не отличается удобством, а также она страдает от нескольких критических багов. Не взирая на это, программа вполне способна извлечь большинство текстур и шейдеров из игры. Полученные в результате текстуры будут иметь формат DDS, который можно «прочитать» с помощью Windows Texture Viewer .

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

    Извлекаем 3D-модели

    Трёхмерные модели в типовой Unity-сборке «разбросаны» по различным ресурсам, а некоторые из них и вовсе могут генерироваться во время игры. Вместо копания в файлах, существует интересная альтернатива - получить данные о геометрии прямиком из памяти графического ускорителя. Когда игра запущена, вся информация о текстурах и моделях, видимых на экране, находится в памяти видеокарты. С помощью утилиты 3D Ripper DX можно извлечь всю эту информацию и сохранить в формате, понятном 3D-редакторам (например, 3D Studio Max). Учтите, что программа не самая простая в обращении - возможно, придётся обратиться к документации.

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

    Защищаем исходный код

    Раз Unity не заботится о сохранности нашего кода - сделаем это сами. Благо, существует утилита, готовая автоматически зашифровать плоды нашего интеллектуального труда: Unity 3D Obfuscator .

    И хотя программа отлично справляется со своими обязанностями, многие классы, адресуемые извне родной библиотеки, всё же не могут быть зашифрованы без риска нарушения связанности - будьте осторожны!

    Взламываем память игры

    Cheat Engine - широко известная программа для взлома игр. Она находит ту область оперативной памяти, которая принадлежит процессу запущенной игры и позволяет произвольно её изменять.

    Эта программа пользуется тем фактом, что разработчики игр очень редко защищают значения переменных. Рассмотрим следующий пример: в некой игре у нас есть 100 патронов; используя Cheat Engine, можно выполнить поиск участков памяти, которые хранят значение «100». Затем мы делаем выстрел - запас патронов составляет 99 единиц. Снова сканируем память, но теперь ищем значение «99». После нескольких подобных итераций можно с легкостью обнаружить расположение большинства переменных игры и произвольно их изменять.

    Защищаем память игры

    Cheat Engine столь эффективна от того, что значения переменных хранятся в своём изначальном виде, без какой-либо защиты. Серьёзно усложнить жизнь «читерам» довольно просто: нужно лишь немного изменить способ работы с переменными. Создадим структуру SafeFloat , которая послужит нам безопасной заменой стандартного float:

    Public struct SafeFloat { private float offset; private float value; public SafeFloat (float value = 0) { offset = Random.Range(-1000, +1000); this.value = value + offset; } public float GetValue () { return value - offset; } public void Dispose () { offset = 0; value = 0; } public override string ToString() { return GetValue().ToString(); } public static SafeFloat operator +(SafeFloat f1, SafeFloat f2) { return new SafeFloat(f1.GetValue() + f2.GetValue()); } // ...похожим образом перегружаем остальные операторы }

    Использовать нашу новую структуру можно следующим образом:

    SafeFloat health = new SafeFloat(100); SafeFloat damage = new SafeFloat(5); health -= damage; SafeFloat nextLevel = health + new SafeFloat(10); Debug.Log(health);

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

    Заключение

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

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

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

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

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

    Также например в GTA San Andreas, я открыл архив с помощью специального архиватора, увидел что все текстуры сохранены в игре в специальных файлах. Эти файлы можно было вытащить и редактировать их с помощью фотошопа простого. Так я поменял там цвет футболок у бандитов, изначально они были зеленые и фиолетовые, а я сделал синие и красные как у настоящих банд в США.

    Системные файлы в этой игре лежали просто в.ini и.dat и были благоприятны для редактирования. Создатели специально даже там написали какие-то пожелания для тех кто будет редактировать, например в некоторых файлах сказали ничего не трогать иначе игра не будет работать, а в каких-то объяснили по какому алгоритму нужно изменять значения.

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

    Из этой статьи вы узнаете из чего состоит приложение для андроид, как открыть APK файл и при помощи каких программ.

    Что такое APK файл?

    APK - формат операционной системы Android, использующийся для архивных исполняемых файлов-приложений, причем название самого файла может быть любым, а вот расширение должно выглядить только так.apk. Аналогами APK в других ОС являются в Windows .msi, в Symbian - .sis, в Linux - .rpm или.deb.

    Смотрим что внутри
    По сути.apk это ZIP архив, поэтому посмотреть на внутреннее устройство можно воспользовавшись любым файловым менеджером или архиватором, например WinRAR или мобильным приложением X-plore.





    При этом стоит помнить что вы получаете лишь визуальный доступ к внутренним ресурсам, возможности редактирования крайне ограничены.
    Рассмотрим структуру
    Внутри.apk мы видим ряд файлов и папок, давайте узнаем для чего они служат:
    • AndroidManifest.xml - это своего рода "паспорт" приложения из которого можно узнать все основные моменты, требования, версию, разрешения и прочее.
    • META-INF этот фаил содержит метаданные, то есть данные о данных, контрольные суммы, пути к данным, пути и контрольные суммы ресурсов, сертификаты. Открыть этот фаил можно любым текстовым редактором, но рекомендуется использовать Notepad++.
    • Папка res содержит все ресурсы программы, графические, такие как иконки, картинки, текстовые, элементы графического интерфейса. Получить доступ к папке так же можно без труда.
    • classes.dex - непосредственный программный код приложения, выполняемый виртуальной машиной Dalvik VM, увидеть что внутри этого файла можно лишь декомпилировав.apk, об этом мы расскажем в других статьях. resources.arsc -скомпилированный файл XML, данный фаил содержит данные о всех ресурсах задействованных в программе.
    • lib - папка с нативными библиотеками, получить доступ к ресурсам которой можно лишь при использовании специализированных программ. Так же в APK могут встречаться такие файлы и папки как com, org, udk, но далеко не всегда.

    Теперь рассмотрим внутреннюю структуру более подробно для этого нам понадобиться программа для декомпиляции, Java и АПК-файл. Основным инструментом для разборки.apk является Apktool, но данная программа работает только со строки, что не очень удобно. Для более быстрого и удобного разбора можно использовать APKing, это все та же Apktool, но с возможностью работы из контекстного меню.
    И так устанавливаем APKing как любое приложение для Windows и выбрав.apk нажимаем на него правой клавишей мыши и одновременно Shift, после чего увидим следующее:


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


    Открыв папку мы получим доступ ко всем ресурсам АПК файла.


    Теперь все текстовые файлы можно редактировать, при этом соблюдая основные правила, можно использовать популярную программу Notepad++, для примера рассмотрим AndroidManifest.xml