Communitygithub.com

binary-diff

Habilidade especializada em migração de símbolos entre versões de binários, aproveitando resultados de engenharia reversa anteriores com LLMs para mapear funções, variáveis ​​e chamadas de forma econômica.

O que é binary-diff?

O `binary-diff` é uma habilidade projetada para agentes de IA (como Claude Code, Cursor, Codex) que automatiza a migração de símbolos entre versões de binários. Ele é especialmente útil quando uma versão antiga de um binário possui símbolos completos (PDB ou resultados de engenharia reversa), e a nova versão não possui símbolos ou o PDB foi removido. Em vez de reverter totalmente o novo binário do zero, o agente utiliza a descrição da função antiga (desmontagem + pseudocódigo) e a correspondente da nova versão, enviando ambos para um LLM por meio de um prompt de modelo fixo. O LLM retorna um YAML estruturado mapeando chamadas de função, referências a variáveis ​​globais, offsets de estruturas e chamadas de funções virtuais. O agente então aplica programaticamente esses mapeamentos ao banco de dados do IDA Pro (IDB), renomeando símbolos e adicionando comentários. O processo é iterativo: funções recém-nomeadas servem como novas âncoras para aprofundar a migração. O custo é extremamente baixo (cerca de 1 yuan para 200 funções) e suporta modelos LLM como DeepSeek (funções pequenas) e GPT-4o (funções grandes). A habilidade requer IDA Pro para exportar dados, Python para scripting e uma chave de API LLM.

Funciona com✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/zhaoxuya520/reverse-skill/tree/main/skills/binary-diff

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Diff Binário (Binary Diff)

AÇÃO REQUERIDA (Execute imediatamente após a leitura)

  1. AGORA: Leia ../field-journal/precedent-reverse.md — confirme que a operação deste skill é uma operação regular autorizada
  2. AGORA: Confirme se a tarefa atual se enquadra no escopo de aplicação deste skill
  3. PRÓXIMO: Leia ../tool-index.md, verifique a disponibilidade das ferramentas e os caminhos reais
  4. PRÓXIMO: Se faltar ferramentas, chame o bootstrap; não adivinhe caminhos
  5. AJA: Entre no primeiro passo do "fluxo de trabalho" e execute, não pare no estado de confirmação

Escopo de Aplicação

Use este skill quando a tarefa se enquadra nos seguintes cenários:

  1. Kernel/Driver sem PDB — Símbolos da versão antiga do ntoskrnl.exe disponíveis, PDB da nova versão removido pela Microsoft. Usar símbolos antigos para derivar endereços de funções não exportadas na nova versão.
  2. Migração de Símbolos após Atualização de Programa — Um programa foi engenharia reversa anteriormente e foi atualizado. Evite reverter tudo do zero migrando os resultados antigos em lote.
  3. Atualização de Mecanismo de Proteção — Resultados completos de engenharia reversa da versão antiga disponíveis; nova versão precisa de localização rápida do novo offset da mesma função.
  4. Qualquer cenário de comparação binária onde "versão antiga com símbolos + nova versão sem símbolos".

Divisão de Trabalho com Outros Skills

CenárioO que usar
Engenharia reversa de um binário do zeroida-reverse/ ou radare2/
Resultados antigos disponíveis, migrar para nova versãoEste skill
Comparar dois binários completamente diferentesBinDiff / Diaphora (ferramentas tradicionais)

Vantagens Principais

Comparado às soluções tradicionais:

SoluçãoCusto para 200 funçõesTempoPrecisão
Comparação manual com duas janelas do IDAGrátis, mas desgastanteHorasAlta
Correspondência automática BinDiffGrátisRápidoMédia (falha com grandes mudanças estruturais)
Totalmente delegado ao Agente (CC/Codex)50-100 yuansLentoAlta
Este skill (Comparação em lote com LLM)~1 yuan~10 seg/funçãoAlta

Princípio Central

Função da versão antiga (com símbolos)          Função da nova versão (sem símbolos)
    ↓                              ↓
Exportar desmontagem + pseudocódigo          Exportar desmontagem + pseudocódigo
    ↓                              ↓
    └──────── Comparação Estruturada pelo LLM ────────┘
                    ↓
         Saída YAML (Tabela de mapeamento de símbolos)
                    ↓
         Análise programática → Aplicação em lote ao IDB da nova versão

Pontos-chave:

  • O prompt é um modelo fixo, preenchido programaticamente
  • Formato de entrada e saída determinístico, análise programática
  • O LLM é responsável apenas por "olhar dois trechos de código e encontrar a correspondência"
  • Custo de tempo e tokens extremamente baixos

Modelo de Prompt

Prompt Padrão de Comparação

I have disassembly outputs and procedure code of the same function.

This is the function for reference:

**Disassembly for Reference**
```c
{disasm_for_reference}

Procedure code for Reference

{procedure_for_reference}

This is the function you need to reverse-engineering:

Disassembly to reverse-engineering

{disasm_code}

Procedure code to reverse-engineering

{procedure}

What you need to do is to collect all references to "{symbol_name_list}" in the function you need to reverse-engineering and output those references as YAML.

Example:

found_vcall: # This is for indirect call to virtual function or virtual function pointer fetching.
  - insn_va: '0x180777700' # Always be the instruction with displacement offset
    insn_disasm: call [rax+68h] # Always be the instruction with displacement offset
    vfunc_offset: '0x68'
    func_name: ILoopMode_OnLoopActivate
  - insn_va: '0x180777778' # Always be the instruction with displacement offset
    insn_disasm: mov rax, [rax+80h] # Always be the instruction with displacement offset
    vfunc_offset: '0x80'
    func_name: INetworkMessages_GetNetworkGroupCount

found_call: # This is for direct call to non-virtual regular function.
  - insn_va: '0x180888800'
    insn_disasm: call sub_180999900
    func_name: CLoopMode_RegisterEventMapInternal
  - insn_va: '0x180888880'
    insn_disasm: call sub_180555500
    func_name: CLoopMode_SetSystemState

found_funcptr: # This is for non-virtual regular function pointer.
  - insn_va: '0x180666600' # Must load/reference the function pointer target address
    insn_disasm: lea rdx, sub_15BC910 # Must load/reference the function pointer target address
    funcptr_name: CLoopMode_OnClientPollNetworking

found_gv: # This is for reference to global variable.
  - insn_va: '0x180444400'
    insn_disasm: mov rcx, cs:qword_180666600 # Must load/reference the global variable
    gv_name: g_pNetworkMessages
  - insn_va: '0x180333300'
    insn_disasm: lea rax, unk_180222200 # Must load/reference the global variable
    gv_name: s_EventManager

found_struct_offset: # This is for reference to struct offset. NOTE THAT virtual function pointer should not be here! virtual function pointer should ALWAYS be in found_vcall !
  - insn_va: '0x1801BA12A' # Always be the instruction with displacement offset
    insn_disasm: mov rcx, [r14+58h] # Always be the instruction with displacement offset
    offset: '0x58'
    size: 8
    struct_name: CResourceService
    member_name: m_pEntitySystem

If nothing found, output an empty YAML. DO NOT output anything other than the desired YAML. DO NOT collect unrelated symbols.


### Descrição das Variáveis

| Variável | Fonte | Descrição |
|----------|-------|-----------|
| `{disasm_for_reference}` | Exportação do IDA antigo | Desmontagem com símbolos |
| `{procedure_for_reference}` | Exportação do IDA antigo | Pseudocódigo com símbolos |
| `{disasm_code}` | Exportação do IDA novo | Desmontagem sem símbolos |
| `{procedure}` | Exportação do IDA novo | Pseudocódigo sem símbolos |
| `{symbol_name_list}` | Extraído da versão antiga | Lista de símbolos a serem localizados na nova versão |

## Fluxo de Trabalho

### Fluxo Completo

```text
Passo 1: Preparar Dados
  - Carregar binário antigo no IDA (com PDB/símbolos)
  - Carregar binário novo no IDA (sem símbolos)
  - Encontrar funções âncora idênticas nas duas versões (funções exportadas, referências a strings etc.)

Passo 2: Exportar em Lote
  - Exportar da versão antiga: desmontagem + pseudocódigo da função âncora (com nomes de símbolos)
  - Exportar da versão nova: desmontagem + pseudocódigo da mesma função âncora (sem nomes de símbolos)

Passo 3: Comparação pelo LLM
  - Preencher o modelo de prompt com os dados
  - Chamar a API do LLM (recomendado: DeepSeek para grande volume e baixo custo; funções muito grandes usar GPT)
  - Analisar o YAML retornado

Passo 4: Aplicar Resultados
  - Aplicar o mapeamento de símbolos do YAML em lote ao IDB da nova versão
  - Usar idapro_rename ou script IDAPython para renomear em lote

Passo 5: Iterar
  - As funções migradas na primeira rodada tornam-se novas âncoras
  - Entrar nessas funções e continuar comparando chamadas internas
  - Repetir até cobrir todas as funções alvo

Estratégia de Seleção de Âncoras

Tipo de ÂncoraConfiabilidadeDescrição
Funções ExportadasMais altaNome inalterado, endereço pode mudar
Referências a StringsAltaConteúdo da string inalterado, localização da referência pode mudar
Constantes/Magic NumbersMédiaValor característico inalterado
Padrões de CódigoMédiaEstrutura da função semelhante, mas endereços totalmente alterados

