Источник: два пользовательских вложения EXTRACTresources.txt и EXTRACTresources-2.txt, фактически ZIP-архивы. Сохранены как EXTRACTresources.zip и EXTRACTresources-with-tool.zip вне Git. Все 228 Lua-файлов в них побайтово одинаковы; во втором архиве дополнительно находится Linux ELF EXTRACTresources/cLuaDecompiler размером 1 212 432 байта.
Происхождение скриптов из resources.dspack указано пользователем; сам игровой контейнер не предоставлен. Архивы распакованы с проверкой путей и сохранением регистра и структуры папок.
228 восстановленных исходников. Все выбраны из обычного режима unluac после сравнительной проверки трёх декомпиляторов. Каждый исходник повторно скомпилирован Lua 5.1; у 228/228 полностью совпало исполняемое дерево с входным байткодом.
Входные файлы содержат суммарно 1 407 прототипов и 65 067 инструкций. Полный разбор и обратная сериализация каждого входа дали побайтовое равенство оригиналу.
| Инструмент / режим | Синтаксис корректен | Точное исполняемое дерево |
|---|---|---|
| LuaDec, стандартный | 149 / 228 | 91 / 228 |
LuaDec, -dg |
114 / 228 | 74 / 228 |
LuaDec, -a |
175 / 228 | 0 / 228 |
| unluac, стандартный | 228 / 228 | 228 / 228 |
unluac, --nodebug |
202 / 228 | 0 / 228 |
cLuaDecompiler, --dec |
227 / 228 | 99 / 228 |
cLuaDecompiler, --dec --annotate --debug |
223 / 228 | 99 / 228 |
«Не совпало» не обязательно означает неправильное поведение: другой эквивалентный код также может отличаться по инструкциям. Однако при наличии точно совпадающего варианта предпочтение отдано ему. Успешный код выхода декомпилятора не считается доказательством корректности: например, cLuaDecompiler завершился с кодом 0 во всех перечисленных запусках, но часть исходников не компилируется. LuaDec -dg аварийно завершился на одном файле; ошибка сохранена в диагностике.
В отличие от предыдущего восстановления boot, теперь бинарник доступен. Его SHA-256 записан в provenance.json. Подлинность и соответствие конкретному релизному тегу независимо не установлены.
Для каждого из 228 файлов выполнены четыре отдельных запуска:
cLuaDecompiler --dec input.lua
cLuaDecompiler --dec --annotate --debug input.lua
cLuaDecompiler --dis input.lua
cLuaDecompiler --ssa-dump input.luaВсе 912 запусков завершились с кодом 0. Это статистика выполнения, не гарантия корректности SSA или декомпиляции. Обычный и аннотированный исходники отдельно проверены luac и включены в сравнение кандидатов. Дизассемблирование и SSA сохранены в итоговом ZIP, вместе со stdout/stderr и результатами других инструментов.
--lua-version 51 не понадобился: заголовки корректно распознаны автоматически. Пользовательская --opcode-table не применялась: стандартное сопоставление опкодов уже обеспечило точное восстановление, доказательств необходимости другого нет. --help сохранён в архиве.
Дополнительно LuaDec запускался с -dis, -pn, -fc. Результаты -fc относятся только к стандартному варианту LuaDec, а не к выбранному unluac-исходнику.
Для каждого файла сравниваются рекурсивно:
- байты всех инструкций;
- типы и байты констант;
- параметры, число upvalues, vararg и maxstacksize;
- порядок и содержимое вложенных прототипов.
Отладочная информация (имена источников, локальных переменных, номера строк) в это равенство не входит. Оригинальные комментарии и форматирование не восстанавливались. В игре скрипты не запускались, функции движка не имитировались. Совпадение — статическая проверка байткода, а не тест игрового поведения.
Для LuaDec с 64-битным size_t созданы переносимые копии входного Lua 5.1, с пересериализацией длин строк. Равенство их разобранных деревьев проверено. cLuaDecompiler и unluac работали напрямую с оригинальными файлами.
Используйте новый пустой рабочий каталог и инструменты, описанные в provenance.json:
python tools/recover_boot.py /path/EXTRACTresources.zip \
--work-dir /path/resources-recovery \
--luadec /path/luadec --luac /path/luac \
--java /path/java --unluac /path/unluac.jar \
--clua /path/cLuaDecompilerИмя recover_boot.py сохранено для совместимости; скрипт подходит и для resources. Параметр --clua теперь не только сохраняет диагностику, но и добавляет обычный/аннотированный результат в общий отбор с проверкой повторной компиляцией. Приоритет — точное равенство исполняемого дерева; синтаксическая корректность сама по себе недостаточна для утверждения о восстановлении.
В manifest.json содержатся SHA-256 входов и выбранных исходников, результаты всех семи вариантов и коды выхода диагностических режимов. Исходные бинарные чанки, инструменты и объёмная диагностика в Git не добавлены; исходные чанки и диагностика доступны в ZIP-результате. Игровым скриптам новая лицензия не назначается.