Pular para o conteúdo
Skillpedia
Deploy e nuvem (DevOps)48 mil · #2419

binary-diff

Ajuda seu agente a comparar versões de programas compilados. Ele pode identificar mudanças, recuperar nomes de funções e manter anotações após atualizações.

O que ela faz

Esta ferramenta compara duas versões de um programa de computador para encontrar as mesmas funções e informações, mesmo que os nomes originais tenham sido perdidos. Ela ajuda a transferir anotações e nomes de funções de uma versão antiga para uma nova.

Quando usar

  • ✓Quando um programa é atualizado e você precisa manter as anotações antigas.
  • ✓Ao tentar encontrar funções que mudaram entre duas versões de um programa sem informações originais.
  • ✓Para recuperar nomes de funções perdidas após uma atualização de software.

Exemplo do que pedir para a IA

“Compare a versão antiga deste programa com a nova e me diga onde estão as funções que foram movidas ou renomeadas.”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/binary-diff/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/binary-diff/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

A ferramenta pega o código de ambas as versões do programa, usa um modelo de linguagem para comparar as partes e gera um mapa das correspondências. Esse mapa é então usado para renomear ou anotar as funções na nova versão.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add sickn33/agentic-awesome-skills --skill binary-diff

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/binary-diff/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Migração de Símbolos Entre Versões (Diferença Binária)

Quando Usar

  • Um programa foi atualizado e anotações/símbolos antigos precisam ser migrados para a nova compilação.
  • Recuperando funções alteradas entre duas versões de um binário "strippado" (sem símbolos).

Âmbito de Aplicação

Use esta habilidade quando a tarefa se enquadrar nos seguintes cenários:

  1. Kernel/Driver sem PDB — Possui símbolos da versão antiga do ntoskrnl.exe, o PDB da nova versão foi descontinuado pela Microsoft, e é necessário usar os símbolos da versão antiga para inferir o endereço de funções não exportadas da nova versão.
  2. Migração de Símbolos após Atualização de Programa — Você já fez a engenharia reversa de um programa, ele foi atualizado, e você não quer refazer tudo. Use os resultados da versão antiga para migrar em lote.
  3. Atualização de Mecanismo de Proteção — A versão antiga possui resultados completos de engenharia reversa, e a nova versão precisa localizar rapidamente o novo deslocamento da mesma função.
  4. Qualquer Cenário de Comparação Binária "com Símbolos Antigos + Nova Versão sem Símbolos"

Divisão de Tarefas com Outras Habilidades

Cenário O que usar
Engenharia reversa de um binário do zero ida-reverse/ ou radare2/
Possui resultados da versão antiga, migrando para a nova versão Esta habilidade
Comparação de dois binários completamente diferentes BinDiff / Diaphora (ferramentas tradicionais)

Vantagens Principais

Comparado a soluções tradicionais:

Solução Custo para 200 Funções Tempo Precisão
Comparação manual com duas janelas do IDA Grátis, mas consome a vida Horas Alta
Correspondência automática do BinDiff Grátis Rápido Média (falha quando a estrutura muda muito)
Entregar totalmente para o Agente (CC/Codex) R$ 50-100 Lento Alta
Esta habilidade (comparação em lote com LLM) ~R$ 1 ~10 segundos/função Alta

Princípio Central

旧版函数(有符号)          新版同一函数(无符号)
    ↓                              ↓
导出反汇编 + 伪代码          导出反汇编 + 伪代码
    ↓                              ↓
    └──────── LLM 结构化比对 ────────┘
                    ↓
         输出 YAML(符号映射表)
                    ↓
         程序化解析 → 批量应用到新版 IDB

Pontos chave:

  • O prompt é um modelo fixo, preenchido programaticamente.
  • O formato de entrada e saída é definido, analisado programaticamente.
  • O LLM é responsável apenas pela etapa de "olhar dois trechos de código e encontrar a relação correspondente".
  • Custo de tempo e custo de tokens são extremamente baixos.

Modelo de Prompt

Prompt de Comparação Padrã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: # Isso é para chamadas indiretas a funções virtuais ou busca de ponteiros de função virtual.
  - insn_va: '0x180777700' # Sempre será a instrução com deslocamento
    insn_disasm: call [rax+68h] # Sempre será a instrução com deslocamento
    vfunc_offset: '0x68'
    func_name: ILoopMode_OnLoopActivate
  - insn_va: '0x180777778' # Sempre será a instrução com deslocamento
    insn_disasm: mov rax, [rax+80h] # Sempre será a instrução com deslocamento
    vfunc_offset: '0x80'
    func_name: INetworkMessages_GetNetworkGroupCount

found_call: # Isso é para chamadas diretas a funções regulares não virtuais.
  - 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: # Isso é para ponteiros de função regulares não virtuais.
  - insn_va: '0x180666600' # Deve carregar/referenciar o endereço alvo do ponteiro de função
    insn_disasm: lea rdx, sub_15BC910 # Deve carregar/referenciar o endereço alvo do ponteiro de função
    funcptr_name: CLoopMode_OnClientPollNetworking

found_gv: # Isso é para referências a variáveis globais.
  - insn_va: '0x180444400'
    insn_disasm: mov rcx, cs:qword_180666600 # Deve carregar/referenciar a variável global
    gv_name: g_pNetworkMessages
  - insn_va: '0x180333300'
    insn_disasm: lea rax, unk_180222200 # Deve carregar/referenciar a variável global
    gv_name: s_EventManager

found_struct_offset: # Isso é para referências a deslocamentos de estrutura. OBSERVE QUE ponteiros de função virtual NÃO devem estar aqui! Ponteiros de função virtual devem SEMPRE estar em found_vcall!
  - insn_va: '0x1801BA12A' # Sempre será a instrução com deslocamento
    insn_disasm: mov rcx, [r14+58h] # Sempre será a instrução com deslocamento
    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 | Origem | Descrição |
|------|------|------|
| `{disasm_for_reference}` | Exportado do IDA da versão antiga | Desmontagem com símbolos |
| `{procedure_for_reference}` | Exportado do IDA da versão antiga | Pseudocódigo com símbolos |
| `{disasm_code}` | Exportado do IDA da nova versão | Desmontagem sem símbolos |
| `{procedure}` | Exportado do IDA da nova versão | 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 da versão antiga no IDA (com PDB/símbolos)
  - Carregar binário da nova versão no IDA (sem símbolos)
  - Encontrar funções âncora comuns entre as duas versões (funções exportadas, referências a strings, etc.)

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

Passo 3: Comparação com LLM
  - Preencher o modelo de prompt com os dados

…
Perguntas frequentes

O que são 'PDBs'?

PDBs (Program Database) são arquivos que contêm informações de depuração e símbolos para programas. Eles ajudam a entender o código, mas às vezes não estão disponíveis para versões mais novas de softwares.

Por que usar esta ferramenta em vez de comparar manualmente?

Comparar manualmente pode levar horas e é propenso a erros. Esta ferramenta automatiza o processo, sendo mais rápida e precisa para encontrar correspondências entre versões.

O que significa 'binário sem símbolos'?

Significa que o programa foi compilado de forma a remover informações que ajudam a identificar nomes de funções e variáveis, tornando a análise mais difícil.

Detalhes

Descrição original do autor

Cross-version binary symbol migration: diff updated binaries, recover function names without PDBs, and propagate annotations after software updates using BinDiff-style tooling.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#2419
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas