Перейти к содержимому

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

  • автор:

Как декомпилировать код android игры написанной на unity

Есть игра на unity, но в ней нет файла /assets/bin/data/managed/Assembly-CSharp.dll и других dll
Игра точно на unity потому что заставка unity и папка /assets/bin/data/ есть.
В папке managed только папки etc, Resources, Metadata а в Resources файл unity_builtin_extra
В /assets/bin/data/ файлы типа
2cce4b02b6fb1654c97c0a7766e7b47c
441f5e3731f6e1d44b47d11bf0495a74.resource,
файл boot.config,
файл globalgamemanagers,
globalgamemanagers.assets,
level0-6,
sharedassets0.assets.split0,
и похожие по названию,
unity default resources.
Папка lib отдельно, находится в /mnt/asec/имя_пакета/split_config.armeabi_v7.apk

В /data/data/имя_пакета , /sdcard/Android/data/имя_пакета/files есть папки и il2cpp и Unity
Файлы в /assets/bin/data/ распаковываются с помощью unityex, в них похоже только ресурсы.

Отслеживать
задан 25 янв 2020 в 0:39
37 9 9 бронзовых знаков

Ну какие dll — это ж сборка для Андроида, а не для форточек. У Андрюши ядро Linux, библиотеки в основном .so , но для unix-систем расширение не главное, поэтому может быть и другое и вообще без расширения.

25 янв 2020 в 7:31

В этой игре используется Backend IL2CPP, это значит, что код грубо говоря транслирован из c# в c++ и скомпилирован с помощью компилятора в машинный код, это значит, что у вас не получится посмотреть код, можете использовать дизассемблер, но он в ваше случае можно сказать ничем не поможет.

28 янв 2020 в 19:17

@Aimon А в какой файл он компилируется, а то Assembly-CSharp.dll нет, и даже намека на dll в этой и других папках.

31 янв 2020 в 3:42

Путь к папке со скомпилированной библиотекой lib\пака в зависимости от архитектуры\ И там будет файл libil2cpp.so скриншот: imgur.com/04BjDKy

31 янв 2020 в 12:46

С помощью дизассемблера, но это вам особо ни чем не поможет потому-что с этого кода уже не получится получить c#, вот как выглядит ассемблер: imgur.com/iskRDHB, говоря простым языком вы уже не можете посмотреть код в этой игре на C#

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

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

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

Ren’Py

Сначала при помощи 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, но в моём тестировании исходник скомпилировался без ошибок только для игры на английском.

В заключение

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

Декомпиляция с помощью IDE

Доброго времени суток! Хочу заполучить исходный код игры дабы посмотреть, как она устроена. Насколько я понимаю, если файлы с исходниками недоступны, то код можно получить только с помощью декомпиляции. Походив по интернетам, увидел, что многие предлагают exeшник разбирать при помощи IDE. У меня Visual Studio Ultimate 2010. Как с ее помощью можно получить исходные коды игры?
З.Ы. А также хотел бы узнать, есть ли сайты, на которых выкладываются исходники игр.
Заранее спасибо всем ответившим по делу.

#1
16:42, 27 апр 2011

Developer47
> то код можно получить только с помощью декомпиляции.
Так ты получишь только то, что родил компилятор, а не исходники. Для Java/C# может и можно что-то вменяемое увидеть, но не для C/C++.

> А также хотел бы узнать, есть ли сайты, на которых выкладываются исходники игр.
Есть: http://sourceforge.net/

  • Developer47
  • Пользователь

#2
16:45, 27 апр 2011

RPGman
А все же, как с помощью IDE получить хотя бы то, что родил компилятор?

#3
16:46, 27 апр 2011

Начни отладку. Увидишь asm-листинг.

#4
16:49, 27 апр 2011

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

  • Developer47
  • Пользователь

#5
16:50, 27 апр 2011

RPGman
Спасибо. Заодно еще спрошу — какие еще есть способы заполучить исходные коды игры? Может быть, все же есть способ открыть файлы из папки с игрой?

