Um descompilador que recupera o algoritmo, não só o código
Muitas vezes uma organização precisa entender um software de que não tem o código-fonte: um sistema antigo, um componente comprado, algo que chegou e parece suspeito. Já existem ferramentas que devolvem o código de máquina como passos legíveis. O RetDec Imortek tenta ir um passo além e nomear o que esses passos são — esta parte é o Padrão de Criptografia Avançada (AES), esta parte é uma ordenação, esta parte é como os dados são empacotados para envio.
O RetDec v5.0 upstream está inativo desde 2022. Continua sendo um dos poucos descompiladores abertos com um front end genuinamente amplo — e vale a pena manter essa amplitude viva.
O que isto é, em um minuto
O software é entregue como algo que a máquina lê e a pessoa não. Quando não há código-fonte — o fornecedor sumiu, o contrato nunca o incluiu, o arquivo veio de um lugar em que você não confia — ninguém pode dizer o que o programa faz de fato. Conferir à mão significa ler instruções de máquina uma a uma.
Ele desmonta o arquivo compilado e reconstrói C a partir dele: todos os 216 binários do corpus de teste voltam como C compilável. Depois vai atrás do significado — qual criptografia, qual ordenação, qual uso de threads, qual formato de arquivo — e relata com que frequência isso funciona, inclusive o caso em que mal funciona.
Equipes de segurança desmontando malware, que precisam da resposta antes de precisar do código. Empresas que rodam software de que ninguém tem o fonte e precisam de uma descrição dele antes que algo seja reconstruído ou substituído com segurança. Quem ficou preso a um formato de arquivo que nunca foi documentado — registros antigos, uma máquina que só fala com o software dela.
O decodificador de verdade, compilado para WebAssembly
Tudo acima disto é um passeio roteirizado pela escada de abstração. Este é o primeiro degrau rodando de verdade: Capstone — o mesmo desmontador que o build nativo do RetDec linka — decodificando bytes que você cola aqui.
capstone — WebAssembly
791 kilobytes (KB) porque um decodificador x86 de verdade carrega todo o conjunto de instruções — cada codificação, prefixo e extensão. Esse é o tamanho honesto da coisa.
deps/capstone.
Formatos nativos, bytecode e emergentes
A saída depende do formato, porque fingir que tudo descompila para C não ajuda ninguém. O front end aceita binários nativos em Formato Executável e Ligável (ELF), Executável Portátil (PE) e Mach-O; bytecode, incluindo arquivos class da Máquina Virtual Java (JVM), Executável Dalvik (DEX) e Linguagem Intermediária Comum (CIL); e alvos mais novos como a Execução Paralela de Threads (PTX) do CUDA.
ELF · PE · Mach-O
Produz pseudocódigo C, mais a camada semântica que é o ponto do fork.
Python · Lua · JVM · DEX · CIL
Bytecode de Python e Lua volta nas próprias linguagens; os caminhos de código gerenciado emitem saída da família Java ou da família C#.
WebAssembly · CUDA PTX
WebAssembly converte para o formato texto do WebAssembly (WAT). O PTX é tratado como entrada de primeira classe, não como algo pensado depois.
Veja uma função subir a escada de abstração
Escolha uma função binária e avance com ela pelo pipeline: bytes brutos, desmontagem, IR elevada, pseudocódigo C e, por fim, o veredito semântico — o algoritmo nomeado, com a evidência que o identificou.
retdec — extração de especificação
Veredito semântico
Evidência
Com os símbolos removidos, a recuperação tem de funcionar só a partir da estrutura — constantes, contagem de rodadas, formato do fluxo de controle. Esse é o caso difícil, e é a ele que o F1 medido de 0,056 se refere.
Seis famílias de estrutura
Contêineres da Biblioteca Padrão de Templates (STL) e estruturas do runtime C++ — o formato de um std::vector reaparecendo a partir do padrão de alocação.
AES, a família do Algoritmo de Hash Seguro (SHA), ChaCha20, Rivest–Shamir–Adleman (RSA) e primitivas de curva elíptica, identificadas por constantes e pela estrutura de rodadas.
Introsort, merge sort, busca binária — incluindo a troca por limite de profundidade que entrega o introsort.
Algoritmos de grafos, mais os padrões de percurso em largura (BFS) e em profundidade (DFS).
std::thread, pthreads, OpenMP, Threading Building Blocks (TBB) e atômicos crus.
Enquadramento Protobuf, FlatBuffers, MessagePack, Notação de Objetos JavaScript (JSON) e Linguagem de Marcação Extensível (XML).
216 binários, e o número que dói
Todos os 216 binários ELF do corpus de teste produzem C compilável com
--buildable, que vem ligado por padrão. A recuperação de algoritmo é outra história, e o jeito honesto de relatá-la é pôr os dois números lado a lado.
| Métrica | Resultado | Condição |
|---|---|---|
| Saída C compilável | 216 / 216 | --buildable, ligado por padrão |
| F1 de recuperação de algoritmo | 0.056 | Cego a nomes, intervalo de confiança de 95% 0,034–0,083 |
| F1 de recuperação de algoritmo | 1.000 | Com ajuda de nomes, binários com símbolos |
Padrão .c recompila | Não | Nem este fork nem o RetDec original |
Opcional, offline e sob controle
O refinamento roda via llama.cpp com modelos GGUF, inteiramente offline, só quando
RETDEC_NEURAL_REFINE=1 e um caminho de modelo é fornecido. Vem desligado por padrão e nunca substitui a linha de base.
- Controle de compilação. A saída refinada precisa passar por
gcc -fsyntax-onlyantes de ser aceita. - Validação estrutural. O refinamento ainda precisa corresponder à estrutura elevada.
- Linha de base determinística preservada. A saída não refinada do descompilador continua sendo o artefato auditável. Se você precisar defender um achado, é esse que você defende.
- Sem rede. Inferência GGUF local. Nada sobre o seu binário sai da máquina.
$ export RETDEC_NEURAL_REFINE=1 $ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf $ retdec-decompiler --buildable ./target.elf
Descobre o que um programa faz quando o código-fonte se perdeu
O software é entregue como algo que a máquina lê e a pessoa não. Isto desmonta esse algo de volta e diz, em termos simples, o que o programa está de fato fazendo.
Equipes de segurança desmontando malware
Em vez de páginas de código ilegível, você recebe a resposta: esta parte embaralha dados, esta parte é como ele chama a casa, esta parte é como ele se esconde. É esse o pedaço de que um analista precisa primeiro.
Empresas com software antigo e sem código-fonte
O sistema ainda toca o negócio, e quem o escreveu foi embora anos atrás. Isto recupera uma descrição do que ele faz, que é o que você precisa antes que alguém possa reconstruí-lo ou substituí-lo com segurança.
Quem ficou preso a um formato de arquivo que ninguém documentou
Registros antigos, uma máquina que só fala com o software dela, o arquivo de exportação de um concorrente. Isto descobre a estrutura para que o seu próprio software consiga ler.
Interface Gráfica de Usuário (GUI) em Qt 6, ou nenhuma GUI
Visões de código sincronizadas entre C, assembly, IR e grafos de fluxo de controle, com navegação por funções, inspeção de strings, um navegador de binários e um painel assistente. O modo headless descarta toda dependência de GUI, então o mesmo build roda em Integração Contínua (CI).
A Licença Pública Geral Affero do GNU (AGPL-3.0+) para uso em código aberto, ou uma licença comercial para implantação proprietária. Copyright Odin Loch, atuando como Imortek, 2025–2026.
Entregável na v2.0.21. Os controles de CI refletem padrões de maturidade de desenvolvimento, não de produção — declarado pelo projeto, não inferido.