Как декомпилировать игры

Маленькое пособие для тех, кто интересуется, как устроены их любимые интерактивные работы. Разберём все популярные и не очень популярные движки.

Фотоиллюстрация статьи: Alexander Andrews

Ren'Py

Вам понадобится Python 2, rpatool и декомпилятор.

Сначала при помощи rpatool нужно разархивировать файлы RPA:

python rpatool -x scripts.rpa

Так легко посмотреть аудио и изображения из игры. Но так как нас интересуют скрипты, придётся пойти дальше. Скачайте файл un.rpyc и положите его в папку с игрой, а затем запустите саму игру. После этого она сама декомпилирует все .rpyc файлы в обычные .rpy на Питоне.

Z-машина

С Inform всё хитро, потому что у него две виртуальных машины: Z-машина и Glulx. Начнём со старенького.

В общем случае для файлов Z1-Z8 есть дезассемблер TXD, который входит в пакет ztools. Его придётся собирать из исходников на Си, но после этого всё довольно просто: ему достаточно указать адрес файла, и он выдаст его код. Сам код даётся в опкодах для Z-машины, поэтому он ничего не скажет непосвящённым людям, а вот полный список используемых строк в игре будет очень полезен. Это очень полезно, например, при переводах парсерок.

К сожалению, на играх RInform txd падает (по segfault) как только доходит до русских строк.

Самые старые файлы Z1-Z3 также открываются онлайн при помощи интерпретатора Encrusted. Просто откройте файл, нажмите на «гамбургер-меню» справа и выберите галочку «Show object tree», которая покажет дерево всех объектов в игре. Это не декомпиляция, но тоже интересно.

Для glulx есть декомпилятор mrifk. Он даёт полный псевдокод игры, вместе с комнатами, объектами, параметрами и глаголами, но тоже очень не любит RInform.

> «Sfbf 5so-nibtew ntgno( — rpqa7icafs Xlli- — Sfbf pqacea tgf poqa rpasw»-

Кроме того, есть онлайн-декомпилятор glulx-strings, который даёт полный список строк из игр Glulx, Z-машины, TADS 2 и TADS 3. Он не ломается на русских играх, но текст игр на RInform-Z6 будет зашифрован подстановкой. Пытливый читатель легко поймёт, из какой игры была цитата выше.

QSP

Формат QSP открывается QGen'ом. Этого достаточно, чтобы сделать патч к какой-нибудь чужой заброшенной игре.

Если игра защищена паролем, то можно воспользоваться декодером от AleksVersus.

Ink

Ink использует машиночитаемый формат JSON, в котором всё довольно прозрачно для человека, хотя трудно разобрать логику. По крайней мере, видны все строки. Обратной трансформацией пока никто не занимался.

Unity

Логика игры компилируется в DLL для виртуальной машины .NET, обычно под названиями Assembly-CSharp.dll, Assembly-CSharp-firstpass.dll и Assembly-UnityScript.dll. Они открываются декомпиляторами .NET: Telerik, dotPeek, ILSpy, Reflector. На выходе будет код на C#.

Конечно, уже существует платный обфускатор, который делает код менее читабельным.

Ресурсы распаковываются, например, через Unity Assets Explorer.

INSTEAD

Игры на INSTEAD шифруются как текст. Кодирование исходников идёт в обратную сторону при запуске игры, и в проекте с открытым исходным кодом легко посмотреть, как же оно устроено. И относительно легко повторить.

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

Справедливости ради, существует вариант с реальной компиляцией кода Lua, но им никто не пользуется, потому что байтовый код непереносим: пришлось бы выпускать несколько версий игры для каждой архитектуры (отдельно 32 бита, 64 бита, Android и так далее).

URQ

Незашифрованные игры на URQ достаточно открыть в текстовом редакторе. Опытные игроки называют это «прохождение в блокноте».

Алгоритмы декодирования QS1 и QS2 можно взять из исходников FireURQ.

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

ЯРИЛ

В ЯРИЛ тоже есть шифрование игр, и, что неожиданно, оно использует реальную криптографию — ключи DES. Написать собственный декодировщик DES уже гораздо сложнее чем пять раз перепройти «Комсомольца», так что ЯРИЛ останется единственной неприступной платформой в этом списке.

Twine

Пропустим другие HTML-платформы, потому что код игр на Javascript и HTML уже достаточно читабелен. Но вот Twine стоит подробного осмотра.

Во-первых, все игры Twine открываются в самом редакторе Twine. Игры Twine 1 открываются только в редакторе Twine 1 и то же самое для второй версии. Поэтому если вы хотите посмотреть исходники какой-нибудь игры, её достаточно импортировать в редактор.

Кроме того, при помощи программы tweego HTML-файл можно преобразовать в приличный человеческий черновик для редактирования.

TADS 2 (дополнение)
Кроме вышеупомянутой страницы, которая достаёт все строки из игры, есть ещё один скрипт на Perl, который полностью декомпилирует игру. Если запустить его в командной строке, то вы получите файл .t со всеми функциями игры.

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

В заключение

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

2 комментария

Enola
Наконец-то нормальная статья. Жаль неполная. Дополняю.

Ren'Py
Можно проще. Уже делали готовые батники, чтобы не ставить самостоятельно ничего лишнего. Плюс минимальный гуи. Скачать, положить в папку с игрой, запустить батник, выбрать нужный пункт. На английском только.
Для винды
Линукс и мак
Скачать можно и без регистрации на форуме.

QSP
На куспе есть ещё одна хитрость, помимо пароля. Можно в конечный файл игры (через txt2gam) вписать несколько локаций с одинаковым названием, тогда qgen выдаст ошибку и не откроет файл. Был ещё AeroQSP, там есть нюансы по открытию.

URQ
Всё же проще, чем собирать из исходников.
QS1 расшифровывается в URQEdit, если повторно зашифровать уже зашифрованный файл. (Сорри за тавтологию).
Для QS2 была готовая программка, но есть нюансы: только под винду и не работает в современных (64-битных)системах, но реально запустить в виртуальной машине с Windows XP, например.
Также там ещё одна старая программка для разбора exe-файлов, когда объединяют плеер с игрой. Тоже для старых систем.
Ещё есть формат шифрования QS3 для старой akurq подробности. Готовых программ для расшифровки QS3 не видела.
Ещё есть шифрование от Фаертона, как в коде этой игры. Для неё я писала программу расшифровки (2 версии: на куспе и на питоне). Прикладывать не буду, так как мне стыдно за тот ужасный код, который может содержать баги. Но если кому-то сильно надо, пишите в личку, на почту, в дискорд. В общем знаете, где меня найти.

ADRIFT
https://ifwiki.ru/ADRIFT
Читала, что есть способ расшифровки. Но не пробовала, точного рецепта не знаю.

RPG Maker
Для извлечения файлов есть две программки:
Одна для RPG Maker MV https://bitbucket.org/SilicaAndPina/rpgmv-decryptor/downloads/
и вторая для всех остальных https://rpgmaker.ru/forum/utility/58724-raspakovshchik-zashifrovannykh-arkhivov-xp-vx-ace (сайт заблокирован не территории рф)
Комментарий отредактирован: 28 мая 2020, 23:35
realsonic
Только что увидел эту статью и даже упоминание ЯРИЛ. Стало смешно. Знали бы вы, как там реализовано шифрование… Впрочем, по коду, указанному в ссылке, можно всё понять. :)