---
title: Ghidra
description: "Décompiler et annoter un binaire avec Ghidra, en GUI ou en mode headless."
category: reverse
kind: tool
tags: [decompiler, reversing, headless, binary]
level: intermediate
updated: 2026-11-02
order: 2
aliases: ["ghidra headless", "decompilation"]
---

## Workflow GUI

```text
1. New Project → Non-Shared Project
2. File → Import File → sélectionner le binaire
3. Double-cliquer → Analyze (options par défaut)
4. Accepter l'analyse automatique
5. Ouvrir le Decompiler (Ctrl+E)
```

| Raccourci | Action |
| --- | --- |
| `Ctrl+E` | Decompiler |
| `Ctrl+Shift+E` | Listing / désassemblage |
| `G` | Aller à une adresse |
| `Ctrl+Shift+F` | Rechercher |
| `Ctrl+L` | Renommer |
| `Ctrl+Shift+G` | Xrefs |
| `Ctrl+Alt+B` | Breakpoint (debugger) |

## Annoter efficacement

- Renomme `FUN_00401234` en `check_password` dès que tu comprends son rôle.
- Applique des types aux variables (`int`, `char *`, structures) : le decompiler devient lisible.
- Utilise `Edit → Comments` pour garder une trace de l'analyse.
- Les xrefs (`Ctrl+Shift+G`) révèlent qui appelle une fonction critique.
- `Search → For Strings` puis xrefs : le chemin le plus court vers la logique.

## Décompiler

```c
// Exemple typique après renommage
undefined8 check_password(char *input) {
  if (strlen(input) != 12) return 0;
  if (memcmp(input, &DAT_00402010, 12) == 0) return 1;
  return 0;
}
```

> [!TIP]
> Si le pseudo-code est illisible, vérifie l'architecture et le format. Un binaire strippé de 32 bits se lit souvent mieux après avoir défini les calling conventions (`__cdecl`, `__stdcall`).

## Headless

```bash
# Analyse automatique sans GUI
$GHIDRA_HOME/support/analyzeHeadless /tmp/ghidra-project MyProject \
  -import ./binary -postScript decompile.py -scriptPath ./scripts \
  -deleteProject
```

```python
# decompile.py — exporter le pseudo-code de toutes les fonctions
from ghidra.app.decompiler import DecompInterface
from ghidra.util.task import ConsoleTaskMonitor

decompiler = DecompInterface()
decompiler.openProgram(currentProgram)
monitor = ConsoleTaskMonitor()

for function in currentProgram.getFunctionManager().getFunctions(True):
    result = decompiler.decompileFunction(function, 60, monitor)
    if result.decompileCompleted():
        print(f"// {function.getName()}")
        print(result.getDecompiledFunction().getC())
```

## Scripting

```python
# Chercher une chaîne et ses xrefs
from ghidra.program.model.symbol import RefType

target = "Correct password"
listing = currentProgram.getListing()
for data in listing.getDefinedData(True):
    value = data.getValue()
    if value is not None and target in str(value):
        print("string at", data.getAddress())
        for ref in getReferencesTo(data.getAddress()):
            print("  xref from", ref.getFromAddress())
```

## Diff et firmware

```text
File → Version Tracking → Add Session
Ajouter deux versions du binaire, créer des corrélations
Utile pour repérer les correctifs et les backdoors ajoutées
```

```bash
# Firmware : extraire d'abord les composants (binwalk)
binwalk -e firmware.bin
# Puis importer chaque ELF / binaire extrait dans Ghidra
```

> [!WARNING]
> L'analyse automatique peut prendre plusieurs minutes sur un gros binaire et consommer beaucoup de RAM. Pour un firmware, commence par `file`, `strings` et `binwalk` avant de tout charger dans Ghidra.
