Entry-Point Obfuscation (Stolen Bytes)
Le packer copie les premières instructions du point d'entrée d'origine dans une mémoire de stub allouée dynamiquement et redirige l'EP, si bien qu'un dump naïf manque de ces octets et que le véritable OEP reste caché jusqu'à leur récupération.
Les « stolen bytes » (octets volés) sont une astuce anti-dump qui scinde le point d'entrée d'origine. Au lieu de décompacter le programme et de sauter proprement vers son véritable OEP, le packer copie les premières instructions de l'OEP dans un tampon fraîchement alloué, les y exécute, et ne saute qu'ensuite dans le corps du code d'origine à OEP+N. Un dump pris après décompactage contient le bon code à partir d'OEP+N, mais un trou là où se trouvaient les premières instructions, et le point d'entrée dans l'en-tête dumpé pointe encore vers le stub du packer, si bien que le binaire reconstruit plante immédiatement au lancement.
Fonctionnement
Le packer prélève les premiers octets à l'OEP, les déplace dans la mémoire du stub et reprend l'exécution au milieu de la fonction :
; --- in the stub's allocated buffer (the "stolen" prologue) ---
stolen:
push ebp ; bytes copied verbatim from the real OEP
mov ebp, esp
sub esp, 0x40
jmp 0x00401016 ; jump back into the original code at OEP + N
; --- on disk at the real OEP these bytes are now zeroed or junk ---
0x00401010: 00 00 00 00 00 00 ; the prologue is gone from the imageLe champ AddressOfEntryPoint de l'en-tête est fixé sur le stub, jamais sur 0x00401010, si bien que même localiser visuellement l'OEP n'a rien d'évident.
Détection & contournement
- Static —
AddressOfEntryPointtombe dans une section inscriptible/à forte entropie plutôt que dans.text. Les octets au début apparent du code sont mis à zéro ou incohérents, et il n'y a aucun prologue de fonction propre à la base de l'image + un décalage plausible. - Dynamic — Trouvez le véritable OEP : run-until-tail-jump, l'astuce ESP (point d'arrêt matériel sur la valeur de pile que le décompacteur restaure) ou l'OEP Finder de Scylla. Lorsque l'exécution atteint le prologue du stub, vous verrez une poignée d'instructions « flottantes » en mémoire allouée se terminant par un
jmpvers.text— la cible de ce saut est OEP+N, et les instructions au-dessus sont les octets volés. - Rebuild — Récupérez le prologue volé depuis le tampon du stub (copiez les octets exacts exécutés avant le saut). Dans le dump, réécrivez ces octets au véritable OEP et fixez
AddressOfEntryPointsur cet OEP pour que le prologue et le corps soient à nouveau contigus. Dumpez ensuite avec Scylla, corrigez l'IAT, et vérifiez que le point d'entrée commence désormais par un vrai prologue. - Tools — x64dbg (tracing, points d'arrêt matériels, OEP Finder de Scylla), Scylla (dump + correction de l'EP) et reconstruction manuelle dans PE-bear pour patcher les octets volés et le point d'entrée.