Reko - Cheatsheet de Descompilador Binário de Código Aberto
Reko é um descompilador binário de código aberto escrito em C# que converte código de máquina em C legível. Sua característica distintiva é amplitude de arquitetura, especialmente para plataformas legadas e exóticas: ao lado de x86, x64 e ARM, ele lida com 6502, Z80, 68000, VAX, PDP-11, SPARC, PowerPC e muitos mais. Isso o torna a escolha prática para retrocomputação, firmware vintage e alvo embedded onde ferramentas mainstream não têm suporte algum. Oferece tanto uma GUI quanto um descompilador de linha de comando.
Instalação
| Método | Como |
|---|
| Lançamento | Download do GitHub Releases (Windows/Linux/macOS) |
| GUI | Execute reko (UI WPF/Avalonia) |
| CLI | decompile / reko-cli binary |
| Do fonte | Build a solução .NET |
| Verificar | reko-cli --version |
Descompilação de Linha de Comando
| Comando | Descrição |
|---|
reko-cli binary.exe | Descompila com auto-detecção de formato |
reko-cli --arch x86-protected-32 raw.bin | Força uma arquitetura |
reko-cli --base 0x8000 raw.bin | Define o endereço de carregamento |
reko-cli --loader raw ... | Trata entrada como imagem raw |
reko-cli -o outdir binary | Diretório de saída |
# Descompila um ROM Z80 raw carregado em 0x0000
reko-cli --loader raw --arch z80 --base 0x0000 game.rom
Artefatos de Saída
| Arquivo | Contém |
|---|
*.c | Fonte C descompilada |
*.h | Declarações de tipo/struct recuperadas |
*.dis | Listagem de disassembly |
*.reko | Arquivo de projeto (recarregar na GUI) |
| Grafo de chamadas | Estrutura do programa |
Arquiteturas Suportadas (seleção)
| Moderno | Legado / embedded |
|---|
| x86 / x86-64 | 6502 / 65C02 |
| ARM / AArch64 | Z80 / 8080 |
| MIPS | 68000 (m68k) |
| PowerPC | VAX, PDP-11 |
| SPARC | 8051, AVR |
| RISC-V | Cray, Alpha e mais |
Esta é a razão para usar Reko: quando o binary é de um console de 1980, um controlador industrial ou um mainframe, outros descompiladores simplesmente não o carregam.
O Pipeline de Descompilação
| Fase | Faz |
|---|
| Carregamento | Parse o container (PE/ELF/raw/etc.) |
| Scanning | Descobre código vs dados, encontra procedimentos |
| Rewrite | Levanta instruções para uma representação intermediária |
| Análise | Data flow, type inference, reconstrução de estrutura |
| Estruturação | Reconstrói loops e condicionais |
| Saída | Emite C e headers |
Entender as fases ajuda quando a saída é fraca — geralmente a correção é guiar a fase scanning com pontos de entrada corretos e endereços de carregamento.
Trabalhando na GUI
| Tarefa | Como |
|---|
| Abrir um binary | File → Open, escolha loader/arch se solicitado |
| Procurar procedimentos | Pane de lista de procedimentos |
| Ver C descompilado | Pane de código por procedimento |
| Renomear/retipificar | Editar símbolos para melhorar saída |
| Re-executar análise | Reanalyze após anotações |
| Salvar projeto | Arquivo .reko preserva suas anotações |
Iterar — anotar, re-analisar, ler novamente — é como você obtém saída genuinamente legível de um binary stripped.
Melhorando Qualidade de Saída
| Problema | Correção |
|---|
| Código visto como dados | Marque entry points / começos de procedimento |
| Endereço de carregamento errado | Define --base corretamente |
| Saída garbled | Confirme arquitetura e endianness |
| Tudo sem nome | Renomeie procedimentos/variáveis conforme aprender |
| Assinaturas faltando | Forneça arquivos de metadados de tipo/assinatura |
Reko vs Outros Descompiladores
| Aspecto | Reko | Ghidra | RetDec |
|---|
| Arquiteturas legadas | Excepcional | Bom | Moderado |
| GUI interativo | Sim | Sim (mais rico) | Não |
| Batch scriptable | Sim (CLI) | Sim | Sim |
| Linguagem | C# | Java | C++ |
| Melhor para | Alvo retro/exótico | RE interativo geral | Batch, pipelines embedded |
Use Ghidra para trabalho RE interativo mainstream e RetDec para pipelines batch; Reko ganha seu lugar quando a arquitetura é incomum.
Recursos