A maioria das pessoas que tenta fazer engenharia reversa de um binário abre o arquivo num editor hexadecimal, rola a tela por vinte minutos e desiste.
Elas não sabem qual ferramenta carrega o arquivo. Não sabem qual prompt extrai a lógica. Não sabem como transformar um paredão de assembly em algo que realmente dê para reconstruir.
Este curso de 11 passos vai transformar o Claude Opus 5.5 numa máquina de código aberto capaz de recriar qualquer coisa.
Siga meu Substack para receber as melhores dicas de IA em primeira mão:
Engenharia reversa não é sobre quebrar proteções. É sobre entender algo tão bem a ponto de conseguir construir a sua própria versão.
Em 7 de outubro de 2026, Amjad Masad, CEO da Replit, publicou uma única linha:
https://x.com/amasad/status/2107671204639465961
Logo abaixo, um desenvolvedor chamado @morluto respondeu com as provas: um conjunto de ferramentas que permite aos agentes controlar o Hopper e o Ghidra e ir muito longe.
Esse projeto é o REA, e ele ultrapassou 110.000 estrelas no GitHub em poucos dias.

https://github.com/morluto/rea
Não é exagero. Na mesma semana, um projeto open-source chamado WordCraft lançou uma recriação "clean-room" do Microsoft e do Adobe em Rust puro:

Ele foi construído observando o comportamento do Word e do Adobe e lendo as especificações públicas dos formatos de arquivo, sem nunca olhar o código deles.

Este curso mostra o caminho completo, de um binário fechado até uma reconstrução como essa, com o Opus 5.5 fazendo a leitura.
01. O motor - como um agente lê um binário
O Opus 5.5 não consegue rodar um disassembler por conta própria. Ele lê texto e escreve texto.
A engenharia reversa com um agente funciona porque existe uma ferramenta entre o modelo e o binário: ela carrega o arquivo num motor de desmontagem real, expõe os resultados como funções chamáveis e permite que o modelo faça perguntas.

Essa ferramenta é o REA, e o motor por trás dela é o Hopper, o Ghidra ou o IDA.
O ciclo é simples e se repete: o modelo pede ao REA para inspecionar o alvo, o REA devolve as descobertas com as evidências exatas (endereços, bytes, pseudocódigo, pontos de chamada), e o modelo usa essas informações para fazer a próxima pergunta ou para escrever e testar uma reimplementação.

Tudo roda localmente na sua máquina. Nada é enviado para fora, exceto as descobertas que o modelo precisa para raciocinar, e cada conclusão é classificada como observação, inferência ou incógnita.
**
02. A instalação - rea-agents mais um disassembler
A configuração registra o servidor MCP do REA no seu agente e instala as instruções de fluxo de trabalho correspondentes.
Um único comando faz isso, mostra todas as alterações antes de gravar qualquer coisa e cria backup do que for modificado.

Você escolhe o seu próprio disassembler: o Hopper no macOS é o caminho mais fácil, o Ghidra é gratuito e multiplataforma, e o IDA serve se você já tiver uma licença.
1# 1. Registre o REA no seu agente (Claude Code, Codex, Cursor, Gemini CLI...)2npx rea-agents setup # mostra as mudanças planejadas e pede confirmação antes de gravar34# 2. Um provedor de análise profunda. O Hopper é o mais tranquilo no macOS;5# o setup pode instalá-lo após aprovação. Ghidra e IDA ficam por sua conta.6# 3. Instale a CLI do rea para usar no terminal e em scripts7npm install --global rea-agents8rea --help910# 4. Reinicie seu agente e confirme que as ferramentas estão ativas11claude12> /mcp13 rea: connected14 open_binary, binary_overview, analyze_function, decompile,15 list_procedures, search, xrefs, trace, inspect_artifact,16 analyze_javascript_application, inspect_managed_artifact ...
Os requisitos são modestos: Node.js 22 ou superior e npm. A análise nativa exige um dos três motores; a inspeção estática de JavaScript e .NET não precisa de motor nenhum. Mantenha o REA atualizado, porque as versões trazem correções frequentes.
1# Regras da casa para engenharia reversa ( CLAUDE.MD )23## Autoridade4- Analise apenas alvos que eu possuo ou tenho autorização para examinar. Declare o motivo uma vez.5- Toda afirmação deve ser classificada: observação (vi isso), inferência (deduzi isso) ou incógnita.6- Cite as evidências: endereço, bytes, pseudocódigo ou ponto de chamada. Nada de afirmações sem fonte.78## Fluxo de trabalho9- Comece pela visão geral mais enxuta, não por um dump completo. Expanda apenas quando houver uma lacuna concreta.10- Reaproveite a sessão aberta; nunca refaça uma análise idêntica.11- Separe fatos estáticos de fatos de execução. Nunca deduza comportamento em tempo de execução a partir de leituras estáticas.1213## Reconstrução14- Construa a partir do COMPORTAMENTO e de especificações públicas, nunca copiando código ou recursos.15- Mantenha um registro de obrigações: todo comportamento recuperado precisa passar num teste antes de ser considerado "pronto".
O Opus 5.5 vem com cinco níveis de esforço: low, medium, high, xhigh e max. Use:
- Medium para inspecionar e navegar
- High para anotar funções comuns
- Max para código ofuscado e qualquer coisa com muita matemática de ponteiros.
O nível de esforço é o principal ajuste de qualidade em todo este curso.
03. O roteador - 20 tipos de alvo, uma ferramenta para cada
O primeiro erro dos iniciantes é abrir um disassembler quando o alvo é um app Electron cujo JavaScript está ali, escancarado.
O REA direciona o alvo para a ferramenta certa, e o seu primeiro prompt deve fazer o mesmo. Diga o nome do arquivo, diga o recurso desejado e deixe o agente escolher a ferramenta de entrada.