#6
16:53, 27 апр 2011

Developer47
> какие еще есть способы заполучить исходные коды игры?
1. Подловить авторов в подворотне и отжать исходники (логины/пароли/ключи от сетевого хранилища).
2. Нанять шпиёна, или подготовить и внедрить инсайдера в контору, чья игра тебя заинтересовала.
3. Покопаться на трекерах, там частенько выкладывают «исходники Unreal Engine 3/ CryEngine 4» и т.д.

#7
16:59, 27 апр 2011

Используй IDA Pro

#8
16:59, 27 апр 2011

Developer47
> Спасибо.
Скачай API Logger 1.6 и DirectX Logger v2.2 с http://www.blackninja2000.narod.ru/ и будешь рад.

#9
17:01, 27 апр 2011

Что за игра кстати?

Тебе не нужны исходники ИМЕННО ЭТОЙ игры.
В интернете просто навалом исходников других подобных игр. Некоторые в свободном распространении (например все старые игры id Software), есть исходники сложного ММО проекта (Ryzom например), некоторые «краденые» тоже имеются. Если тебе для обучения премудростям — то качай любой подходящий нормальный исходник и изучай, пробуй компилить. Сразу можно будет спросить советов там же на каком-нибудь форуме.

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

  • Developer47
  • Пользователь

#10
18:26, 27 апр 2011

kvakvs
>Что за игра кстати?
Готика 3.
>например все старые игры id Software
Да ну? Я видел только исходники для Wolfenstein: Enemy Territory, да мне эта фирма не шибко интересна, т.к. у них мало (если вообще есть) ролевых игр, а мне хотелось бы именно RPG.
>некоторые «краденые» тоже имеются
О чем идет речь и где это достать?

#11
19:03, 27 апр 2011

Developer47
> Да ну? Я видел только исходники для Wolfenstein: Enemy Territory, да мне эта
> фирма не шибко интересна, т.к. у них мало (если вообще есть) ролевых игр
ftp://ftp.idsoftware.com/idstuff/

>>некоторые «краденые» тоже имеются
>О чем идет речь и где это достать?
Помню утекал исходный код Half Life 2

> а мне хотелось бы именно RPG
Вот, пожалуйста, полноценная игра без хаков, кряков, смс и регистрации
http://dev.ryzom.com/

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

  • Developer47
  • Пользователь

#12
19:24, 27 апр 2011

kvakvs
> Полноценную игру декомпилировать и получить
> из этой простыни малопонятного мусора пользу — просто нереально.
Ну ладно, хоть ссылки годные. Спасибо.

#13
22:57, 27 апр 2011

Правильно писать не IDE, a IDA.

#14
23:08, 27 апр 2011

Chipmunk
Как правильно, Иран или Ирак?
ТС сказал: «У меня Visual Studio Ultimate 2010»

Все об игре Ecstatica 2

IDA Pro при декомпиляции игры обнаружила около тысячи различных функций.
Их них три сотни являются в той или иной степени библиотечными. Оставшиеся 700 — это непосредственно код, написанный разработчиком.
Если я хочу полностью разобраться в коде игры, мне нужно декомпилировать их все. Возможно все функции декомпилировать и не требуется, но на то оно и хобби, чтобы заниматься тем, что нравится, а мне нравится этот процесс, да и узнаю много нового.

Я вижу два подхода к декомпиляции игры.
Первый, это по очереди декомпилировать каждую функцию, в том порядке, в котором они запускаются при запуске игры. Start, winInit и так далее.
Второй подход, это «лоскутная» декомпиляция. Ну вроде как мне нужно понять, как зашифрованы RAW файлы, я и изучаю UnpackBitmap и UnpackMask.
При первом подходе достаточно быстро можно разобраться в том, какие переменные инициализируется, где они используются и т.д. Можно легко понять, правильно ли работает декомпилированный код. Но вот если внести изменения в эти функции (добавить какой-либо функционал), то понять как это выглядит в игре не получится. Для этого нужно будет декомпилировать ВСЕ функции, что долго и не сразу.
При втором, можно сразу изучать интересные куски кода. Но опять же не хочется, чтобы получилось так, что я где-то допустил ошибку при декомпиляции, а проверить ее не могу, ведь связанного с работой этой декомплированной функции еще нет.

Поэтому, что я надумал. Я создаю exe-проект на visual basic (да, язык мертв, лучше использовать .net и т.д., но переучиваться не хочется, да и just-in-time компиляция есть только у VB, а это очень полезно для экспериментов), создаю там все модули, аналогично тому как было у Эндрю. И потихоньку пишу туда декомпилированный код, хоть по первому методу, хоть по второму.
Паралельно первому проекту я создаю второй уже dll-проект на VB, подключаю к нему те же самые модули, что есть и в первом и при подключении этой библиотеке к игре у меня появляется возможность подменять код игры своим.
Таким образом я убиваю двух зайцев, я всегда могу скомпилировать exe, который будет тестовой beta версией игры и тестировать ее. С другой стороны я могу скомпилировать dll и посмотреть как работает измененный код непосредственно в игре. Получается что я одновременно занимаюсь и рутиной (декомпиляция «по списку») и творчеством (модификация избранных функций).
Возникает проблема связанная с типом вызовов функций. В ecstaica.exe, написанной на watcom C практически все функции вызываются по watcom fastcall (два параметра передаются в EAX и EDX, остальные в стеке, возвращаемое значение в EAX), а бейсик использует stdcall (все параметры передаются в стеке, функция сама чистит стек, возвращаемое значение в EAX).
Проблема есть, но есть и способ ее решить. В теории достаточно доложить пару переменных EAX и EDX в стек и вызвать функцию VB. Она возьмет свои параметры из стека и не заменит подмены.
В общем как-то так:
push edx
push eax
call vbstdcallFunction ; «AddressOf vbstdcallFunction»
Возникает следующая проблема, а как узнать по какому адресу находится функция, как передать «AddressOf vbstdcallFunction» в ассемблер скомпилированного exe-шника? Тут как раз и проявляет себя преимущество native Dll. При загрузке библиотеки выполняется код, в котором я напишу функцию, которая будет уже в памяти патчить процесс и подставлять в call правильный адрес функции в адресном пространстве процесса. Магия 🙂
Это в теории, на практике себя проявит куча подводных камней, но я думаю, что смогу их обойти.

Вторая проблема будет посложнее. Программа оперирует большим количеством глобальных переменных, массивов и т.д. Как работать с этими глобальными переменными? И еще, если одни и теже модули у меня будут работать как в моей beta-exe версии игры и в dll как обеспечить универсальность?
Для этого я планирую написать два класса. Один класс будет коллекцией для классов, каждый из которых будет классом глобальной переменной. Этот класс, будет хранить текущее значение глобальной переменной в памяти VB программы и если он обнаружит, что запущен в процессе в виде dll будет заодно синхронизировать свое значение с данными игры в оперативной памяти. Классы коллекции будет написан так, чтобы он генерировал классы элементов по списку автоматически на основании данных файла в таком виде.
«noDie;variable;0» — название; тип — переменная; значение при загрузке
«ActionOffsets;array;2500» — название; тип — массив; количество элементов.
После того как коллекция будет создана обращаться к глобальным переменным как из exe-проекта, так и из dll-проекта можно будет идентично:
l_noDie = gl(«noDie»)
l_actionoffsets(1500) = gl(«ActionOffsets»,1500)
Над синтаксисом я еще поработаю, потому как искать переменную по строке это ОЧЕНЬ медленно, но пока ничего другого я не придумал.
После того, как я декомпилирую все 700 функций можно будет простой автозаменой превратить, например, gl(«ActionOffsets»,1500) в ActionOffsets(1500) и будет хорошо.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *