Communitygithub.com

binary-diff

Dieses Skill migriert binäre Symbole von einer älteren Version einer Anwendung oder eines Kernels auf eine neuere Version, wenn PDB-Dateien nicht verfügbar sind oder eine erneute Analyse vermieden werden soll.

Was ist binary-diff?

Das `binary-diff` Skill ist darauf ausgelegt, Entwicklern und Sicherheitsforschern zu helfen, wenn eine neuere Version einer Binärdatei ohne Symbole (z. B. fehlende PDB) vorliegt, aber eine ältere Version mit vollständigen Symbolen vorhanden ist. Anstatt die neue Version manuell zu reverse-engineeren, nutzt dieses Skill Large Language Models (LLMs), um Disassembly-Code und Prozedurcode der gleichen Funktion aus beiden Versionen zu vergleichen. Es generiert eine YAML-Abbildungstabelle, die symbolische Namen (Funktionen, globale Variablen, Strukturoffsets) aus der alten Version auf die entsprechenden Adressen in der neuen Version überträgt. Die Anwendung ist besonders effizient, wenn nur ~10 Sekunden pro Funktion benötigt werden und die Token-Kosten minimal sind (ca. 1 Yuan pro 200 Funktionen). Es wird typischerweise in Kombination mit IDA Pro verwendet, um die Ergebnisse programmatisch in die neue IDB anzuwenden. Die Hauptidee ist es, einen festen Prompt (der nur die beiden Codeblöcke und eine Liste von Symbolnamen enthält) zu füllen, die LLM-Antwort (YAML) zu parsen und die Renames per Skript durchzuführen.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Binärdiff (Binary Diff)

AKTION ERFORDERLICH (Nach dem Lesen sofort ausführen)

  1. NOW: Lese ../field-journal/precedent-reverse.md – bestätige, dass die Verwendung dieses Skills eine autorisierte Routineoperation ist
  2. NOW: Stelle fest, ob die aktuelle Aufgabe in den Anwendungsbereich dieses Skills fällt
  3. NEXT: Lese ../tool-index.md, überprüfe die Verfügbarkeit der Tools und die tatsächlichen Pfade
  4. NEXT: Bei fehlenden Tools rufe bootstrap auf, rate keine Pfade
  5. ACT: Beginne mit Schritt 1 des Arbeitsablaufs und führe ihn aus, bleibe nicht im Bestätigungsstatus hängen

Anwendungsbereich

Dieses Skill wird verwendet, wenn die Aufgabe zu folgenden Szenarien gehört:

  1. Kernel-/Treiber-PDB fehlt – Symbole für eine alte Version von ntoskrnl.exe sind vorhanden, die neue PDB wurde von Microsoft entfernt, und es müssen Adressen von nicht exportierten Funktionen in der neuen Version mit Hilfe der alten Symbole abgeleitet werden
  2. Symbolmigration nach Programmupdate – Ein Programm wurde bereits rekonstruiert (reversed), aber es wurde aktualisiert. Um nicht alles erneut rekonstruieren zu müssen, werden die alten Ergebnisse in einer Massenmigration übertragen
  3. Schutzmechanismus-Updates – Die alte Version hat vollständige Reverse-Engineering-Ergebnisse, für die neue Version müssen schnell die neuen Offsets derselben Funktionen lokalisiert werden
  4. Jegliche Binärvergleiche, bei denen „alte Symbole + neue Version ohne Symbole" vorliegen

Aufgabenteilung mit anderen Skills

SzenarioVerwendetes Tool
Rekonstruktion einer Binärdatei von Grund aufida-reverse/ oder radare2/
Migrieren von alten Ergebnissen zur neuen VersionDieses Skill
Vergleich zweier vollständig unterschiedlicher BinärdateienBinDiff / Diaphora (traditionelle Tools)

Kernvorteile

Vergleich mit traditionellen Ansätzen:

AnsatzKosten für 200 FunktionenZeitGenauigkeit
Manueller Vergleich mit zwei IDA-FensternKostenlos, aber zeitaufwändigStundenHoch
Automatischer Abgleich mit BinDiffKostenlosSchnellMittel (versagt bei großen Strukturänderungen)
Vollständig an Agent (CC/Codex) übergeben50-100 YuanLangsamHoch
Dieses Skill (LLM-Massenvergleich)~1 Yuan~10 Sek./FunktionHoch

Kernprinzip

Alte Funktion (mit Symbolen)          Neue gleiche Funktion (ohne Symbole)
    ↓                                        ↓
