Декомпилятор, который восстанавливает алгоритм, а не только код
Организациям часто нужно понять софт, исходников к которому нет: старая система, купленный компонент, файл, который откуда-то пришёл и выглядит подозрительно. Инструменты, превращающие машинный код обратно в читаемые шаги, уже есть. RetDec Imortek пытается пойти на шаг дальше и назвать эти шаги — вот тут улучшенный стандарт шифрования (AES), тут сортировка, а тут упаковка данных для отправки.
Апстрим RetDec v5.0 не развивается с 2022 года. Это по-прежнему один из немногих открытых декомпиляторов с действительно широким фронтендом — и эту широту стоит сохранить живой.
Что это такое за минуту
Софт поставляется в виде, который читает машина, а человек — нет. Когда исходников нет — поставщик исчез, в договоре их не было, файл пришёл от того, кому вы не доверяете — никто не скажет, что программа на самом деле делает. Проверять вручную — значит читать машинные инструкции по одной.
Он разбирает скомпилированный файл и восстанавливает из него C: все 216 бинарников в тестовом корпусе возвращаются собираемым C. Потом он берётся за смысл — какая криптография, какая сортировка, какая многопоточность, какой формат файла — и сообщает, как часто это удаётся, включая случай, когда почти не удаётся.
Командам безопасности, разбирающим вредоносное ПО, которым ответ нужен раньше кода. Компаниям, у которых работает софт без исходников и которым нужно его описание, прежде чем что-то безопасно переписать или заменить. Всем, кто застрял с форматом файла, который никто не документировал — старые записи, станок, который говорит только со своим софтом.
Настоящий декодер, скомпилированный в WebAssembly
Всё, что выше, — это сценарная прогулка по лестнице абстракций. А это первая ступенька, работающая по-настоящему: Capstone — тот же дизассемблер, который линкует нативная сборка RetDec — декодирует байты, которые вы вставите.
capstone — WebAssembly
791 килобайт (КБ), потому что настоящий декодер x86 несёт весь набор инструкций — каждую кодировку, каждый префикс, каждое расширение. Это честный размер этой штуки.
deps/capstone.
Нативные форматы, байт-код и новые форматы
Вывод зависит от формата, потому что делать вид, будто всё декомпилируется в C, никому не помогает. Фронтенд принимает нативные бинарники в формате исполняемых и компонуемых файлов (ELF), переносимых исполняемых файлов (PE) и Mach-O; байт-код, включая class-файлы виртуальной машины Java (JVM), исполняемые файлы Dalvik (DEX) и общий промежуточный язык (CIL); и новые цели вроде параллельного исполнения потоков (PTX) из CUDA.
ELF · PE · Mach-O
Даёт псевдокод на C плюс тот семантический слой, ради которого форк и делался.
Python · Lua · JVM · DEX · CIL
Байт-код Python и Lua возвращается на своих же языках; управляемый код выдаёт вывод семейства Java или семейства C#.
WebAssembly · CUDA PTX
WebAssembly преобразуется в текстовый формат WebAssembly (WAT). PTX обрабатывается как полноценный вход, а не как довесок.
Посмотрите, как функция поднимается по лестнице абстракций
Выберите функцию в бинарнике и прогоните её по конвейеру шаг за шагом: сырые байты, дизассемблирование, поднятый IR, псевдокод на C и, наконец, семантический вердикт — названный алгоритм вместе с признаками, по которым он опознан.
retdec — извлечение спецификации
Семантический вердикт
Признаки
Со снятыми символами восстановление вынуждено работать только по структуре — константы, число раундов, форма потока управления. Это тяжёлый случай, и именно к нему относится измеренный F1 в 0,056.
Шесть семейств структур
Контейнеры стандартной библиотеки шаблонов (STL) и структуры среды выполнения C++ — форма std::vector снова проступает из схемы выделения памяти.
AES, семейство защищённых алгоритмов хеширования (SHA), ChaCha20, Rivest–Shamir–Adleman (RSA) и примитивы на эллиптических кривых, опознаваемые по константам и структуре раундов.
Introsort, сортировка слиянием, двоичный поиск — включая переключение по пределу глубины, которое выдаёт introsort.
Алгоритмы на графах плюс шаблоны обхода: поиск в ширину (BFS) и поиск в глубину (DFS).
std::thread, pthreads, OpenMP, Threading Building Blocks (TBB) и сырые атомарные операции.
Обрамление Protobuf, FlatBuffers, MessagePack, нотации объектов JavaScript (JSON) и расширяемого языка разметки (XML).
216 бинарников и цифра, от которой больно
Все 216 бинарников ELF в тестовом корпусе дают собираемый C с флагом
--buildable, который включён по умолчанию. С восстановлением алгоритмов история другая, и честно сообщать о ней — значит ставить обе цифры рядом.
| Метрика | Результат | Условие |
|---|---|---|
| Собираемый вывод на C | 216 / 216 | --buildable, включён по умолчанию |
| F1 восстановления алгоритмов | 0.056 | Без имён, 95% доверительный интервал 0,034–0,083 |
| F1 восстановления алгоритмов | 1.000 | С подсказкой по именам, бинарники с символами |
Стандартный .c перекомпилируется | Нет | Ни этот форк, ни исходный RetDec |
Опционально, офлайн и под барьером
Уточнение идёт через llama.cpp с моделями GGUF, полностью офлайн, и только когда задан
RETDEC_NEURAL_REFINE=1 и указан путь к модели. По умолчанию оно выключено и никогда не заменяет базовый вывод.
- Барьер компиляции. Уточнённый вывод обязан пройти
gcc -fsyntax-onlyпрежде чем его примут. - Проверка структуры. Уточнение всё равно должно соответствовать поднятой структуре.
- Детерминированный базовый вывод сохраняется. Неуточнённый вывод декомпилятора остаётся тем артефактом, который можно проверить. Если нужно защищать вывод, защищают именно его.
- Сети нет. Локальный инференс GGUF. Ничто про ваш бинарник не покидает машину.
$ export RETDEC_NEURAL_REFINE=1 $ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf $ retdec-decompiler --buildable ./target.elf
Выясняет, что делает программа, когда исходников больше нет
Софт поставляется в виде, который читает машина, а человек нет. Это разбирает его обратно и объясняет простыми словами, что программа на самом деле делает.
Команды безопасности, разбирающие зловреды
Вместо страниц нечитаемого кода вы получаете ответ: вот здесь шифруются данные, вот так оно звонит домой, вот так прячется. Это то, что аналитику нужно в первую очередь.
Компании со старым софтом и без исходников
Система до сих пор держит бизнес, а тот, кто её писал, ушёл много лет назад. Это восстанавливает описание того, что она делает, — а без такого описания никто не сможет безопасно её переписать или заменить.
Всем, кто застрял с форматом файла, который никто не документировал
Старые записи, станок, который говорит только со своим софтом, экспортный файл конкурента. Это выясняет структуру, чтобы ваш собственный софт смог её прочитать.
Графический интерфейс пользователя (GUI) на Qt 6 или без него
Синхронизированные виды кода по C, ассемблеру, IR и графам потока управления, с навигацией по функциям, просмотром строк, обозревателем бинарника и панелью ассистента. Безголовый режим убирает все зависимости GUI, поэтому та же сборка работает в непрерывной интеграции (CI).
GNU Affero General Public License (AGPL-3.0+) для открытого использования или коммерческая лицензия для проприетарного развёртывания. Copyright Odin Loch, торговое наименование Imortek, 2025–2026.
Готово к поставке на v2.0.21. Барьеры CI отражают стандарты разработки, а не промышленной зрелости — это заявлено самим проектом, а не выведено со стороны.