Communitygithub.com

binary-diff

Migration de symboles entre versions binaires, utilisant un LLM pour comparer du désassemblage et du pseudo-code entre une version de référence (symbolisée) et une version cible (non symbolisée).

Qu'est-ce que binary-diff ?

Ce skill, nommé « Cross-Version Symbol Migration (Binary Diff) », automatise le transfert de symboles d'une version d'un binaire à une autre, par exemple lors d'une mise à jour de programme ou de la disparition d'un fichier PDB. Il s'appuie sur un template de prompt standardisé qui fournit à un LLM (comme DeepSeek, GPT-4o ou Claude) le désassemblage et le pseudo-code d'une même fonction dans les deux versions, ainsi que la liste des symboles à retrouver. Le LLM produit un fichier YAML listant les correspondances (appels virtuels, appels directs, pointeurs de fonction, variables globales, offsets de structure). Ce résultat est ensuite appliqué automatiquement à l'IDB de la nouvelle version via des scripts Python (IDAPython). La méthode est économique (environ 1 yuan pour 200 fonctions) et rapide (environ 10 secondes par fonction), tout en maintenant une haute précision grâce à l'analyse détaillée du LLM. Le skill est conçu pour être utilisé avec des outils comme IDA Pro et des API LLM, et inclut des stratégies de sélection de points d'ancrage, des recommandations de modèles LLM et des workflows par étapes pour une migration complète et itérative.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Migration de symboles entre versions binaires (Binary Diff)

ACTION REQUISE (À EXÉCUTER IMMÉDIATEMENT APRÈS LECTURE)

  1. MAINTENANT : Lire ../field-journal/precedent-reverse.md — confirmer que l'utilisation de ce skill est une opération autorisée et courante.
  2. MAINTENANT : Confirmer que la tâche actuelle correspond au champ d'application de ce skill.
  3. SUIVANT : Lire ../tool-index.md pour vérifier la disponibilité et le chemin réel des outils.
  4. SUIVANT : Si un outil manque, appeler bootstrap, ne pas deviner le chemin.
  5. AGIR : Passer à la première étape du "Workflow" et exécuter, ne pas rester en état de confirmation.

Champ d'application

Utilisez ce skill lorsque la tâche correspond à l'un des scénarios suivants :

  1. Noyau/pilote sans PDB — Vous disposez des symboles d'une ancienne version de ntoskrnl.exe, mais le PDB de la nouvelle version a été retiré par Microsoft. Vous devez déduire les adresses des fonctions non exportées de la nouvelle version à l'aide des symboles de l'ancienne.
  2. Migration de symboles après mise à jour d'un programme — Vous avez déjà rétroconçu un programme, celui-ci a été mis à jour, et vous ne voulez pas tout recommencer. Vous utilisez les résultats de l'ancienne version pour migrer en masse.
  3. Mise à jour d'un mécanisme de protection — L'ancienne version dispose de résultats de rétro-ingénierie complets, la nouvelle version nécessite de localiser rapidement les nouveaux offsets des mêmes fonctions.
  4. Tout scénario de comparaison binaire où "ancienne version avec symboles + nouvelle version sans symboles"

Répartition avec les autres skills

ScénarioSkill à utiliser
Rétro-concevoir un binaire à partir de zéroida-reverse/ ou radare2/
Disposer de résultats d'ancienne version, migrer vers la nouvelleCe skill
Comparer deux binaires complètement différentsBinDiff / Diaphora (outils traditionnels)

Avantages clés

Comparé aux approches traditionnelles :

MéthodeCoût pour 200 fonctionsTempsPrécision
Comparaison manuelle avec deux IDA ouvertsGratuit mais épuisantPlusieurs heuresÉlevée
Appariement automatique avec BinDiffGratuitRapideMoyenne (échec en cas de changements structurels importants)
Confier entièrement à un Agent (CC/Codex)50-100 yuansLentÉlevée
Ce skill (comparaison par LLM par lots)~1 yuan~10 secondes/fonctionÉlevée

Principe fondamental

Fonction ancienne (symbolisée)          Fonction nouvelle (non symbolisée)
    ↓                                              ↓
