Mixed Boolean Arithmetic (MBA)
Des opérations simples sont remplacées par des mélanges sémantiquement équivalents d'opérateurs arithmétiques et booléens, déjouant la reconnaissance de motifs et la simplification du décompilateur tout en préservant le résultat.
L'obfuscation par Mixed Boolean Arithmetic (MBA) réécrit une opération simple sous
la forme d'une expression équivalente qui mélange opérateurs arithmétiques (+,
-, *) et bit à bit (^, &, |, ~). Les deux formes calculent la même
valeur pour toutes les entrées, mais la forme obfusquée est volumineuse, peu
familière et hors des règles de réécriture que connaissent les décompilateurs et
les moteurs de reconnaissance de motifs — l'intention d'origine est ainsi cachée à
la vue de tous.
Fonctionnement
La technique repose sur des identités vraies sur les entiers machine. Une addition ou un XOR peut être développé en un enchevêtrement de termes booléens et arithmétiques ; imbriquer ces identités produit des expressions arbitrairement complexes mais qui préservent la valeur.
// before
z = x + y;
w = x ^ y;
// after (semantically identical for all x, y)
z = (x ^ y) + 2 * (x & y);
w = (x | y) - (x & y);
// nested deeper, a single XOR can become:
w = ((x | y) - (x & y)) + ((~x & y) - (x & ~y)) - ((~x & y) - (x & ~y));Détection & contournement
- Statique — Dans IDA/Ghidra, une ligne de source triviale se décompile en une
longue chaîne de
and/or/xor/not/add/subsans objectif apparent, réutilisant souvent les deux mêmes variables. Une MBA linéaire apparaît comme une somme pondérée de termes bit à bit sur un petit ensemble d'entrées — cette forme est la signature. - Dynamique — Traitez l'expression comme une fonction boîte noire de ses entrées et récupérez-la par synthèse de programme ou recherche guidée par oracle (msynth, l'approche de type gooMBA), ou échantillonnez des couples entrée/sortie pour ajuster une combinaison linéaire plus simple.
- Patch / simplification — Prouvez l'équivalence entre l'expression obfusquée et une forme simple candidate par bit-blasting et un solveur SMT (Z3), puis substituez la forme simple dans la décompilation. Des simplifieurs spécialisés traitent directement le cas linéaire courant.
- Outils — SiMBA et MBA-Blast pour les MBA linéaires, GAMBA pour les cas non linéaires, Arybo et msynth pour la manipulation/synthèse symbolique, et Z3 pour vérifier l'équivalence avant de patcher.