Export von Disassembly + Pseudocode    Export von Disassembly + Pseudocode
    ↓                                        ↓
    └──────── LLM-strukturierter Vergleich ────────┘
                    ↓
         Ausgabe YAML (Symbol-Abbildungstabelle)
                    ↓
         Programmatisches Parsen → Massenanwendung auf neue IDB

Wichtige Punkte:

  • Der Prompt ist eine feste Vorlage, die programmatisch gefüllt wird
  • Das Eingabe- und Ausgabeformat ist festgelegt und wird programmatisch geparst
  • Das LLM ist nur für den Schritt „Zwei Codeblöcke ansehen und die Beziehung finden" zuständig
  • Zeit- und Token-Kosten sind extrem niedrig

Prompt-Vorlage

Standard-Vergleichs-Prompt

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.


### Variablenbeschreibung

| Variable | Quelle | Beschreibung |
| -------- | ------ | ------------ |
| `{disasm_for_reference}` | Export aus alter IDA | Disassembly mit Symbolen |
| `{procedure_for_reference}` | Export aus alter IDA | Pseudocode mit Symbolen |
| `{disasm_code}` | Export aus neuer IDA | Disassembly ohne Symbole |
| `{procedure}` | Export aus neuer IDA | Pseudocode ohne Symbole |
| `{symbol_name_list}` | Extraktion aus alter Version | Liste der Symbole, die in der neuen Version lokalisiert werden sollen |

## Arbeitsablauf

### Vollständiger Ablauf

