PECompact v1.34 tutorial, par SyntaxError Votre mission si vous l'acceptez: patcher un exe packé avec PECompact 1.34 ! J'ai packé Notepad pour voir ce qu'il avait dans le ventre... notre but sera de mettre un int 3 (cc) au tout début de Notepad (au program entry point). Première remarque, on peut demarrer le soft avec le Symbol Loader de sofice sans rien changer. Voici l'endroit ou le loader de PEC rend la main au notepad unpacké: 40e352: popad ; 61 40e353: popfd ; 9d 40e354: push eax ; 50 40e355: push 4010cc ; 68cc104000 <- on push le program entry point (PEP) 40e35a: ret 04 ; c20400 <- on jump vers le PEP A priori il suffit de mettre un jmp avant le ret vers notre propre routine de patch. (il faut mettre la routine dans un espace libre de l'exe) ça pourrait ressembler à ça: 40e352: jmp 40e357: ... maroutine: mov eax, 4010cc mov byte ptr [eax], cc popad popfd push eax push 4010cc ret 04 Avec un éditeur hexa, on s'apperçoit que la suite d'octets 619d5068 n'est pas trouvée :( ça veut dire que le loader est ~crypté~ pour nous empecher de faire notre job... La méthode basique précédente qui marcherait avec UPX, Shrinker et d'autres packer pas méchants ne fonctionne pas avec PECompact 1.34... Je vais numeroter les routines pour essayer d'y voir clair... La routine #1 copie la routine #2 en la bidouillant très légèrement et la routine #3 en un seule fois. On obtient la routine #2' et une copie de la #3. La #3 est cryptée dans le fichier. La #2' décrypte la copie de la #3. La copie de la #3 dé-pack Notepad et le lance. Le code ci-dessus en 40e352 appartient à la #3... Petit schema pour représenter le truc: #1 ---COPIE--> #2 && #3 crypté #2' ---DECRYPTE--> #3 #3 ---DEPACK--> Notepad #3 ---Fin du loader (40e35a)-- Ce qu'on trouve dans le fichier: la routine #1, la #2, la #3 cryptée. Bon j'ose esperer avoir été assez clair jusqu'à maintenant :) Le principe pour patcher ça, c'est de faire deux routines de patch: * La première, appelée par #2' après avoir décrypté #3, permet de placer un jmp dans #3 vers la deuxième, la 'vraie'... Autrement dit, la première routine fait un patch en mémoire après le décryptage du loader, pour que la deuxième intervienne juste avant que Notepad soit décompressé. Je sens que c'est incomprehensible :) Passons à la pratique... Patch à effectuer en #2: ----------AVANT---------------------*--------------APRES------------------- 40ae4f: and ecx,3 83e103 40ae4f: call 4113b8 e894320000 40ae52: repz movsb f3a4 40ae54: jmp 40ae6a eb14 40ae54: jmp 40ae6a eb14 ------------------------------------*-------------------------------------- En 4113b8 il y a un assez petit espace libre pour nos routines mais on fait avec ce qu'on a... le call appelle donc notre première routine: (routine 1) 4113b8: and ecx,3 ; il faut recopier les instructions qu'on a bousillé repz movsb ; pour faire de la place au call mov eax,40e352 ; patch dans #3 mov byte ptr [eax], e9 ; pour arriver dans la routine 2 mov dword ptr [eax+1],003076 ; juste à la fin du loader ret (routine 2) 4113cd: mov eax,4010cc ; enfin notre patch ! mov byte ptr [eax],cc ; int 3 popad ; on recopie popfd ; les lignes push eax ; de la toute fin push 4010cc ; du loader ret 04 ; mission accomplie :) L'espace libre pour ces deux routines se trouve à la fin du fichier. Une fois qu'on a compris le principe de ce patch, on peut faire à peu près n'importe quoi malgré les encryptions multiples du loader: Il "suffit" de faire une routine de patch à la fin de chaque décrypteur/dépacker. J'avoue que ça a quand-même des limites pratiques :o) En vous remerciant, SyntaxError [Nx8]---------------------------------------------www.nexus8.org-----------