1Quero entender como o [RECURSO] funciona no [APP], que está em [CAMINHO ABSOLUTO].23Primeiro, me diga que tipo de alvo é esse (nativo, Electron/JS, .NET, Go, APK, WASM)4e escolha a ferramenta certa do REA para abri-lo. Não comece uma análise profunda ainda.56Depois, me dê um mapa de um parágrafo: com o que o app foi feito, qual o tamanho dele e7onde você procuraria primeiro pelo [RECURSO]. Mantenha observações, inferências e incógnitas8separadas e cite evidências para tudo o que afirmar.
Apontar o REA para um app Electron devolve módulos, imports e limites de IPC em segundos, sem precisar de nenhum disassembler.
Apontá-lo para um Mach-O ou ELF nativo abre um banco de dados do Hopper e segue o caminho nativo, mais difícil, porém mais profundo. Saber em qual dos dois você está economiza horas.
https://x.com/_vmlops/status/2106690704244420687
04. Reconhecimento - visão geral, strings e grafo de chamadas
Não abra nenhum código ainda. Primeiro, peça ao REA um mapa do arquivo inteiro. Um único comando diz em que tipo de máquina ele roda, quantas funções existem lá dentro e todo o texto legível escondido nele.
Esse texto é a pista mais rápida que você tem: endereços web, mensagens de erro e nomes de recursos revelam o que o app faz antes mesmo de você ler uma linha de código.
1rea.open_binary { path: "/Applications/Target.app/Contents/MacOS/Target" }2rea.binary_overview {}3 arch: arm644 functions: 1,284 identified5 segments: __TEXT __DATA __LINKEDIT6 entry: _main @ 0x1000051c078rea.search { query: "http" } # strings + referências no código9 0x10004a2c0 "https://api.target.app/v3/sync"10 0x10004a300 "Authorization: Bearer "11 0x10004a330 "offline cache miss, falling back"1213rea.xrefs { address: "0x100012ab0" } # quem chama isso?14 147 references -> core config loader, called everywhere
O REA também conta quantas vezes cada função é chamada (essa contagem é chamada de referências cruzadas, ou xrefs).

