
Plugin Binary Ninja pour analyser et simplifier le code obfusqué
Auteurs : Tim Blazytko & Nicolò Altamura
Analyser et simplifier du code obfusqué
Obfuscation Analysis est un plugin Binary Ninja qui simplifie le travail sur des binaires fortement protégés. Il regroupe une poignée d'assistants ciblés qui vous permettent de
Quelques cas d'usage sont disponibles dans examples. De plus, la conférence REcon « Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications » présente quelques cas d'usage. Les diapositives sont disponibles ici. Le plugin complète Obfuscation Detection : une fois les fonctions suspectes signalées, Obfuscation Analysis vous aide à les nettoyer et à les comprendre. D'autres assistants seront ajoutés au fil du temps.
L'outil peut être installé via le gestionnaire de plugins de Binary Ninja.
Pour une installation manuelle, suivez ces étapes dans le dossier des plugins de Binary Ninja :
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
Si vous utilisez un environnement virtuel, vous devrez définir manuellement le chemin site-packages dans les paramètres de Binary Ninja.
Le plugin est disponible depuis le menu de la barre supérieure de Binary Ninja sous Plugins -> Obfuscation Analysis.
Pour simplifier l'obfuscation arithmétique, surlignez d'abord l'expression HLIL que vous souhaitez simplifier dans la vue décompilateur. Ensuite, choisissez Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify. Le plugin résout le calcul complet, le fait passer par msynth et insère le résultat simplifié sous forme de commentaire sur la même ligne. La courte animation ci-dessous montre l'intégralité du flux de travail :
La simplification MBA repose sur msynth. Par défaut, le plugin utilise l'oracle de simplification par défaut de msynth, qui est fourni avec le plugin et préconfiguré. Si vous souhaitez utiliser un oracle plus grand ou personnalisé, définissez obfuscation_analysis.mba_oracle_path manuellement ou naviguez jusqu'au fichier dans la fenêtre Settings de Binary Ninja.
En cas de problème, le plugin écrit un message concis au niveau utilisateur dans le volet Log ; basculez la vue du journal sur Debug pour voir la trace complète.
Le plugin fournit des assistants ciblés qui répondent aux obstacles courants rencontrés lors du reverse engineering de binaires protégés, chacun pouvant être exécuté en tâche de fond depuis l'interface ou via des scripts head-less. Voici les fonctionnalités actuellement disponibles.
Les Fonctions corrompues sont des fonctions dont le désassemblage présente des artefacts indéfinis — blocs de base vides, instructions invalides ou chevauchantes, et similaires. Cet assistant parcourt l'intégralité du BinaryView, signale les fonctions présentant ces symptômes et les liste afin que l'analyste puisse inspecter rapidement du code mal analysé ou délibérément obfusqué. Une action de suppression optionnelle efface chaque fonction signalée et force une nouvelle analyse, nettoyant ainsi la liste des fonctions. C'est particulièrement utile pour localiser
L'Arithmétique Mixte-Booléenne (MBA) est une technique d'obfuscation qui enfouit des calculs simples dans de longues chaînes d'opérations arithmétiques et booléennes. Cette fonctionnalité simplifie de telles expressions dans le décompilateur. Lorsque vous sélectionnez une instruction HLIL, le plugin collecte sa chaîne de calcul complète avec une tranche arrière SSA restreinte au bloc de base courant, traduit cette tranche en IR Miasm, l'injecte dans msynth et ajoute enfin le résultat simplifié sous forme de commentaire dans la vue décompilateur. Cette fonctionnalité vous permet de
Pour la fonction actuellement sélectionnée, cet assistant inline récursivement chaque fonction appelée dans la vue décompilateur, donnant à Binary Ninja un IL unique et autonome. Une fois toutes les frontières supprimées, le décompilateur peut propager les données à travers les fonctions, permettant un pliage de constantes plus profond, l'élimination de code mort et une logique généralement plus claire. Utilisez-le pour
Notez que le HLIL peut devenir très volumineux et lent à afficher sur de très grandes fonctions ou des arbres d'appels profonds. De plus, certaines optimisations du décompilateur peuvent être moins efficaces une fois que tout est fusionné en une seule unité. Pour contrôler cela, vous pouvez limiter la profondeur d'inlining : définissez Settings -> Obfuscation Analysis -> Max Function Inlining Depth à une borne supérieure N (par défaut fixée à 1). Avec une limite de profondeur, seuls les N premiers niveaux d'appels sont inlinés ; les appels plus profonds ne le sont pas.
Le plugin présente quelques mises en garde dont vous devez être conscient, la plupart liées au pipeline de simplification MBA :
Bug de Binary Ninja : sur BN 5.0 stable, l'étape de tranche arrière peut échouer à cause de casts de types HLIL manquants : https://github.com/Vector35/binaryninja-api/issues/6371 ; le problème est corrigé dans 5.1.7477-de et versions ultérieures
tranche confinée à un seul bloc de base : les définitions de variables situées dans les blocs prédécesseurs sont ignorées (souvent dépendantes du flux de contrôle), donc certains termes MBA peuvent rester partiellement résolus
lacunes de traduction HLIL vers IR Miasm : toutes les constructions HLIL n'ont pas d'équivalent Miasm valide ; lorsque la traduction échoue, l'expression est ignorée et une erreur est journalisée
couverture IL : les nœuds de flux de contrôle et les opérations en virgule flottante ne sont actuellement pas traduits
contraintes msynth héritées : la simplification MBA hérite de toutes les limitations de msynth
Pour plus d'informations, contactez Tim Blazytko (@mr_phrazer) ou Nicolò Altamura (@nicolodev).