
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.
L'heuristique identifie les fonctions avec des structures de boucles rares et complexes qui suggèrent généralement :
gotoL'heuristique identifie les fonctions qui effectuent une opération XOR avec une constante à l'intérieur d'une boucle. Ainsi, l'heuristique peut identifier :
L'heuristique identifie les fonctions dans lesquelles les expressions ont plus d'une opération arithmétique et une opération booléenne simultanément. Ainsi, l'heuristique peut identifier :
L'heuristique utilise une approche de hachage de contexte itératif pour détecter des structures multi-blocs répétées dans le graphe de flux de contrôle de chaque fonction. En comparant la signature opcode de chaque bloc ainsi que les signatures de ses successeurs, l'heuristique identifie les sous-graphes dupliqués ou presque dupliqués dans une seule fonction. Cela aide à repérer :
Le plugin inclut également des utilitaires plus ciblés pour des fonctions et régions de code intéressantes. Ils restent disponibles sous le sous-menu Utils ; la commande All les exécute avec les heuristiques plus larges.
Cet utilitaire identifie les fonctions sans appelants connus. Ces fonctions peuvent être :
Cet utilitaire identifie les fonctions qui n'appellent pas d'autres fonctions. Ces types de fonctions peuvent, par exemple, être des fonctions qui :
Cet utilitaire identifie les fonctions récursives — des fonctions qui s'appellent elles-mêmes directement ou indirectement. Les fonctions récursives peuvent indiquer :
Cet utilitaire évalue l'entropie de chaque section. L'entropie est une mesure statistique de l'aléatoire avec des valeurs comprises entre 0 et 8. Les sections avec une entropie proche de 8 indiquent un degré élevé d'aléatoire et peuvent suggérer :
Cet utilitaire détecte les implémentations potentielles de l'algorithme RC4 en utilisant des marqueurs heuristiques typiquement associés à l'algorithme de planification des clés (KSA) et à l'algorithme de génération pseudo-aléatoire (PRGA) de RC4. RC4 est largement utilisé dans les logiciels malveillants à des fins telles que :
Pour plus d'informations, contactez @mr_phrazer.