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.
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,regavant 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 unjmp. 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.