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()}")
- 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
📚 Formation : Cybersécurité avancée : exploitation et red team

-
Add a note