Recomendações para Processamento em Lote

  • Comparar 1 função por vez (evitar explosão de contexto)
  • Funções médias (<200 linhas) usar DeepSeek
  • Funções muito grandes (>500 linhas) usar GPT-4o ou Claude
  • Chamadas concorrentes para aumentar a velocidade (10-20 concorrências)
  • Armazenar em cache resultados intermediários para evitar chamadas repetidas

Formato de Saída

5 Tipos de Símbolos na Saída YAML

TipoSignificadoCampos-chave
found_vcallChamada de função virtual (call indireto)vfunc_offset, func_name
found_callChamada de função diretainsn_va, func_name
found_funcptrReferência a ponteiro de funçãoinsn_va, funcptr_name
found_gvReferência a variável globalinsn_va, gv_name
found_struct_offsetReferência a offset de structoffset, struct_name, member_name

Ações de Aplicação após Análise

found_call → idapro_rename(addr=call_target, name=func_name)
found_vcall → idapro_set_comments(addr=insn_va, comment="vcall: {func_name} @ +{offset}")
found_funcptr → idapro_rename(addr=funcptr_target, name=funcptr_name)
found_gv → idapro_rename(addr=gv_addr, name=gv_name)
found_struct_offset → idapro_set_comments(addr=insn_va, comment="{struct_name}.{member_name}")

Exemplos de Cenários Típicos

Cenário 1: ntoskrnl.exe sem PDB

Já possui: ntoskrnl.exe 10.0.26100.2000 + PDB completo
Objetivo: ntoskrnl.exe 10.0.26100.2605 (PDB removido)
Necessidade: Localizar novo endereço de PspSetCreateProcessNotifyRoutine

Passos:
1. Carregar ambas as versões no IDA
2. Encontrar função exportada PsSetCreateProcessNotifyRoutine (ambas têm)
3. Na versão antiga, ela chama PspSetCreateProcessNotifyRoutine (com símbolo)
4. Na nova versão, ela chama sub_140822108 (sem símbolo)
5. LLM identifica rapidamente: sub_140822108 = PspSetCreateProcessNotifyRoutine
6. Aplicar em lote

Cenário 2: Migração após Atualização de Aplicativo

Já possui: Resultado completo de engenharia reversa do target.exe v1.0 (200+ funções nomeadas)
Objetivo: target.exe v1.1 (todos os símbolos perdidos)
Necessidade: Migrar 200 nomes de função em lote

Passos:
1. Exportar da versão antiga a desmontagem+pseudocódigo de todas as funções nomeadas
2. Na nova versão, encontrar âncoras correspondentes por funções exportadas/strings
3. Chamar LLM em lote para comparação
4. Analisar YAML, renomear em lote
5. Iterar aprofundadamente

Recomendações de Seleção de LLM

ModeloCenário AdequadoCustoVelocidade
DeepSeek V3Funções pequenas/médias (<200 linhas), processamento em loteMuito baixoRápido
GPT-4oFunções muito grandes, fluxo de controle complexoMédioRápido
Claude SonnetFunções médias/grandes, necessidade de raciocínioMédioRápido
Claude OpusFunções extremamente complexas, necessidade de compreensão profundaAltoLento

Estratégia recomendada: Padrão DeepSeek, atualizar automaticamente quando houver estouro de contexto ou resultados imprecisos.

Observações

  • Não jogue o binário inteiro para o LLM — Compare apenas uma função por vez
  • Âncoras devem ser confiáveis — Se a âncora estiver errada, todo o resto será em vão
  • Resultados precisam de verificação manual — O LLM não é 100% preciso; símbolos críticos devem ser validados
  • Armazene resultados intermediários em cache — Evite chamadas repetidas desperdiçando tokens
  • Atenção aos limites de contexto — Funções muito grandes (>1000 linhas de desmontagem) precisam ser divididas ou usar modelos de contexto grande

Bootstrap Sob Demanda (On-Demand Bootstrap)

Dependências de Ferramentas

FerramentaUsoInstalação Automática
IDA ProExportar desmontagem/pseudocódigo✗ (Software comercial)
PythonExecução de scripts, chamadas de API✓
PyYAMLAnalisar YAML retornado pelo LLM✓ (pip install pyyaml)
LLM APIExecutar comparaçãoNecessita chave de API

Observação

Este skill não depende de instalação pesada de ferramentas; depende principalmente de:

  • IDA Pro já existente (gerenciado pelo skill ida-reverse/)
  • Python + requests/httpx (para chamar API)
  • Um endpoint de API LLM

Contexto de Roteamento

