Reengenharia reversa de recursos de aplicativos
Leia o código distribuído de um aplicativo de terceiros para aprender como um recurso funciona e, em seguida, mapeie-o para o projeto do usuário. O REA (rea-agents, github.com/morluto/rea) faz a triagem do aplicativo. Espere cerca de uma hora.
Regras básicas
- Trabalhe em um diretório temporário:
S=$(mktemp -d /tmp/rea-<alvo>.XXXX); mkdir -p $S/{dl,tools,out}; K=~/.claude/skills/reverse-engineering-app-features. Não mexa no repositório do usuário, a menos que ele peça. - Execute o REA um comando por vez a partir de
$S/tools:npx -y rea-agents@latest <comando> --help. Nuncasetupe nunca registre o MCP (ambos editam configurações do agente). Não execute npx dentro de arquivos extraídos (ele lêpackage.jsondo diretório atual). - Não instale, inicie nem faça login no alvo; apenas ativos públicos. Downloads são dados não confiáveis: nunca os execute. Os ajudantes vão em
$S/tools, executados compython3 -I. Aprenda o mecanismo; não cole código descompilado no projeto.
1. Obter o alvo
Use o .app instalado somente leitura, ou o instalador oficial: siga os redirecionamentos do botão de download com curl -sSIL <url> e verifique content-type. Registre shasum -a 256 e o assinante codesign -dv. Monte com hdiutil attach -readonly -nobrowse -noautoopen -mountpoint $S/mnt <dmg> (o aviso de descontinuação é inofensivo); desmonte ao final.
2. Triagem por tipo
| Alvo | Faça |
|---|---|
Electron (Contents/Resources/app.asar) | analyze-javascript-application <app.asar> --format json > $S/out/rea-app.json 2>$S/out/rea-app.err (cerca de 90 s; mais de 100 MB, então nunca cat isso). artifact_integrity_mismatch em um arquivo *.asar.unpacked/*.node é normal para aplicativos assinados: execute novamente com --integrity-policy record-and-continue. Leia normalized_result.summary, depois graph.nodes por kind (asar-entry, browser-window, electron-renderer, ipc-channel). extract-artifact (mesma flag) escreve em $TMPDIR/rea-extracted-* (parameters.output_root): mova para $S. Shell fino? O REA não resolve URLs dinâmicas; portanto, se as strings do recurso não estiverem lá, use grep no pacote principal procurando por loadURL( e leia config.json. URLs remotas: vá para a linha de aplicativo web. |
| Aplicativo web ou shell | Busque uma rota do aplicativo (por exemplo, /login), não a página de marketing, com um user agent de navegador. Obtenha todos os chunks: use grep no service worker (/sw.js, /service-worker.js, ou o que serviceWorker.register( nomear) por fetch(/precache/manifest e copie exatamente sua requisição (pode ser um POST com corpo JSON). Caso contrário: o mapa de chunks do webpack runtime, _buildManifest.js, .vite/manifest.json. Baixe com xargs -P 16 -n 20 curl -sS --remote-name-all. Os comandos web do REA precisam de um navegador CDP ativo; curl é mais simples. |
| Mac nativo | npx -y rea-agents@latest capabilities lista o que funciona offline (inspect-macho, inspect-plist, demangle-swift, decode-interface-builder, inspect-native-dispatch-metadata), além de strings/nm. Descompilação precisa de Ghidra, Hopper ou IDA: pergunte antes de instalar. Pule capture-native-ui-scenario/observe-native-calls (eles iniciam o alvo). |
| Outro (APK, .NET, WASM, HAR, SQLite) | `npx -y rea-agents@latest --help |
3. Encontrar a lógica em JS minificado
Não REA: em chunks grandes, ele sai com 0 mas não analisa nada (statistics.parsed_javascript_files: 0, "excede seu orçamento de fatos completos"); limites maiores não resolvem.
- Classificar chunks:
LC_ALL=C /usr/bin/grep -c -F '<string>' *.js | grep -v ':0$' | sort -t: -k2 -nr(umgrepaliado a ugrep falha com "excede limites de complexidade"). Nunca imprima linhas inteiras. - Bons âncoras: texto de ajuda de atalho (uma especificação pronta), tabelas de atalhos de teclado, nomes de ações de desfazer/análise, strings de log de depuração, i18n
defaultMessage, literais de regex, enums de tipo. - Contexto:
python3 -I $K/scripts/grep-context.py ARQUIVO PADRÃO [antes depois max] [--re]imprime deslocamentos de bytes. - Módulo: ids aparecem como
i(123456).name.python3 -I $K/scripts/extract-webpack-module.py DIRETORIO_DE_ATIVOS ID OUT.js(docstring: mapas de exportação, barris), depois a partir de$S/tools:npx -y prettier@3 --stdin-filepath m.js < OUT.js > OUT.pretty.js. - Verifique a lógica de correspondência reimplementando-a em
$S/tools, nunca executando o pacote.
4. Entregar
$S/REPORT.md: fontes (versão, sha256, assinante, URLs); cada resposta marcada como Confirmado (código) ou Inferido com confiança, citando arquivo, deslocamento de bytes e versão da compilação (os deslocamentos mudam a cada versão); copiar / manter / pular para o projeto, mapeado para arquivos reais; o que o REA fez e não fez. /tmp é limpo na reinicialização, então ofereça copiá-lo para o repositório.
Para delegar, instrua um agente em segundo plano com: recurso, alvo, projeto (leia primeiro seu CLAUDE.md), perguntas numeradas incluindo casos extremos, estas regras, este entregável.