Uma função chamada 147 vezes é o coração do app e merece o seu melhor esforço. Uma chamada duas vezes é uma função auxiliar pequena que você pode ignorar até que ela importe. Comece pelo topo dessa lista e vá descendo.
05. Descompilar - uma função em pseudocódigo
Agora escolha uma dessas funções movimentadas e transforme-a em algo legível. Um descompilador pega as instruções de máquina brutas e as reescreve como um código próximo ao C.
A aparência é rústica: nomes como var_28, lógica embaralhada, conversões de tipo por toda parte. Mas dá para ler, e ser legível é tudo o que o Opus 5.5 precisa.
Rode pela linha de comando para salvar o resultado, ou direto de um chat.
1# Descompila uma função pelo endereço, em JSON para redirecionar ou salvar2rea decompile /Applications/Target.app/.../Target 0x100012ab0 \3 --provider hopper --json > fn_config_loader.json45# Ou busca uma função pelo nome e segue as referências6rea function /path/to/Target parseConfig --provider hopper --json7rea xrefs /path/to/Target 0x100012ab0 --provider hopper --json8rea trace /path/to/Target "sync" --provider hopper --json
1// 0x100012ab0 xrefs: 1472void sub_100012ab0(void* arg0) {3 void* var_20 = objc_msgSend(cls_NSJSONSerialization,4 sel_JSONObjectWithData_options_error, arg0, 0x0, 0x0);5 if (var_20 != 0x0) {6 void* var_28 = objc_msgSend(var_20, sel_objectForKey, @"endpoints");7 void* var_30 = objc_msgSend(var_20, sel_objectForKey, @"auth_mode");8 void* var_38 = objc_msgSend(var_20, sel_objectForKey, @"retry_count");9 objc_msgSend(g_sharedConfig, sel_setEndpoints, var_28);10 objc_msgSend(g_sharedConfig, sel_setAuthMode, var_30);11 objc_msgSend(g_sharedConfig, sel_setRetryCount,12 objc_msgSend(var_38, sel_intValue));13 }14}
A demonstração oficial do REA rastreia uma chamada de som no jogo antigo DX-Ball até a função auxiliar que decide o balanço de áudio esquerda-direita e, em seguida, transforma o pseudocódigo incompleto em C.

O resultado passa em todos os 3.205 casos de teste originais e reproduz cada um dos 63 bytes compilados.

Passo a passo completo em rea.tools/showcase.
06. Anotar - faça o Opus dar nome a cada variável
Aquele código rústico é só metade do trabalho. Agora passe-o para o Opus 5.5 e peça para ele explicar e limpar tudo.
Ele renomeia as variáveis enigmáticas para nomes reais, resume em uma frase para que serve a função, identifica o padrão utilizado e até aponta bugs que o app original deixou passar.
Cole este prompt no Claude:
1Aqui está o pseudocódigo descompilado de uma função com 147 referências cruzadas.23Para esta função:41. Renomeie cada variável com um nome significativo baseado em como ela é usada.52. Explique o propósito dela em uma frase.63. Liste as estruturas de dados que ela lê e escreve.74. Nomeie o padrão (singleton, factory, máquina de estados, observer...).85. Reescreva-a em Swift limpo e idiomático (ou na linguagem que as convenções de9 chamada sugerirem), com comentários de documentação.106. Sinalize qualquer tratamento de erro, validação de entrada ou verificação de segurança ausente.1112Pense bem usando esforço xhigh antes de responder: raciocine sobre o que cada13valor representa antes de definir os nomes. Marque tudo de que não tiver certeza.1415[cole o pseudocódigo]
A descompilação mostra o que o código faz. O Opus 5.5 explica por quê, e entrega os nomes certos para você reconstruí-lo.
https://x.com/0x0SojalSec/status/2108389060192706674
https://x.com/0x0SojalSec/status/2108031166502896035
Nem todo alvo precisa de um disassembler. A demonstração do Notion feita com o REA encontra o recurso de área de transferência no JavaScript do app, acompanha o fluxo pelas camadas do Electron até o processo principal e mostra exatamente como a área de transferência rica é montada — um rastreamento completo sem uma linha de assembly. Veja:
07. Ofuscação - o benchmark Tigress
Alguns apps são feitos justamente para resistir ao que você está tentando fazer. O código é embaralhado de propósito: a lógica é misturada, o texto é criptografado e ramificações falsas são adicionadas para roubar seu tempo.
Isso se chama ofuscação, e é o único ponto em que até o melhor modelo sofre. A Elastic Security Labs mediu isso, colocando o Claude Opus contra o ofuscador Tigress em 20 tarefas. Guarde estes números.

Há duas lições práticas nesses números.
- Primeiro, uma tentativa falha custa cerca do dobro de uma bem-sucedida, porque o modelo continua tentando com cada vez mais força antes de desistir. Então defina um limite de gasto por função e pare cedo.
- Segundo, remova o lixo do código descompilado antes de enviá-lo (uma ferramenta gratuita chamada Caveman elimina cerca de 75% disso) para que o modelo gaste sua atenção na lógica real, e não no enchimento.
Os cinco truques que você vai encontrar na prática e como cada um aparece ao abrir o código:

