Skip to content
Obfuscationintermediate

Instruction Substitution

Une instruction arithmétique ou logique unique est remplacée par une séquence équivalente plus longue : la passe -sub d'OLLVM qui gonfle les expressions et casse la reconnaissance naïve de motifs.

La substitution d'instructions est la passe -sub d'OLLVM : chaque opération arithmétique ou logique simple est réécrite en une séquence d'instructions plus longue qui calcule le même résultat. C'est une obfuscation locale et légère — contrairement à la virtualisation ou à l'aplatissement, elle ne touche pas au flux de contrôle — mais elle gonfle le code et déjoue les moteurs de motifs et les décompilateurs qui attendent la forme canonique à instruction unique.

Fonctionnement

La passe applique des identités algébriques vraies sur les entiers en complément à deux, transformant un opérateur en plusieurs. La soustraction devient une addition d'un opérande nié ; AND/OR sont développés via des réécritures de type De Morgan ; le résultat est correct mais peu familier.

c
// before                 // after (one -sub option each)
a = b - c;                a = b + (~c) + 1;
a = b & c;                a = (b ^ ~0) | (c ^ ~0);   // = ~(~b | ~c) ... negated form
a = b | c;                a = (b & c) + (b ^ c);
a = b ^ c;                a = (b | c) - (b & c);

Détection & contournement

  • Statique — Dans IDA/Ghidra, une ligne unique se développe en 3 à 5 instructions avec de la glu supplémentaire not/neg/add-de-1 autour des vrais opérandes. Le décompilateur affiche b + ~c + 1 au lieu de b - c ; reconnaître ces gabarits de substitution fixes est l'indice clé.
  • Dynamique — Pour une séquence opaque, passez-la en exécution symbolique (Triton) pour obtenir sa fonction de transfert, ou échantillonnez les entrées/sorties pour confirmer l'opération canonique qu'elle implémente.
  • Patch / simplification — Appliquez une simplification peephole/par motifs et une optimisation de type compilateur pour replier la substitution vers l'instruction unique. Sur Hex-Rays, cela se fait au niveau du microcode, où les règles réécrivent b + ~c + 1 en b - c avant la génération du pseudocode.
  • Outils — D-810 pour la simplification du microcode Hex-Rays, la simplification intégrée du décompilateur Ghidra, Triton pour la récupération de la fonction de transfert, et gooMBA pour les substitutions de type MBA.
Votes

Commentaires(0)