Comment ecrire un script pour Procdump ? Cible : Aspack 1.08.04 Disponibilité : http://www.entechtaiwan.com/aspack.htm Tools : ProcDump32 1.5 Softice 4.0 Tiens, Alexey Solodovnikov, l'auteur D'Aspack, a sorti une nouvelle version de sa merde . Franchement, le taux de compression est encore loin de celui d'UPx... Le shéma de décompression est légèrement différent de la version 1.08.03 . Le but du jeu est d'écrire un script pour automatiser la décompression avec Procdump 1.5 car on va surement voir dans quelques temps, plein de sharewares compressés avec ce truc . D'ou l'intéret du script... Step 1 Bon, alors au début j'ai pensé que l'exe de Aspack 1.08.04 avait été compressé avec ce dernier mais pas de pot , l'auteur a rajouté un truc par dessus (polymorphe code) . Et comme j'ai pas trouvé de proggy compressé avec la version 1.08.04, j'ai pris le notepad.exe de mon windaube et je l'ai compressé avec Aspack... Avant de compresser le notepad, notez le point d'entré original : 4010CC . On prend Symbol loader et on ouvre le notepad.exe compressé . Manque de chance, softice ne nous donne pas la main : le notepad se lance directement . Pas de panique, c'est juste les flags des sections qui ont été changés .. On prend procdump 1.5 et on va dans 'PE Editor' . On ouvre notre notepad et on clique sur 'Sections' . On fait un click droit sur la section '.text' et on choisit 'Edit Section' . Procdump vous indique comme 'Section Characteristics : C0000040 ' Remplacez donc le C0000040 par E0000020 . Reprenez Symbol Loader et ouvrez votre notepad.exe . Ce coup-ci, Softice prend bien la main.... Step 2 On commence par tracer le proggy avec la touche F10 . Rapidement , on arrive à ceci : 015F:0040E0F4 PUSH 00 -------- = 6A,00 en hexa 015F:0040E0F6 PUSH EAX-------- = 50 en hexa 015F:0040E0F7 CALL [EBP+00442949] 015F:0040E0FD LEA EAX,[EBP+00442C1D] 015F:0040E103 PUSH EAX 015F:0040E104 RET On est au début de la routine de décompression : on a toujours pas le point d'entré de notre proggy décompressé . Par contre on note la correspondance hexa des addresses 40E0F4 et 40E0F6 car ça va vous servir pour notre script . On continue la trace du proggy avec la touche F10 .ATTENTION! La trace pour arriver à la fin de la routine de décompression est longue ! Par contre cette trace est similaire à la version 1.08.03 : les breakpoints sont identiques ! Donc en traçant comme des malades (héhéhé) on arrive à ceci : 015F:0040E5AB MOV EAX,[EBP+00442A31] 015F:0040E5B1 PUSH EAX -------------------- = 50 en hexa 015F:0040E5B2 ADD EAX,[EBP+004430A8] ----- = 03,85,+addresse en hexa 015F:0040E5B8 POP EBX 015F:0040E5B9 OR EBX,EBX 015F:0040E5BB MOV [EBP+00442EE1],EAX 015F:0040E5C1 POPAD 015F:0040E5C2 JNZ 0040E5CC 015F:0040E5C4 MOV EAX,00000001 015F:0040E5C9 RET 000C 015F:0040E5CC PUSH 004010CC--------------- le point d'entré original 015F:0040E5D1 RET------------------------------ La dernière instuction de décompression. Bon, si vous ne comprenez pas comment je suis arrivé là, lisez mon tutor sur Transparence99 (dans DRaPeauNoiR 3 ou sur le site officiel de Procdump) : c'est EXAXTEMENT la même démarche ... Donc on arrive à l'addresse 40E5CC et on voit un joli PUSH 004010CC . Ca ne vous rappelle rien cette valeur ? Effectivement , c'est votre point d'entré du notepad décompressé . Si vous exécutez le ret de l'addresse 40E5D1, vous allez vous retrouvez au début du code du notepad, en 4010CC . On en déduit aisément que ce ret est la dernière instruction du proggy. On note au passage les correspondances Hexa des addresses 40E5B1 et 40E5B2 pour les besoins de notre script . Pour l'addresse 40E5B2, on note que les octets du début de l'instruction (03,85) car le 4430A8 sera forcément différent pour un autre proggy que le notepad . Normal, vu que cette addresse ne sera pas la même pour un autre progg . Donc on aura une autre addresse à la place du 4430A8 et donc une correspondance hexa différente ... Step 3 On va passer à l'écriture du script ,histoire d'automatiser tout ça avec Procdump.Déjà quelques notions sur les commandes utilisées : La commande LOOK : c'est avec cette commande que procdump repère la signature du crypteur ou du du compresseur .En entrant cette commande suivit d'une chaine hexadécimale, procdump va regarder dans l'exe si il trouve cette chaine.Si c'est le cas, cela veut dire que c'est le bon script .Dans le cas contraire,ce n'est le bon sript pour ce compresseur ou ce crypteur La commande BP : avec cette commande,vous mettez un breakpoint (même principe que Softice) sur l'addresse memoire actuelle .Cette commande est précédée de LOOK .Vous allez comprendre dans deux minutes. La commande STEP : c'est avec cette commande que vous allez terminer votre script .STEP commence un analyse pas à pas du code, ce qui explique parfois la lenteur du dump. La commande WALK : cette commande permet d'exécuter une instruction (dans le proggy que l'on veut dumper). La commande ADD : additionne une valeur à l'addresse courante La commande EIP : EIP récupère la prochaine addresse du proggy comme étant le point d'entrée original du programme : TRES pratique !... Le script pour Procdump n'est pas très compliqué à faire . On avez relevez une première chaîne hexa dans le premier désassemblage (Step 1) .C'est cette chaîne que l'on va faire chercher à procdump . On va mettre aussi un breakpoint à l'addresse courante de la chaîne hexa trouvée . Le début du script est donc : L1=LOOK 6A,00,50 ------- la châine hexa que l'on cherche L2=BP ------------------- on met un breakpoint Ensuite, on avez trouvé que la fin de la routine de décompression se situait en 40E5D1 . J'ai choisit de cherchez comme deuxième chaine hexa : 50,03,85 (step 2) . Comme vous le remarquez , cette chaine hexa correspond à l'addresse 40E5B1 qui n'est donc pas la dernière instruction du proggy . Pour me retrouver à l'addresse 40E5D1 , il faut rajouter 20 (en hexa) . Pour faire ça , j'ai utilisé la commande ADD . La suite du script est alors : L3=LOOK 50,03,85 --------- cherche la chaine hexa 50,03,85 L4=ADD 20 ---------------- additionne 20h à l'addresse courante L5=BP -------------------- met un breakpoint à l'addresse courante Bon , on a pratiquement tout ! Il ne nous reste plus qu'a récupérer le point d'entré original .La commande EIP fait cela très bien ! Seulement il ne faut pas la mettre tout de suite : nous sommes à l'addresse 40E5D1 et non pas au début du proggy décompressé . Il faut exécuter le RET de l'addresse 40E5D1 pour se retrouver en 4010CC, correspondant à la première instruction du proggy décompressé . La commande WALK va nous permettre de faire cela . Notre script est alors : L6=WALK --------- execécute une instruction (le RET en l'occurence) L7=EIP ---------- récupère la prochaine addresse comme étant le point d'entré original L8=STEP---------- commence l'analyse pas à pas Voilà ! vous avez votre script presque complet ! Il ne nous reste plus qu'a mettre les options que l'on veut mettre par défaut . Le script final est donc : -------------------------------------------- coupez ici---------------------------------------- P1D=Aspack108.4 ----------- on donne un No et un nom au script [Aspack108.4] L1=LOOK 6A,00,50 L2=BP L3=LOOK 50,03,85 L4=ADD 20 L5=BP L6=WALK L7=EIP L8=STEP OPTL1=00000000 OPTL2=01000001 OPTL3=01010001 OPTL4=00030000 OPTL5=00000000 -------------------------------------------- coupez ici---------------------------------------- Vous pouvez tester ce script sur plusieurs proggyz compressés avec Aspack 1.08.04 : ça marche sans problème ! @+++++++++++ TaMaMBoLo