Skip to content
Obfuscationintermediate

Dead Code & Junk Insertion

Des séquences d'instructions sans effet et des octets de remplissage désalignés sont insérés pour gonfler le code et désynchroniser les désassembleurs en balayage linéaire, masquant le vrai flux d'instructions.

L'insertion de code mort et de junk garnit une fonction d'instructions sans effet sur son résultat, et parsème le flux d'octets de remplissage désalignés — typiquement juste après un saut inconditionnel, là où les octets ne sont jamais exécutés mais où un désassembleur en balayage linéaire tentera quand même de les décoder. Le but est de gonfler le binaire et de casser le désassemblage naïf afin d'enfouir la vraie logique.

Fonctionnement

Le code mort est sémantiquement inerte : arithmétique qui s'annule, écritures dans des registres morts, ou équivalents de nop. L'astuce anti-désassemblage place un jmp au-dessus d'un octet qui est le début d'une instruction multi-octets ; un balayage linéaire le décode à tort et se désynchronise des vraies instructions qui suivent.

asm
    xor  eax, eax        ; junk: dead store, eax overwritten below
    add  eax, ebx
    sub  eax, ebx        ; junk: net effect zero
    jmp  short real      ; unconditional jump...
    db   0xE8            ; ...over a junk byte that starts a fake CALL
real:
    mov  [rdi], rcx      ; the real instruction (a linear sweep desyncs here)

Détection & contournement

  • Statique — Dans IDA/Ghidra, les régions de junk apparaissent comme des suites d'arithmétique manifestement inutile (paires add/sub, xor reg,reg avant une réécriture inconditionnelle), des octets inatteignables marqués comme données, ou des marqueurs rouges « instruction invalide » là où le balayage s'est désynchronisé après un jmp. Basculez la vue en récursif-descendant et l'octet factice se dissipe.
  • Dynamique — Émulez la fonction (Unicorn/Qiling) pour que seul le chemin vivant s'exécute ; la trace montre la vraie séquence d'instructions et ignore entièrement l'octet de junk. Comparer le listing statique à la trace exécutée pointe le garbage inséré.
  • Patch / simplification — Forcez le décodage à la bonne frontière (annulez les octets, recréez le code), puis appliquez une élimination peephole des dead-stores et des annulations pour supprimer les instructions inertes et ne garder que le chemin vivant.
  • Outils — Désassemblage récursif-descendant d'IDA/Ghidra, Unicorn et Qiling pour l'émulation, Capstone pour le décodage personnalisé, et des scripts de simplification peephole.
Votes

Commentaires(0)