Pular para o conteúdo
Skillpedia
Código em geral42 mil · #4750

binary-diff

Permite comparar diferentes versões de binários. Ele ajuda a migrar símbolos e nomes de funções entre versões de programas para agilizar a análise de atualizações.

O que ela faz

Esta ferramenta ajuda a comparar duas versões de um programa de computador para encontrar as mesmas funções e informações. É útil quando você tem informações de uma versão antiga e quer aplicá-las a uma versão nova, economizando tempo.

Quando usar

  • ✓Quando um programa é atualizado e você quer reaproveitar o trabalho de análise anterior.
  • ✓Se você tem informações de um programa antigo e precisa encontrar o mesmo em uma versão mais recente.
  • ✓Para comparar partes de código entre diferentes versões de um mesmo programa.

Exemplo do que pedir para a IA

“Preciso comparar a versão 1.0 deste programa com a versão 2.0 para ver onde as funções mudaram.”

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/zhaoxuya520/reverse-skill/blob/main/skills/binary-diff/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/zhaoxuya520/reverse-skill/blob/main/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 informações de código de uma versão antiga (com nomes) e compara com a nova (sem nomes). Ela usa inteligência artificial para achar as correspondências e gerar um relatório.

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 zhaoxuya520/reverse-skill --skill binary-diff

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/zhaoxuya520/reverse-skill/main/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 (Binary Diff)

AÇÃO NECESSÁRIA (Execute imediatamente após a leitura)

  1. NOW: Leia ../field-journal/precedent-reverse.md — Confirme se a operação desta skill é uma operação regular autorizada.
  2. NOW: Confirme se a tarefa atual se enquadra no escopo desta skill.
  3. NEXT: Leia ../tool-index.md, valide a disponibilidade e o caminho real da ferramenta.
  4. NEXT: Chame o bootstrap se a ferramenta estiver faltando, não adivinhe o caminho.
  5. ACT: Entre na primeira etapa do "Fluxo de Trabalho" e execute, não permaneça no estado de confirmação.

Escopo de Aplicação

Use esta skill 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 removido pela Microsoft, e é necessário usar símbolos da versão antiga para deduzir 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 engenharia reversa de um programa, o programa foi atualizado e você não quer refazer tudo, use os resultados da versão antiga para migrar em massa.
  3. Atualização de Mecanismo de Proteção — A versão antiga possui resultados completos de engenharia reversa, 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 da Versão Antiga + Sem Símbolos da Versão Nova"

Divisão de Tarefas com Outras Skills

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 skill
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 de duas janelas do IDA Grátis, mas custa a vida Horas Alta
Correspondência automática do BinDiff Grátis Rápido Média (falha quando a estrutura muda muito)
Deixar completamente para o Agente (CC/Codex) R$ 50-100 Lento Alta
Esta skill (comparação em massa 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 token 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: # 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 | 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
Etapa 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 idênticas em ambas as versões (funções exportadas, referências de string, etc.)

Etapa 2: Exportar em Massa

…
Perguntas frequentes

Por que usar isso em vez de comparar manualmente?

Comparar manualmente leva muito tempo. Esta ferramenta usa IA para fazer a maior parte do trabalho pesado, sendo muito mais rápida e barata para comparar muitas funções.

O que são 'símbolos'?

Símbolos são como nomes que os programadores dão para funções e variáveis. Quando um programa é atualizado, esses nomes podem se perder ou mudar, e esta ferramenta ajuda a encontrá-los novamente.

Isso funciona para qualquer programa?

Funciona melhor para programas onde você tem acesso ao código desmontado (como o que um engenheiro reverso obtém) de ambas as versões e precisa mapear informações de uma para a outra.

Detalhes

Descrição original do autor

跨版本符号迁移与二进制差分。当你有旧版本的符号/逆向结果,需要快速迁移到新版本时使用。 适用场景:内核缺 PDB 用旧版符号推导、程序更新后批量迁移函数名、应用更新后快速定位新偏移。 核心方法:用 LLM 做结构化差异比对,程序化输入输出,成本极低(200 函数 ~1 元)。 触发关键词:符号迁移、bindiff、跨版本、PDB 缺失、函数偏移迁移、symbol migration、binary diff、版本对比。

repo: zhaoxuya520/reverse-skill

Popularidade

Estrelas no GitHub
42 mil
Posição no ranking
#4750
Licença
MIT
Atualizada em
22/09/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas