RetDec Imortek · v2.0.21

Декомпилятор, который восстанавливает алгоритм, а не только код

Организациям часто нужно понять софт, исходников к которому нет: старая система, купленный компонент, файл, который откуда-то пришёл и выглядит подозрительно. Инструменты, превращающие машинный код обратно в читаемые шаги, уже есть. RetDec Imortek пытается пойти на шаг дальше и назвать эти шаги — вот тут улучшенный стандарт шифрования (AES), тут сортировка, а тут упаковка данных для отправки.

ЯзыкC++
Версияv2.0.21
АпстримRetDec v5.0
Звёзды2
Последняя отправканедавно
Зачем форкать RetDec

Апстрим RetDec v5.0 не развивается с 2022 года. Это по-прежнему один из немногих открытых декомпиляторов с действительно широким фронтендом — и эту широту стоит сохранить живой.

ДобавленоСемантическое восстановление библиотек
ДобавленоИнтерфейс на Qt 6
ДобавленоОпциональное офлайн-уточнение нейросетью
ДобавленоОпределение алгоритмов, параллелизма и сериализации
Простыми словами

Что это такое за минуту

Проблема

Софт поставляется в виде, который читает машина, а человек — нет. Когда исходников нет — поставщик исчез, в договоре их не было, файл пришёл от того, кому вы не доверяете — никто не скажет, что программа на самом деле делает. Проверять вручную — значит читать машинные инструкции по одной.

Решение

Он разбирает скомпилированный файл и восстанавливает из него C: все 216 бинарников в тестовом корпусе возвращаются собираемым C. Потом он берётся за смысл — какая криптография, какая сортировка, какая многопоточность, какой формат файла — и сообщает, как часто это удаётся, включая случай, когда почти не удаётся.

Кому это нужно

Командам безопасности, разбирающим вредоносное ПО, которым ответ нужен раньше кода. Компаниям, у которых работает софт без исходников и которым нужно его описание, прежде чем что-то безопасно переписать или заменить. Всем, кто застрял с форматом файла, который никто не документировал — старые записи, станок, который говорит только со своим софтом.

Назвать алгоритм — трудная часть, и обе цифры по ней приведены здесь. Если у бинарника остались собственные метки, детектор с ними согласен; если метки сняты, он близок к угадыванию. Дальше на этой странице — инженерия: что добавлено, как это измерено и где оно проваливается.
Нижняя ступенька, по-настоящему

Настоящий декодер, скомпилированный в WebAssembly

Всё, что выше, — это сценарная прогулка по лестнице абстракций. А это первая ступенька, работающая по-настоящему: Capstone — тот же дизассемблер, который линкует нативная сборка RetDec — декодирует байты, которые вы вставите.

capstone — WebAssembly

791 килобайт (КБ), потому что настоящий декодер x86 несёт весь набор инструкций — каждую кодировку, каждый префикс, каждое расширение. Это честный размер этой штуки.

Декодер
—
Инструкций
—
Это декодер, а не декомпилятор. Ступени выше — подъём в промежуточное представление (IR) LLVM, структурирование потока управления, называние алгоритма — это работа LLVM, а LLVM не помещается в веб-страницу ни в каком размере. Утверждать обратное было бы самой лёгкой ложью на этом сайте.
Capstone 5, собранный Emscripten, только 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 и, наконец, семантический вердикт — названный алгоритм вместе с признаками, по которым он опознан.

Пять ступеней абстракции: сырые байты, дизассемблирование, поднятый IR, псевдокод на C и названный алгоритм со ссылкой на спецификацию
прокрутите, чтобы увидеть всю схему →
Последняя ступенька и есть продукт. Всё, что выше неё, другие декомпиляторы и так дают.

retdec — извлечение спецификации


          

Семантический вердикт

Пока не восстановлено
Дойдите по шагам до семантического этапа.

Признаки

Уверенность
—
Режим
без имён

Со снятыми символами восстановление вынуждено работать только по структуре — константы, число раундов, форма потока управления. Это тяжёлый случай, и именно к нему относится измеренный F1 в 0,056.

Сценарная прогулка по настоящим этапам восстановления, написанная для этой страницы. Сам декомпилятор написан на C++ и работает офлайн.
Что оно восстанавливает

Шесть семейств структур

Рантайм

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

МетрикаРезультатУсловие
Собираемый вывод на C216 / 216--buildable, включён по умолчанию
F1 восстановления алгоритмов0.056Без имён, 95% доверительный интервал 0,034–0,083
F1 восстановления алгоритмов1.000С подсказкой по именам, бинарники с символами
Стандартный .c перекомпилируетсяНетНи этот форк, ни исходный RetDec
Читайте эти два числа F1 вместе. 1,000 с символами означает, что детектор согласен с таблицей символов. 0,056 без них означает, что структурное восстановление на очищенных бинарниках сегодня близко к угадыванию. Приводить только первое было бы маркетингом; приводить только второе значило бы скрыть, что конвейер работает, когда ему есть от чего оттолкнуться.
Уточнение нейросетью

Опционально, офлайн и под барьером

Уточнение идёт через 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
Кому это нужно

Выясняет, что делает программа, когда исходников больше нет

Софт поставляется в виде, который читает машина, а человек нет. Это разбирает его обратно и объясняет простыми словами, что программа на самом деле делает.

01

Команды безопасности, разбирающие зловреды

Вместо страниц нечитаемого кода вы получаете ответ: вот здесь шифруются данные, вот так оно звонит домой, вот так прячется. Это то, что аналитику нужно в первую очередь.

02

Компании со старым софтом и без исходников

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

03

Всем, кто застрял с форматом файла, который никто не документировал

Старые записи, станок, который говорит только со своим софтом, экспортный файл конкурента. Это выясняет структуру, чтобы ваш собственный софт смог её прочитать.

Узнаёте здесь свою ситуацию? Сейчас всё это открыто для бета-тестирования, и отзывы тех, для кого это делается, действительно меняют систему. Стать бета-тестировщиком →
Интерфейс

Графический интерфейс пользователя (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 отражают стандарты разработки, а не промышленной зрелости — это заявлено самим проектом, а не выведено со стороны.