1Esta função parece ofuscada. Trabalhe com esforço máximo.231. Identifique as técnicas presentes (achatamento de fluxo de controle, predicados opacos,4 código morto, criptografia de strings, divisão de funções) e aponte onde cada uma aparece5 neste código específico.62. Resolva-as: remova ramificações mortas, avalie predicados opacos, desfaça o achatamento7 do despacho, descriptografe strings inline se a chave for recuperável.83. Mostre a função limpa que restou.94. Avalie sua confiança de 1 a 10. Abaixo de 6, me diga exatamente quais partes são incertas10 e qual contexto vizinho as resolveria. Não chute em silêncio.1112[cole o pseudocódigo ofuscado]
08. O enxame - um controlador gerenciando workers
Um único chat não consegue ler 500 funções direito. Ele esquece o que viu, chama a mesma coisa por três nomes diferentes e começa a se contradizer.
A solução é uma equipe pequena: um chat controlador que distribui o trabalho e vários chats workers, cada um cuidando de uma função.
O controlador mantém a visão geral e costura as peças de volta.

Você não precisa criar nada especial para isso; os dois prompts abaixo são toda a configuração.
1Você é um controlador de engenharia reversa. O mapa de funções está em functions.json2(endereço, nome, tamanho, xref_count).341. Agrupe as funções por proximidade no grafo de chamadas; ordene os grupos por contagem de xrefs.52. Distribua cada grupo para um worker. Nunca analise uma função você mesmo.63. Injete as structs já resolvidas no briefing de cada worker para manter os nomes consistentes.74. Quando um worker devolver confiança abaixo de 6, coloque na fila uma segunda passagem com o contexto8 dos vizinhos já resolvidos.95. Acompanhe o gasto acumulado de tokens e reporte após cada grupo.
1Você é um worker. Você recebe uma função descompilada e as structs resolvidas até agora.2Devolva exatamente: endereço, propósito, confiança (1-10), structs_used, structs_new,3clean_source, flags. Reutilize os nomes de struct existentes; nunca invente um segundo nome para4uma struct que o controlador já te passou. Apenas uma função. Pare quando terminar.
https://x.com/victor_explore/status/2109466356454510612
09. Clean room - quatro regras para manter tudo legal
Uma reconstrução "clean room" significa copiar o que o app faz, nunca o código que há dentro dele. Faça certo e o que você lançar será totalmente seu. Faça errado e você estará carregando os direitos autorais de outra pessoa.

Quatro regras mantêm você no lado seguro, e a equipe do WordCraft verifica as quatro automaticamente em cada build.
- Observe, nunca copie. Rode o alvo como caixa preta, veja o que ele faz, tire prints apenas da janela dele. Nunca leia, desmonte ou cole o código dele. Nunca copie textos além dos nomes básicos dos recursos.
- Especificações, não fontes. Os formatos de arquivo vêm de padrões públicos (OOXML é ECMA-376 / ISO 29500, além das especificações publicadas de RTF e ODF), nunca da leitura do parser de um concorrente ou de qualquer código GPL/LGPL.
- Somente recursos originais. Cada ícone, fonte, template e som é desenhado em código, de domínio público ou com licença aberta, com uma linha num arquivo de atribuição. Caso contrário, uma verificação de CI reprova o build.
- Separe os dois trabalhos. Um agente recupera o comportamento e escreve uma especificação. Um contexto diferente implementa a partir apenas da especificação, sem nunca olhar a análise original. Essa separação é a fronteira do clean room.
1A partir da análise concluída, escreva uma especificação clean room para uma reimplementação.23Descreva APENAS o COMPORTAMENTO. Inclua: toda interface pública, o modelo de dados, cada4recurso visível ao usuário como um requisito testável, os formatos de arquivo lidos e gravados5(por comportamento observado e especificação pública) e o comportamento de tratamento de erros.67NÃO inclua: endereços ou offsets, nomes de variáveis da descompilação, assembly,8ou qualquer coisa copiada do original. Um desenvolvedor que nunca viu o binário deve ser9capaz de implementar uma versão compatível apenas com este documento.1011Gere markdown com as seções: Arquitetura, Modelo de Dados, API Pública, Formatos de Arquivo,12Casos de Teste.
Trabalhar a partir de uma descrição não é só proteção jurídica. Isso permite que você faça as escolhas certas para a sua própria linguagem e necessidades, em vez de herdar decisões que o autor original tomou décadas atrás.

O WordCraft é mais rápido que o Word em alguns pontos justamente porque não copiou as entranhas do Word.
10. Criando Apps - doze ferramentas profissionais, um método
O WordCraft não é um caso isolado. É um app numa prateleira de doze da equipe ArtCraft, cada um sendo uma reconstrução clean room de uma ferramenta pela qual você já paga, todos escritos do zero em Rust e lançados gratuitamente e abertos no GitHub.
O lema deles é "Doze apps. Uma arte", e essa arte é o método do passo 9: observe o original, leia as especificações públicas, construa uma versão nova baseada apenas no comportamento.