Export désassemblage + pseudo-code          Export désassemblage + pseudo-code
    ↓                                              ↓
    └──────── Comparaison structurée LLM ──────────┘
                    ↓
          Sortie YAML (table de mappage des symboles)
                    ↓
          Analyse programmatique → Application par lots à l'IDB (nouvelle version)

Points clés :

  • Le prompt est un modèle fixe, rempli de manière programmatique
  • Le format d'entrée et de sortie est déterminé et analysé programmatiquement
  • Le LLM est uniquement responsable de l'étape "examiner deux extraits de code et identifier les correspondances"
  • Le coût en temps et en tokens est extrêmement bas

Modèle de prompt

Prompt de comparaison standard

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.


### Description des variables

| Variable | Source | Description |
|----------|--------|-------------|
| `{disasm_for_reference}` | Export IDA ancienne version | Désassemblage symbolisé |
| `{procedure_for_reference}` | Export IDA ancienne version | Pseudo-code symbolisé |
| `{disasm_code}` | Export IDA nouvelle version | Désassemblage non symbolisé |
| `{procedure}` | Export IDA nouvelle version | Pseudo-code non symbolisé |
| `{symbol_name_list}` | Extrait de l'ancienne version | Liste des symboles à localiser dans la nouvelle version |

## Workflow

### Processus complet

