
Plugin Binary Ninja pour identifier le code obfusqué et d'autres constructions de code intéressantes.
Auteur : Tim Blazytko
Détecte automatiquement le code obfusqué et d'autres constructions de code intéressantes
Obfuscation Detection est un plugin Binary Ninja pour détecter le code obfusqué et les constructions de code intéressantes (par exemple, les machines à états) dans les binaires. Étant donné un binaire, le plugin facilite l'analyse en identifiant les emplacements de code qui pourraient mériter un examen plus approfondi lors du rétro-ingénierie.
Basé sur diverses heuristiques, le plugin repère les fonctions qui contiennent des constructions de code complexes ou inhabituelles. Ces constructions de code peuvent implémenter :
Les articles de blog suivants fournissent plus d'informations sur les heuristiques sous-jacentes et montrent leurs cas d'utilisation :
Quelques exemples d'utilisation se trouvent dans examples. De plus, la conférence REcon "Unveiling Secrets in Binaries using Code Detection Strategies" montre quelques cas d'utilisation. Les diapositives sont disponibles ici ; l'enregistrement est disponible ici.
L'outil peut être installé via le gestionnaire de plugins de Binary Ninja.
Pour la version sans tête, suivez ces étapes :
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# installer obfuscation_detection
pip install .
Le plugin peut être utilisé dans l'interface utilisateur et en mode sans tête.
Choisissez Plugins -> Obfuscation Detection pour exécuter des heuristiques individuelles, ou Plugins -> Obfuscation Detection -> Utils pour exécuter des détections d'utilitaires individuelles. La commande Plugins -> Obfuscation Detection -> All exécute toutes les heuristiques et tous les utilitaires ensemble.
Les résultats sont affichés dans la fenêtre de journal :
En cliquant sur les adresses de fonction identifiées, Binary Ninja navigue vers la fonction sélectionnée.
Pour utiliser le plugin en mode sans tête, exécutez scripts/detect_obfuscation.py :
$ python3 scripts/detect_obfuscation.py <binaire>
Ceci exécute toutes les heuristiques et tous les utilitaires. Pour une sortie lisible par machine, passez --json :
$ python3 scripts/detect_obfuscation.py --json <binaire>
Le payload JSON contient tous les résultats sous la clé detections. Chaque détection possède un id stable pour l'automatisation et un name lisible par l'humain. Chaque résultat de fonction étiquetée inclut le type d'étiquette et la description utilisés par le plugin Binary Ninja.
Pour exécuter uniquement l'heuristique de machine à état en mode sans tête, utilisez scripts/detect_state_machine.py :
$ python3 scripts/detect_state_machine.py [--json] <binaire>
Le plugin implémente diverses heuristiques de détection pour détecter différentes constructions de code. Dans ce qui suit, nous décrivons brièvement chaque heuristique et expliquons son utilisation.
L'heuristique du bloc de base volumineux identifie les 10 % supérieurs des fonctions ayant le plus grand nombre moyen d'instructions par bloc de base. Elle permet de détecter :
L'heuristique de fonction complexe identifie les 10 % supérieurs des fonctions ayant les graphes de flux de contrôle les plus complexes (basés sur la complexité cyclomatique). Elle permet d'identifier :
L'heuristique de machine à état utilise des propriétés de théorie des graphes pour identifier les fonctions implémentant des machines à états. Généralement, ces machines à états peuvent être représentées comme des instructions switch dispatchées dans une boucle. L'heuristique permet d'identifier :
L'heuristique de séquence d'instructions inhabituelle effectue une analyse statistique pour identifier les 10 % supérieurs des fonctions dont les motifs de code s'écartent d'une vérité de terrain précalculée. Ainsi, l'heuristique permet d'identifier :
L'heuristique d'instruction chevauchante identifie les fonctions avec des instructions désalignées (les octets d'instruction sont partagés par deux instructions différentes). L'heuristique identifie :
Si l'heuristique est utilisée dans l'interface utilisateur de Binary Ninja, les instructions chevauchantes sont également mises en évidence dans la vue graphique.
L'heuristique de la fonction la plus appelée identifie les 10 % supérieurs des fonctions ayant le plus grand nombre d'appels provenant de différentes fonctions. Ainsi, l'heuristique peut identifier :
L'heuristique identifie les fonctions avec un nombre élevé de boucles. Ces types de fonctions peuvent implémenter :
L'heuristique aide également à cibler les goulots d'étranglement potentiels de performance.