Ghidra

Suite de rétro-ingénierie open-source de la NSA. Décompile et désassemble des binaires x86, ARM, MIPS et plus, avec une API de scripting puissante. NSA's open-source reverse engineering suite. Decompiles and disassembles binaries for x86, ARM, MIPS, and more with a powerful scripting API.

↗ https://ghidra-sre.org

Overview

Ghidra is a full-featured software reverse engineering (SRE) framework developed by the NSA. It provides disassembly, decompilation (to C-like pseudo-code), data-flow analysis, symbol resolution, and an extensible scripting API in Java and Python. It rivals IDA Pro for binary analysis.

Getting Started

Launch GUI

ghidra

Headless mode (automated analysis)

/opt/ghidra/support/analyzeHeadless /tmp/project MyProject \
  -import /path/to/binary \
  -postScript PrintFunctionNames.java \
  -deleteProject

Key Workflow

  1. File → New Project → Non-Shared Project → name it
  2. File → Import File → select binary
  3. Double-click the imported file → select analysis options → click Analyze
  4. Decompiler window shows C-like pseudo-code for the selected function
  5. Symbol Tree panel lists functions, imports, exports, labels

Key Keyboard Shortcuts

ActionShortcut
Go to address/functionG
Search for stringsSearch → For Strings
Rename variable/functionL
Add comment;
Cross-references (xrefs)Ctrl+Shift+F
References to addressCtrl+G
Search memoryS
Patch bytesRight-click → Patch Instruction
Open decompilerCtrl+E (window)

Finding Interesting Code

# In Ghidra, use:
Search → For Strings           # Find hardcoded strings
Search → For Direct References # Find code using a string/value
Window → Defined Strings       # All strings in binary
Window → Functions             # All identified functions
Window → Symbol References     # Cross-reference analysis

Scripting (Python via Jython)

# Script Manager → New Script (Python)
# Example: List all functions
from ghidra.program.model.listing import FunctionManager

fm = currentProgram.getFunctionManager()
for func in fm.getFunctions(True):
    print(func.getName(), hex(func.getEntryPoint().getOffset()))

Headless Scripting

Run a script against a binary without GUI

/opt/ghidra/support/analyzeHeadless /tmp/ghidra_proj ProjectName \
  -import /path/to/binary \
  -postScript /path/to/script.py \
  -scriptlog /tmp/ghidra_log.txt

rz-ghidra (Rizin Integration)

Use Ghidra’s decompiler from within Rizin/Cutter Install rz-ghidra plugin, then in rizin:

pdg     # Decompile current function with Ghidra engine

Tips

  • Rename functions and variables as you understand them — Ghidra tracks it all in the project
  • Use Function Call Graph (Window menu) to visualize call relationships
  • The Data Type Manager lets you import type libraries (.gdt files) for Windows API resolution
  • Bookmarks (Ctrl+D) are useful for marking important locations during analysis
Analysis options reference
Key analysis passes (run during initial analysis):
- Disassembly       Convert bytes to instructions
- Function Start    Identify function entry points
- Decompiler        Generate C-like pseudo-code
- Reference         Find cross-references
- Data Reference    Track data access
- Stack             Analyze stack frames
- DWARF             Parse debug info if present
- PDB               Parse PDB symbols (Windows)
- Scalar Operands   Identify constants/addresses

Vue d’ensemble

Ghidra est un framework complet de rétro-ingénierie logicielle (SRE) développé par la NSA. Il fournit désassemblage, décompilation (vers un pseudo-code proche du C), analyse de flux de données, résolution de symboles, et une API de scripting extensible en Java et Python. Il rivalise avec IDA Pro pour l’analyse de binaires.

Prise en main

# Lancer le GUI
ghidra

# Mode headless (analyse automatisée)
/opt/ghidra/support/analyzeHeadless /tmp/project MyProject \
  -import /path/to/binary \
  -postScript PrintFunctionNames.java \
  -deleteProject

Workflow clé

  1. File → New Project → Non-Shared Project → lui donner un nom
  2. File → Import File → sélectionner le binaire
  3. Double-cliquer sur le fichier importé → sélectionner les options d’analyse → cliquer sur Analyze
  4. La fenêtre Decompiler affiche le pseudo-code de type C pour la fonction sélectionnée
  5. Le panneau Symbol Tree liste les fonctions, imports, exports, labels

Raccourcis clavier clés

ActionRaccourci
Aller à une adresse/fonctionG
Rechercher des chaînesSearch → For Strings
Renommer variable/fonctionL
Ajouter un commentaire;
Références croisées (xrefs)Ctrl+Shift+F
Références vers une adresseCtrl+G
Rechercher en mémoireS
Patcher des octetsClic droit → Patch Instruction
Ouvrir le décompilateurCtrl+E (fenêtre)

Trouver du code intéressant

# Dans Ghidra, utiliser :
Search → For Strings           # Trouver les chaînes codées en dur
Search → For Direct References # Trouver le code utilisant une chaîne/valeur
Window → Defined Strings       # Toutes les chaînes du binaire
Window → Functions             # Toutes les fonctions identifiées
Window → Symbol References     # Analyse des références croisées

Scripting (Python via Jython)

# Script Manager → New Script (Python)
# Exemple : lister toutes les fonctions
from ghidra.program.model.listing import FunctionManager

fm = currentProgram.getFunctionManager()
for func in fm.getFunctions(True):
    print(func.getName(), hex(func.getEntryPoint().getOffset()))

Scripting headless

Lancer un script contre un binaire sans GUI

/opt/ghidra/support/analyzeHeadless /tmp/ghidra_proj ProjectName \
  -import /path/to/binary \
  -postScript /path/to/script.py \
  -scriptlog /tmp/ghidra_log.txt

rz-ghidra (intégration Rizin)

Utiliser le décompilateur de Ghidra depuis Rizin/Cutter. Installer le plugin rz-ghidra, puis dans rizin :

pdg     # Décompiler la fonction courante avec le moteur Ghidra

Conseils

  • Renommer les fonctions et variables au fur et à mesure de la compréhension : Ghidra conserve tout dans le projet
  • Utiliser le Function Call Graph (menu Window) pour visualiser les relations d’appel
  • Le Data Type Manager permet d’importer des bibliothèques de types (fichiers .gdt) pour la résolution de l’API Windows
  • Les Bookmarks (Ctrl+D) sont utiles pour marquer des emplacements importants pendant l’analyse
Analysis options reference
Key analysis passes (run during initial analysis):
- Disassembly       Convert bytes to instructions
- Function Start    Identify function entry points
- Decompiler        Generate C-like pseudo-code
- Reference         Find cross-references
- Data Reference    Track data access
- Stack             Analyze stack frames
- DWARF             Parse debug info if present
- PDB               Parse PDB symbols (Windows)
- Scalar Operands   Identify constants/addresses