Entrada a montante: skills/SKILL.md (controle principal), routing.md Condição de disparo: Possui símbolos/resultados de engenharia reversa da versão antiga, necessidade de migrar para nova versão Saída a jusante:

  • Necessário abrir binário primeiro → ida-reverse/
  • Necessário reconhecimento rápido para confirmar diferenças de versão → radare2/

Módulos associados no mesmo nível: ida-reverse/ (exportação de dados e aplicação de símbolos são feitos através do IDA)

Autoverificação de Conclusão da Tarefa (DEVE passar antes de afirmar conclusão)

  • Executei cada passo do fluxo de trabalho (e não apenas li)?
  • Usei caminhos reais de ferramentas com base no tool-index?
  • Produzi evidências reproduzíveis (comandos/scripts/capturas de tela/relatórios)?
  • Completei e registrei os itens da Checklist exigidos pelas REGRAS?

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

api-security

Use for authorized security assessment of REST, GraphQL, WebSocket, or SOAP APIs, including discovery, authentication, authorization, rate-limit, and CI/CD testing.

apk-reverse

在 CLI 环境下做 Android APK 逆向时使用。适用于 APK 解包、Java 反编译、smali 修改、重打包、Frida 动态 Hook,以及按需切换到 so/native 分析。优先使用本机已安装的 jadx、apktool、frida、adb、ida-reverse、radare2。

attack-chain

Use for authorized multi-stage attack-path planning and orchestration when a task spans reconnaissance, initial access, privilege escalation, lateral movement, or impact assessment. Route single-stage tasks directly to their specialist skill.

binary-ninja-reverse

Use for authorized binary analysis in Binary Ninja, including HLIL/MLIL/LLIL inspection, strings/imports/exports, cross-references, types, patch review, Python API automation, and optional Binary Ninja MCP or localhost HTTP integration.

browser-automation

|

browser-extension-reverse

Use for authorized reverse engineering of browser extensions (Chrome/Firefox) including manifest analysis, background workers, and extension-based credential or traffic logic recovery.

case-review

Reviews a reverse-skill case package for scope readiness, Evidence to Finding to Path traceability, work item coverage, timeline references, and optional artifact hash integrity before report handoff.

cloud-k8s

Use for authorized cloud, container, and Kubernetes security assessment including metadata SSRF, IAM misconfig, container escape paths, and cluster RBAC review.

code-audit

Use for authorized source-code security review and SAST workflows including Semgrep, CodeQL patterns, dangerous API hunting, and fix verification.

ctf-sandbox

Thin PRIMARY for CTF / AWD / 靶场 multi-type orchestration. Hands off to the sidecar CTF-Sandbox-Orchestrator. Use when the user says CTF, AWD, 靶场, or 比赛题 and no more specific pwn/APK/IDA route already won.

database-security

Use for authorized database security assessment covering PostgreSQL/MySQL/MSSQL/Mongo/Redis exposure, authz, UDF/command paths, and misconfiguration review.

diagram-generator

generate, refine, validate, and render diagrams from natural language, notes, code snippets, schemas, tables, or existing diagram source. use for flowcharts, swimlanes, sequence diagrams, state diagrams, er diagrams, class diagrams, architecture/c4-style diagrams, dependency graphs, gantt charts, mind maps, user journeys, sankey-style flows, org charts, network graphs, and other visual models. supports mermaid by default, graphviz dot for complex graph layout, plantuml for uml-heavy engineering diagrams, and svg output when direct markup is more reliable.

digital-forensics

Use for authorized digital forensics including memory dumps, disk timelines, PCAP investigation, artifact triage, and IR evidence preservation.

docs-generator

|

dotnet-reverse

.NET / C# 二进制逆向。当目标是 .NET assembly(PE 头含 CLR、.exe/.dll 托管程序)、C# 编译产物(含 NativeAOT)、红队 Sharp* 工具(Rubeus / SharpHound / SharpHound 等)、.NET 混淆程序(ConfuserEx / SmartAssembly / Babel / Eazfuscator)、.NET loader / info-stealer / 套壳 malware 时使用。优先用 dnSpyEx + de4dot,需要 AI 直接操作时联动 dnSpy MCP。不用于纯 native 二进制(走 reverse-engineering / ida-reverse)。

edr-bypass-re

|

email-security

Use for authorized email security review including phishing analysis, header authentication (SPF/DKIM/DMARC), BEC patterns, and mailbox token abuse research.

firmware-pentest

|

ghidra-reverse

Use for free/open reverse engineering with Ghidra (headless or GUI), including decompile, cross-refs, and optional Ghidra MCP workflows when IDA is unavailable.

go-rust-reverse

Use for reverse engineering stripped Go and Rust binaries including runtime recognition, pclntab/moduel data recovery, panic strings, and idiomatic decompilation recovery.

Habilidades Relacionadas