- 503
- 229
Оригинал (самый крутой форк LJD на данный момент):
Декомпилятор не мой. Автор – Andrian Nord, а форк принадлежит ZNix'у. Лицензия и копирайты остались на своих местах. Я лишь внёс изменения, которые перечислены ниже.
Изменения (исправления сделаны не до конца и коряво, зато работает!.. Наверное):
Чтобы декомпилировать, нужно также, как и до этого, установить Питон и перетащить скрипт на "decompile.py".
Для того чтобы дизассемблировать, нужно перетащить скрипт на "disassemble.py". Он применяет новоиспечённый параметр "--no-asm-comments" для того, чтобы процесс дизассемблирования был максимально быстрым. Если комментарии нужны, то придётся запускать декомпилятор со своими параметрами через командную строку, либо редактируя "disassemble.py" на 16-ой строке.
P. S. Актуальная версия в архиве "LJD (2)".
Files · devel · Campbell Suter (ZNix) / luajit-decompiler · GitLab
LuaJIT decompiler - forked from https://github.com/Aussiemon/ljd/
gitlab.com
Изменения (исправления сделаны не до конца и коряво, зато работает!.. Наверное):
- Отключён грязный фикс "repeat ... until true" циклов, вызывавший ошибки.
- Исправлен баг с циклами "for", когда декомпилятор считал переменную в теле цикла, объявленную до цикла, за новую.
- Отключён код, отвечавший за складывание таблиц, который делал это не до конца, чем вызывал генерацию поломанного кода.
- Исправлен случай, когда декомпилятор не учитывал отсылки на локальные переменные из дочерних прототипов (функций).
- Разрешено упрощение функций, которые используются только единожды: объявляются и сразу вызываются; как в https://github.com/marsinator358/luajit-decompiler-v2.
- Добавлено игнорирование большинства мусорных инструкций (в консоль пишется, что они удаляются, но это только для декомпилятора, содержимое файлов остаётся прежним).
- Исправлен случай, когда узлы могли посещать самих себя, что приводило к бесконечной рекурсии (только для логических, унарных и математических операций).
- Увеличен лимит рекурсии до 1 миллиона (рекомендуется держать диспетчер задач наготове при работе с большими скриптами)
- Исправлено добавление повторяющихся ссылок на объекты, что могло приводить к переполнению памяти во время декомпиляции.
- Убрано множество проверок, которые препятствовали декомпиляции (и так сойдёт).
- Добавлена возможность направить вывод дизассемблера в файл. Для этого нужно, чтобы название файла на выходе оканчивалось на ".asm".
- Исправлен один из случаев, когда дизассемблер мог впадать в бесконечный цикл из-за некорректной инструкции при генерации комментария.
- Исправлен недочёт, когда дизассемблер прекращал работу, если он не мог сгенерировать комментарий к инструкции из-за ошибки. Вместо этого, комментарий просто не будет добавлен.
- Добавлен параметр "--no-asm-comments", отключающий генерацию комментариев к инструкциям, что существенно ускоряет процесс дизассемблирования больших скриптов и уменьшает размер файла на выходе, особенно для скриптов с намеренно испорченным байт-кодом.
- Добавлен параметр "--asm-comment-length-limit", ограничивающий длину комментариев к инструкциям до указанной, но комментарии также генерируются, поэтому на скорость почти не влияет.
- Исправлен случай, когда дизассемблер крашился из-за того, что не мог дизассемблировать прототип, загружаемый инструкцией "FNEW" (если загружаемый прототип на деле оказывался строкой, числом, или его не было вовсе).
- Прочие мелкие, корявые фиксы, разбросанные по всему коду.
Чтобы декомпилировать, нужно также, как и до этого, установить Питон и перетащить скрипт на "decompile.py".
Для того чтобы дизассемблировать, нужно перетащить скрипт на "disassemble.py". Он применяет новоиспечённый параметр "--no-asm-comments" для того, чтобы процесс дизассемблирования был максимально быстрым. Если комментарии нужны, то придётся запускать декомпилятор со своими параметрами через командную строку, либо редактируя "disassemble.py" на 16-ой строке.
Пример использования с ограничением длины комментариев:
python main.py --enable_logging --catch_asserts --asm --asm-comment-length-limit=100 --file="input.lua" --output="output.asm"
Я не стал лазить своими грязными руками в новом декомпиляторе лужи от Марсинатора по причине того, что он написан на C++, а это страшно!!! На самом деле дело не совсем в этом, а в том, что у него уже из коробки есть пара дыр: как минимум его можно заставить читать невыделенную область памяти намеренно испорченным байт-кодом. А учитывая мои руки-крюки, я бы сделал только хуже: сначала он просто не такой байт из памяти считает, а потом уже какой-нибудь Лолендор через твою вебку смотрит на то, как ты душишь своего питона на исходники ЛуаЖит . Да и такой подход не самый верный, лучше будет сделать какую-нибудь отдельную программку, которая будет избавлять байт-код от нечисти, чтобы его можно было потом уже любым декомпилятором открыть, и сделать основой этого технику для оптимизации DCE (Dead Code Elimination), ведь большая часть мусорного кода тупо лежит мёртвым грузом, а иначе бы она заставила лужу конкретно так просраться.
P. S. Актуальная версия в архиве "LJD (2)".
Вложения
Последнее редактирование: