Le reverse engineering de logiciels (RE) consiste à analyser un programme compilé pour comprendre son fonctionnement sans avoir accès au code source. C’est une compétence indispensable pour analyser des malwares, comprendre des protocoles propriétaires, ou trouver des vulnérabilités dans des binaires fermés. Ghidra, développé par la NSA, est aujourd’hui l’outil open source de référence.

Installation et configuration de Ghidra

# Télécharger depuis ghidra-sre.org
unzip ghidra_11.x.x_PUBLIC.zip
cd ghidra_11.x.x_PUBLIC
./ghidraRun   # Linux/macOS

# Prérequis : Java 17+
sudo apt install openjdk-17-jdk

# Extensions utiles
# Emu (émulateur intégré), GhidraNinja, kaiju (vulnerability finding)

Workflow d’analyse

1. New Project → Create non-shared project
2. Import File → glisser le binaire (PE, ELF, Mach-O auto-détecté)
3. Double-clic → Analyze (accepter les analyzers par défaut)
   → CodeBrowser s'ouvre avec :
      - Symbol Tree (fonctions, labels, namespaces)
      - Listing (désassemblage)
      - Decompiler (pseudo-code C)
      - Function Graph (graphe de flux de contrôle)

4. Navigation :
   - G : aller à une adresse
   - L : renommer une variable/fonction
   - T : re-typer une variable
   - ; : ajouter un commentaire
   - Ctrl+Shift+E : chercher des références à un symbole

Identifier les fonctions importantes

Chercher dans Symbol Tree :
  - main, WinMain, DllMain → points d'entrée
  - sub_XXXXXX → fonctions non nommées à analyser

Fonctions API Windows clés à traquer :
  CreateFile / WriteFile / ReadFile     → accès fichiers
  RegOpenKeyEx / RegSetValueEx          → accès registre
  WSAConnect / connect / send / recv    → réseau
  CreateThread / CreateRemoteThread     → threads / injection
  VirtualAlloc / VirtualAllocEx         → allocation mémoire
  CryptEncrypt / BCryptEncrypt          → chiffrement
  ShellExecuteEx / CreateProcess        → exécution de processus

Comprendre le code désassemblé

; Exemple : fonction de déchiffrement XOR
; Ghidra Listing :
0040101a PUSH EBP
0040101b MOV  EBP, ESP
0040101d PUSH EDI
0040101e PUSH ESI
0040101f MOV  EDI, dword ptr [EBP + 8]   ; buffer chiffré
00401022 MOV  ESI, dword ptr [EBP + 0xc] ; longueur
00401025 XOR  ECX, ECX                    ; compteur i=0
LOOP:
00401027 MOV  AL, byte ptr [EDI + ECX]
0040102a XOR  AL, 0x41                    ; clé XOR = 'A'
0040102c MOV  byte ptr [EDI + ECX], AL
0040102f INC  ECX
00401030 CMP  ECX, ESI
00401033 JL   LOOP                        ; boucle
; → Déchiffrement XOR avec clé 0x41

Patcher un binaire

Exemple : bypass de vérification de licence

Code original (désassemblé) :
  TEST EAX, EAX        ; vérifier si la licence est valide
  JNZ  0x00401050     ; si non-zero (valide) → continuer
  JMP  ERROR_HANDLER  ; sinon → erreur

Patch :
  1. Clic droit sur JNZ → Patch Instruction → remplacer par JMP
  2. ou : NOP (0x90) les instructions de vérification
  3. File → Export Program → Original File (avec patches)

Scripting Ghidra avec Python/Java

# Script Ghidra Python (Window → Script Manager → New)
# Trouver toutes les fonctions appelant CreateFile

from ghidra.program.model.symbol import RefType

createfile = getSymbol("CreateFile", None)
if createfile:
    for ref in createfile.getReferences():
        if ref.getReferenceType() == RefType.UNCONDITIONAL_CALL:
            func = getFunctionContaining(ref.getFromAddress())
            print(f"[+] Appel CreateFile dans : {func.getName()} @ {ref.getFromAddress()}")
Points clés :

  • Ghidra décompile le code machine en pseudo-C lisible, accélérant considérablement l’analyse
  • Renommer variables et fonctions est essentiel pour maintenir la compréhension
  • Les imports de DLL révèlent immédiatement les capacités d’un binaire
  • Le scripting Python permet d’automatiser la recherche de patterns dans les binaires
SEE ALL Add a note
YOU
Add your Comment