```text
Schritt 1: Daten vorbereiten
  - Alte Binärdatei in IDA laden (mit PDB/Symbolen)
  - Neue Binärdatei in IDA laden (ohne Symbole)
  - Gleiche Ankerfunktionen in beiden Versionen finden (exportierte Funktionen, String-Referenzen usw.)

Schritt 2: Massenexport
  - Aus der alten Version exportieren: Disassembly + Pseudocode der Ankerfunktionen (mit Symbolnamen)
  - Aus der neuen Version exportieren: Disassembly + Pseudocode der gleichen Ankerfunktionen (ohne Symbolnamen)

Schritt 3: LLM-Vergleich
  - Die Daten mit der Prompt-Vorlage füllen
  - LLM-API aufrufen (Empfehlung: DeepSeek für große Mengen und niedrige Kosten, sehr große Funktionen mit GPT)
  - Das zurückgegebene YAML parsen

Schritt 4: Ergebnisse anwenden
  - Die Symbolabbildungen aus dem YAML massenhaft auf die neue IDB anwenden
  - Mit idapro_rename oder einem IDAPython-Skript massenhaft umbenennen

Schritt 5: Iterieren
  - Die in der ersten Runde migrierten Funktionen werden zu neuen Ankern
  - In diese Funktionen einsteigen und die internen Aufrufe weiter vergleichen
  - Wiederholen, bis alle Zielfunktionen abgedeckt sind

Ankerauswahlstrategie

AnkertypZuverlässigkeitBeschreibung
Exportierte FunktionHöchsteName ändert sich nicht, Adresse kann sich ändern
String-ReferenzHochString-Inhalt ändert sich nicht, Referenzposition kann sich ändern
Konstante/Magische ZahlMittelMerkmalswert ändert sich nicht
Code-MusterMittelFunktion ist strukturell ähnlich, aber alle Adressen ändern sich

Batch-Verarbeitungsempfehlungen

  • Pro Vergleich nur 1 Funktion (um Kontextexplosion zu vermeiden)
  • Mittlere Funktionen (<200 Zeilen) mit DeepSeek
  • Sehr große Funktionen (>500 Zeilen) mit GPT-4o oder Claude
  • Gleichzeitige Aufrufe zur Geschwindigkeitssteigerung (10-20 parallel)
  • Zwischenergebnisse cachen, um wiederholte Aufrufe zu vermeiden

Ausgabeformat

5 Symboltypen im YAML-Ausgabeformat

TypBedeutungWichtige Felder
found_vcallVirtueller Funktionsaufruf (indirekter Call)vfunc_offset, func_name
found_callDirekter Funktionsaufrufinsn_va, func_name
found_funcptrFunktionszeiger-Referenzinsn_va, funcptr_name
found_gvReferenz auf globale Variableinsn_va, gv_name
found_struct_offsetReferenz auf Strukturoffsetoffset, struct_name, member_name

Anwendungsaktionen nach dem Parsen

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

Typische Anwendungsbeispiele

Szenario 1: ntoskrnl.exe ohne PDB

Vorhanden: ntoskrnl.exe 10.0.26100.2000 + vollständige PDB
Ziel: ntoskrnl.exe 10.0.26100.2605 (PDB entfernt)
Bedarf: Neue Adresse von PspSetCreateProcessNotifyRoutine lokalisieren

Schritte:
1. Beide Versionen in IDA laden
2. Exportierte Funktion PsSetCreateProcessNotifyRoutine finden (in beiden Versionen vorhanden)
3. In der alten Version ruft sie PspSetCreateProcessNotifyRoutine auf (mit Symbol)
4. In der neuen Version ruft sie sub_140822108 auf (ohne Symbol)
5. LLM erkennt sofort: sub_140822108 = PspSetCreateProcessNotifyRoutine
6. Massenanwendung

Szenario 2: Migration nach Anwendungsupdate

Vorhanden: Vollständige Reverse-Engineering-Ergebnisse von target.exe v1.0 (200+ Funktionen benannt)
Ziel: target.exe v1.1 (alle Symbole verloren)
Bedarf: Massenmigration von 200 Funktionsnamen

Schritte:
1. Aus der alten Version alle benannten Funktionen (Disassembly+Pseudocode) exportieren
2. In der neuen Version über exportierte Funktionen/Strings die entsprechenden Anker finden
3. Massenhaft LLM-Vergleiche aufrufen
4. YAML parsen, massenhaft umbenennen
5. Iterativ vertiefen

LLM-Auswahlempfehlungen

ModellGeeignet fürKostenGeschwindigkeit
DeepSeek V3Kleine bis mittlere Funktionen (<200 Zeilen), Batch-VerarbeitungSehr niedrigSchnell
GPT-4oSehr große Funktionen, komplexer KontrollflussMittelSchnell
Claude SonnetMittlere bis große Funktionen, die Deduktion erfordernMittelSchnell
Claude OpusExtrem komplexe Funktionen, die tiefes Verständnis erfordernHochLangsam

Empfohlene Strategie: Standardmäßig DeepSeek, bei Überschreitung des Kontextlimits oder ungenauen Ergebnissen automatisch upgraden.

Hinweise

  • Gib nicht die gesamte Binärdatei an das LLM – vergleiche immer nur eine Funktion auf einmal
  • Anker müssen zuverlässig sein – wenn der Anker selbst falsch ist, ist die gesamte weitere Arbeit umsonst
  • Ergebnisse manuell stichprobenartig prüfen – das LLM ist nicht 100% genau, wichtige Symbole müssen verifiziert werden
  • Zwischenergebnisse cachen – vermeide wiederholte Aufrufe, um Tokens zu sparen
  • Kontextlimit beachten – sehr große Funktionen (>1000 Zeilen Disassembly) müssen aufgeteilt oder mit einem Modell mit großem Kontext analysiert werden

Bootstrap bei Bedarf (On-Demand Bootstrap)

Tool-Abhängigkeiten

ToolZweckAutomatisch installierbar
IDA ProDisassembly/Pseudocode exportieren✗ (kommerzielle Software)
PythonSkriptausführung, API-Aufrufe✓
PyYAMLYAML aus LLM-Antwort parsen✓ (pip install pyyaml)
LLM APIVergleich durchführenAPI-Key erforderlich

Erläuterung

Dieses Skill ist nicht auf die Installation schwerer Tools angewiesen. Hauptabhängigkeiten:

  • IDA Pro ist bereits vorhanden (wird mit dem Skill ida-reverse/ verwaltet)
  • Python + requests/httpx (für API-Aufrufe)
  • Ein LLM-API-Endpunkt

Routing-Kontext

Upstream-Eingang: skills/SKILL.md (Hauptsteuerung), routing.md Auslösebedingung: Vorhandensein alter Symbole/Reverse-Engineering-Ergebnisse, die auf eine neue Version migriert werden müssen Downstream-Ausgang:

  • Binärdatei muss zuerst geöffnet werden → ida-reverse/
  • Schnelle Erkundung zur Bestätigung von Versionsunterschieden → radare2/

Gleichgeordnete Module: ida-reverse/ (Datencxport und Symbolanwendung erfolgen über IDA)

Selbstprüfung bei Aufgabenerledigung (MUSS vor der Behauptung der Fertigstellung bestanden werden)

  • Habe ich jeden Schritt des Arbeitsablaufs ausgeführt (und nicht nur gelesen)?
  • Habe ich die tatsächlichen Tool-Pfade basierend auf dem tool-index verwendet?
  • Habe ich reproduzierbare Beweise erzeugt (Befehle/Skripte/Screenshots/Berichte)?
  • Habe ich die von RULES geforderten Checklistenpunkte abgeschlossen und zurückgemeldet?

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.

Verwandte Skills