```text
Étape 1 : Préparer les données
  - Charger l'ancien binaire dans IDA (avec PDB/symboles)
  - Charger le nouveau binaire dans IDA (sans symboles)
  - Trouver les mêmes fonctions d'ancrage dans les deux versions (fonctions exportées, références de chaînes, etc.)

Étape 2 : Export par lots
  - Depuis l'ancienne version : exporter le désassemblage + pseudo-code des fonctions d'ancrage (avec noms de symboles)
  - Depuis la nouvelle version : exporter le désassemblage + pseudo-code des mêmes fonctions d'ancrage (sans noms de symboles)

Étape 3 : Comparaison LLM
  - Remplir le modèle de prompt avec les données
  - Appeler l'API LLM (recommandé : DeepSeek pour un volume important et peu coûteux, GPT pour les très grandes fonctions)
  - Analyser le YAML retourné

Étape 4 : Appliquer les résultats
  - Appliquer par lots le mappage des symboles du YAML à l'IDB de la nouvelle version
  - Utiliser `idapro_rename` ou un script IDAPython pour renommer en masse

Étape 5 : Itérer
  - Les fonctions migrées lors du premier tour deviennent de nouvelles ancres
  - Entrer dans ces fonctions et continuer à comparer les appels internes
  - Répéter jusqu'à couvrir toutes les fonctions cibles

Stratégie de sélection des points d'ancrage

Type d'ancrageFiabilitéDescription
Fonction exportéeLa plus élevéeLe nom ne change pas, l'adresse peut changer
Référence de chaîneÉlevéeLe contenu de la chaîne ne change pas, l'emplacement de la référence peut changer
Constante / Nombre magiqueMoyenneValeur caractéristique ne change pas
Motif de codeMoyenneStructure de fonction similaire mais adresses complètement différentes

Recommandations pour le traitement par lots

  • Comparer 1 fonction à la fois (éviter l'explosion du contexte)
  • Pour les fonctions de taille moyenne (<200 lignes), utiliser DeepSeek
  • Pour les très grandes fonctions (>500 lignes), utiliser GPT-4o ou Claude
  • Appels concurrents pour augmenter la vitesse (10-20 en parallèle)
  • Mettre en cache les résultats intermédiaires pour éviter les appels redondants

Format de sortie

5 types de symboles dans la sortie YAML

TypeSignificationChamps clés
found_vcallAppel de fonction virtuelle (appel indirect)vfunc_offset, func_name
found_callAppel de fonction directeinsn_va, func_name
found_funcptrRéférence à un pointeur de fonctioninsn_va, funcptr_name
found_gvRéférence à une variable globaleinsn_va, gv_name
found_struct_offsetRéférence à un offset de structureoffset, struct_name, member_name

Actions d'application après analyse

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}")

Exemples de scénarios typiques

Scénario 1 : ntoskrnl.exe sans PDB

Déjà disponible : ntoskrnl.exe 10.0.26100.2000 + PDB complet
Cible : ntoskrnl.exe 10.0.26100.2605 (PDB retiré)
Besoin : Localiser la nouvelle adresse de PspSetCreateProcessNotifyRoutine

Étapes :
1. Charger les deux versions dans IDA
2. Trouver la fonction exportée PsSetCreateProcessNotifyRoutine (présente dans les deux versions)
3. Dans l'ancienne version, elle appelle PspSetCreateProcessNotifyRoutine (symbolisé)
4. Dans la nouvelle version, elle appelle sub_140822108 (non symbolisé)
5. Le LLM identifie immédiatement : sub_140822108 = PspSetCreateProcessNotifyRoutine
6. Appliquer par lots

Scénario 2 : Migration après mise à jour d'une application

Déjà disponible : Résultats de rétro-ingénierie complets de target.exe v1.0 (200+ fonctions nommées)
Cible : target.exe v1.1 (tous les symboles perdus)
Besoin : Migrer en masse 200 noms de fonctions

Étapes :
1. Depuis l'ancienne version, exporter le désassemblage + pseudo-code de toutes les fonctions nommées
2. Dans la nouvelle version, trouver les points d'ancrage correspondants via les fonctions exportées/chaînes
3. Appeler le LLM par lots pour la comparaison
4. Analyser le YAML, renommer en masse
5. Itérer en profondeur

Recommandations de sélection du LLM

ModèleScénario adaptéCoûtVitesse
DeepSeek V3Fonctions petites à moyennes (<200 lignes), traitement par lotsTrès faibleRapide
GPT-4oTrès grandes fonctions, flux de contrôle complexesMoyenRapide
Claude SonnetFonctions moyennes à grandes, nécessitant du raisonnementMoyenRapide
Claude OpusFonctions extrêmement complexes, nécessitant une compréhension approfondieÉlevéLent

Stratégie recommandée : DeepSeek par défaut, mise à niveau automatique en cas de dépassement de contexte ou de résultats inexacts.

Avertissements

  • Ne pas donner l'intégralité du binaire au LLM — Comparer une seule fonction à la fois.
  • Les points d'ancrage doivent être fiables — Si l'ancrage lui-même est mal identifié, tout le travail ultérieur est perdu.
  • Les résultats doivent être vérifiés manuellement — Le LLM n'est pas fiable à 100 %, les symboles critiques doivent être validés.
  • Mettre en cache les résultats intermédiaires — Éviter les appels redondants pour économiser les tokens.
  • Attention aux limites de contexte — Les très grandes fonctions (>1 000 lignes de désassemblage) doivent être divisées ou utiliser un modèle à grand contexte.

Bootstrap à la demande (On-Demand Bootstrap)

Dépendances d'outils

OutilUtilisationInstallation automatique possible ?
IDA ProExport désassemblage/pseudo-code✗ (Logiciel commercial)
PythonExécution de scripts, appels API✓
PyYAMLAnalyse du YAML retourné par le LLM✓ (pip install pyyaml)
API LLMEffectuer la comparaisonNécessite une clé API

Remarque

Ce skill ne dépend pas de l'installation d'outils lourds, il repose principalement sur :

  • IDA Pro déjà installé (géré par le skill ida-reverse/)
  • Python + requests/httpx (pour appeler l'API)
  • Un point de terminaison d'API LLM

Contexte de routage

Entrée amont : skills/SKILL.md (contrôle principal), routing.md Condition de déclenchement : Disposer de symboles / résultats de rétro-ingénierie d'une ancienne version et nécessiter une migration vers une nouvelle version. Sortie aval :

  • Nécessité d'ouvrir d'abord le binaire → ida-reverse/
  • Nécessité d'une reconnaissance rapide pour confirmer les différences de version → radare2/

Modules associés au même niveau : ida-reverse/ (l'export de données et l'application des symboles passent par IDA)

Auto-vérification avant de déclarer la tâche terminée (MUST à réussir)

  • Ai-je exécuté chaque étape du workflow (et pas seulement lu) ?
  • Ai-je utilisé les chemins d'outils réels basés sur tool-index ?
  • Ai-je produit des preuves reproductibles (commandes/scripts/captures d'écran/rapports) ?
  • Ai-je complété et renseigné les éléments de la checklist demandés dans RULES ?

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.

Skills associés