A maioria das pessoas que tenta fazer engenharia reversa de um binário abre o arquivo em um 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 uma parede de assembly em algo que realmente possam reconstruir.
Este curso de 11 passos vai transformar o Claude Opus 5.5 em uma máquina de código aberto para qualquer coisa.
Siga meu Substack para receber as melhores dicas de IA:
Engenharia reversa não é sobre quebrar proteções. É sobre entender algo bem o suficiente para 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 a prova: 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 de marketing. Na mesma semana, um projeto open-source chamado WordCraft lançou uma reconstrução "clean room" do Microsoft e do Adobe em Rust puro:

Ele foi criado 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 todo o caminho, 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 em um 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 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, mostrando todas as alterações antes de gravar qualquer coisa e criando 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 uso 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 nenhum motor. Mantenha o REA atualizado, pois 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 a base disso uma vez.5- Toda afirmação recebe uma tag: 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 assets.15- Mantenha um registro de obrigações: todo comportamento recuperado precisa passar em um 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 controle de qualidade de 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 [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 REA correta 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 construído, 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 e todo o texto legível escondido ali dentro.
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 de você ler uma única 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 + refs 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 se torne importante. 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 decompilador 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, casts por todos os lados. 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 dentro 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 nomear cada variável
Aquele código rústico é só metade do trabalho. Agora entregue-o ao 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 o propósito da 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 para um nome significativo com base 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, state machine, observer...).85. Reescreva-a como um Swift limpo e idiomático (ou a linguagem que as convenções9 de chamada sugerirem), com comentários de documentação.106. Sinalize qualquer falta de tratamento de erros, validação de entrada ou verificação de segurança.1112Pense bem com 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 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 pelo 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 única 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, apontando o Claude Opus para o ofuscador Tigress em 20 tarefas. Guarde esses 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 cada vez mais forte antes de desistir. Então defina um limite de gastos 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 achatamento do7 dispatch, 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 necessária.
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 relate-o 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 que você copia o que o app faz, nunca o código dentro dele. Faça isso 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ê do lado seguro, e a equipe do WordCraft verifica todas as quatro automaticamente em cada build.
- Observe, nunca copie. Rode o alvo como caixa preta, observe 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 simples dos recursos.
- Especificações, não código-fonte. Os formatos de arquivo vêm de padrões públicos (OOXML é ECMA-376 / ISO 29500, além das specs publicadas de RTF e ODF), nunca da leitura do parser de um concorrente ou de qualquer código GPL/LGPL.
- Somente assets originais. Cada ícone, fonte, template e som é desenhado em código, de domínio público ou com licença aberta, com uma linha em um arquivo de atribuição. Caso contrário, um check de CI reprova o build.
- Separe as duas tarefas. Um agente recupera o comportamento e escreve uma especificação. Um contexto diferente implementa a partir apenas da spec, 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(pelo comportamento observado e pela spec pública) e o comportamento de tratamento de erros.67NÃO inclua: endereços ou offsets, nomes de variáveis da descompilação, assembly8ou qualquer coisa copiada do original. Um desenvolvedor que nunca viu o binário deve ser9capaz de implementar uma versão compatível usando apenas este documento.1011Gere um 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 em uma 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 de forma aberta no GitHub.
O lema deles é "Doze apps. Um ofício", e esse ofício é 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 retorno 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 em uma 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á abaixo dela, desde as 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 e exporte para PDF13 ✓ select.all-headings -> 12 selecionados14 ✓ format.font-size 14 · format.bold15 ✓ export report.pdf (texto selecionável, marcadores mantidos)
https://x.com/yuhasbeentaken/status/2109235513102057828
11. Valide e lance - 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: passe as mesmas entradas para o original e 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 (vazia, 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, e semanticamente nos outros casos. Relate 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 slot de RE no topo do 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 em uma 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 em um 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 esconde a lógica real no meio do ruído e estoura 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 em um contexto, implemente a partir da spec 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 a superfície dele, 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, documente a spec de forma limpa e lance a reconstrução via MCP.
Onze passos. Um modelo. Zero código copiado.