O ganho desse método compartilhado é o mesmo em todos os lugares. Sem Electron: cada app é nativo no macOS, Windows e Linux, e todos, exceto o FilmCraft, também rodam numa aba do navegador via WebAssembly.
E como cada ação dentro deles é um comando nomeado, todos os doze podem ser controlados por um agente de IA imediatamente.
Todo app Craft é construído da mesma forma, e vale a pena copiar essa estrutura. Cada um é empilhado em camadas, e cada camada usa apenas a que está logo abaixo, desde medidas básicas na base até a janela na tela no topo.
Aqui estão as camadas do WordCraft:

E cada ação é apenas um comando nomeado, então um clique de mouse, um atalho de teclado e um agente de IA disparam exatamente a mesma coisa. É isso que torna qualquer um deles controlável por um agente.
1controlar o WordCraft via MCP23# Automação de documentos headless4claude mcp add wordcraft -- wordcraft-cli mcp56# Ou controle o app desktop em execução7wordcraft --control 7981 &8claude mcp add wordcraft-app -- wordcraft-cli mcp --connect 127.0.0.1:7981910# Ferramentas: list_commands, execute, batch, type_text, select_text,11# inspect_document, render_page, save_document (+ screenshot/click/key ao vivo)12> Abra report.docx, coloque todos os títulos em negrito 14pt, exporte para PDF13 ✓ select.all-headings -> 12 selected14 ✓ format.font-size 14 · format.bold15 ✓ export report.pdf (selectable text, bookmarks kept)
https://x.com/yuhasbeentaken/status/2109235513102057828
11. Verificar e lançar - prove a paridade, exponha o MCP
Você nunca teve o código-fonte original, então não dá para comparar linha por linha.
Em vez disso, compare o comportamento: dê as mesmas entradas tanto para o original quanto para a sua reconstrução e verifique se produzem a mesma saída.
1Crie um ambiente de testes comportamentais comparando o binário original e minha reconstrução.23Gere 50 entradas: 30 normais, 10 extremas (vazio, tamanho máximo, unicode, caracteres especiais),410 de erro (malformadas, campos ausentes, corrompidas). Rode cada uma em ambos. Compare a saída5byte a byte quando possível, semanticamente nos demais casos. Reporte a taxa de acerto, uma lista6de divergências e a gravidade de cada uma (cosmética / comportamental / crítica). Salve em report.md.
Essa também é a prova mais convincente que você pode mostrar a qualquer pessoa (o trecho de RE no topo deste artigo).

Depois, lance sua reconstrução da mesma forma que o REA e o WordCraft fizeram: como um servidor MCP, para que o agente da próxima pessoa possa controlá-lo assim como você controlou o REA.
Dê a cada função um nome e uma descrição claros, envolva tudo numa ferramenta de linha de comando simples e permita a instalação com uma única linha.
https://x.com/0xMovez/status/2108884063515746410
E teste durante o processo, não só no final, porque um erro descoberto depois de você ter construído três camadas em cima dele sai muito mais caro para corrigir.
Seis erros que desperdiçam um fim de semana
- Abrir um disassembler num app Electron. Se o JavaScript está ali na sua frente, direcione para analyze_javascript_application e pule completamente o caminho nativo.
- Extrair tudo antes de ler qualquer coisa. Peça um resumo ao REA primeiro. Puxar o app inteiro de uma vez soterra a lógica real em ruído e infla sua conta.
- Ler as funções na ordem do arquivo. Ordene pela contagem de referências cruzadas. A função com 147 xrefs é a arquitetura; a auxiliar com 2 xrefs pode esperar.
- Insistir na ofuscação de estágio 3. O benchmark resolve 0% das multicamadas. Defina um orçamento, guarde o contexto dos vizinhos e volte depois.
- Deixar o modelo copiar código para a sua reconstrução. Isso quebra o clean room. Especifique primeiro num contexto, implemente a partir da especificação em outro.
- Lançar sem um relatório de paridade. "Acho que bate" não é evidência. 50 testes comportamentais e uma taxa de acerto são.
Conclusão:
Instale o REA. Leia o binário. Reconstrua-o como seu.
Direcione o alvo, mapeie sua superfície, descompile as funções críticas, deixe o Opus 5.5 nomear tudo, quebre a ofuscação que valer a pena quebrar, escale com um enxame, especifique de forma limpa e lance a reconstrução via MCP.
Onze passos. Um modelo. Zero código copiado.





