• Théorie

    Bonsoir messieurs-dames, aujourd'hui c'est Manual Unpacking au menu...Alors, qu'est ce que c'est que ce terme bizarre (mais qui claque bien quand on le sort dans une conversation ; - ) ???! La manual Unpacking, c'est le fait de unpacker ( = décompresser) un executable manuellement (executable qui a donc été compressé et / ou crypté par un certain unpacker). Le fait de packer un logiciel (le compresser si vous préferez) permet de réduire notablement la taille de celui-çi, il peut aussi permettre de crypter certaines parties du code.
    Dans le cas qui nous interesse, je vais vous expliquer grosso modo comment marche le célèbre Unpacker UPX, comment décompresser manuellement la plupart des logiciels que vous rencontrerez qui seront packé avec UPX, et je vous redirigerais vers la partie Pratique de la section cracking pour étudier la manual Unpacking sur un vrai logiciel (pour ensuite pouvoir le cracker ; - ). Je vous préviens tout de suite, la première lecture de cette partie théorique risque d'être un peu difficile. Mais ne vous inquiétez pas, la partie Pratique vous permettra de comprendre parfaitement toutes les manip à effectuer.

    Principe de fonctionnement de UPX

    Le principe général d'un packer est de rechercher les redondances (codes répétés plusieurs fois) de codes hexadécimaux dans le fichier à compresser et de les remplacer par un code plus "concis" quand l'opération est possible.
    UPX n’a pas un but de protection, mais de compression.Mais vous remarquerez quand même que lorsqu'un programme est packé avec UPX les Strings Data Reference n'apparaissent plus dans Windasm ou Olly, conséquence direct du package... Avouez que c'est embêtant pour cracker un log ; - ) .
    Une fois compressé, le packer doit être invisible pour l'exécutable; c'est-à-dire que le fonctionnement principal du log doit être inchangé. Or le logiciel reste illisible tant qu’il n’a pas été décompressé. En fait quand vous packez un programme avec UPX, celui-ci va intégrer une partie de code appelé le Loader et modifier l'Original Entry Point ( offset ou démarre le code du logiciel) vers ce Loader pour que se soit lui qui se charge en premier lors du lancement du log. Le Loader dispose de la routine de "décryptage" pour décompresser le code du log, une fois la routine terminée le log sera complètement décompressé dans la RAM (mémoire vive) et le logiciel fonctionnera comme auparavant, comme si le package avec UPX n'avait jamais eu lieu. Vous constaterez donc le désavantage principal du package : c'est le temps d'execution du logiciel (augmenté par la routine de décryptage) au détriment de la taille de l'.exe (diminué par la compression).

    Unpacker manuellement un logiciel compressé avec UPX

    Le loader :

    La routine du Loader est facilement repérable dans le cas de UPX : Lé début du loader commence par l'instruction PUSHAD et se termine par l'instruction POPAD. Comme je l'ai déjà dit le packer ne doit pas interférer avec le fonctionnement initial du programme, il est donc obligé de sauvegarder la valeur de tous les registres avant son exécution, et de les restaurer une fois qu’il a fini la décompression. La fonction permettant de sauvegarder tous les registres est PUSHAD (il pousse tous les registres dans la pile) , la fonction permettant de les récupérer est POPAD (restaure tous les registres).
    Concrètement le Loader se présente donc sous cette forme :

    Après l'intruction POPAD il y a toujours un jump vers l'OEP ( Original Entry Point ), pour que vous compreniez bien, cela veut dire que tout de suite après la routine de décompression il ya un jump vers l'OEP (en l'occurence à l'offset 004D7C14) pour donner la main au programme originel pour qu'il s'execute comme si la compression n'avait jamais existée...

    Le dump :

    On arrive au point essentiel. Une fois la décompression complété, le jump est effectuée et le log se lance normalement. La méthode pour récuperer le programme entierement décompressé est de :

    Poser un breakPoint sur le jump vers l'OEP (jump 004D7C14);
    Lancer le logiciel jusqu'à ce qu'il break;
    Faire un dump, c'est-à-dire faire une copie du programme en mémoire dans un fichier. On peut faire cela facilement avec des logiciels comme ProcDump ou encore LordPE. Le fichier qu'on obtiendra sera le dump du programme compressé.

    Correction de l'EP :

    A partir de cette étape il y a encore quelques modifications à faire pour que le programme fonctionne. L'EP (Entry Point) du dump doit être modifié, en effet, elle pointe encore vers le Loader; or nous n'avons plus besoin du loader dans le dump. Le but maintenant, c'est de modifier l'adresse de l'EP pour que le programme commence son execution au bon endroit. ProcDump ou encore LordPE vous permettrons également de faire cela. L’entry-point se calcule en faisant la valeur de l’OEP ( en l'occurence à l'offset 004D7C14) moins celle de l’ImageBase... On verra ça plus en profondeur dans la partie pratique...

    Reconstruction de l'IAT :

    Pour pouvoir rendre le log 100 % fonctionnel, il faut reconstruire l'IAT. Qu'est ce que c'est que ça ????! Me direz vous... Sans rentrer dans les détails, l'IAT comporte 2 tableaux dans lesquels sont repris les dll utilisées ainsi que les adresses en mémoire des fonctions quelles proposent. L' IAT de l'exécutable sur le disque (le programme packé) n'est pas le même qu'en mémoire (le dump). Sur le disque, un des 2 tableaux contient le nom des fonctions, lorsque le loader du système d'exploitation charge le programme en mémoire, il remplace ces noms par les adresses en mémoire des fonctions correspondantes. Donc l'IAT recopié tel quel dans la mémoire n'est plus valide. Il faut donc le reconstruire. Au-dela de la compréhension global du problème (qui peut paraître assez flou au premier abord), la reconstruction de l'iAT est en elle-même assez simple. On utilise pour cela un logiciel comme ImpREC qui se charge de faire cela pour nous.

    Placement de l'EP dans la bonne section :

    A partir de là, le programme est fonctionnel, vous pourrez le lancez sans problème. Mais si vous voulez manipuler le dump dans un debuggeur comme Olly il faudra faire une petite modif en plus : Les sections du log n'étant plus alignées il vous faudra relancer PE Editor pour replacer l'EP dans la bonne section...

    Et voilà, à partir de là, votre programme devrait fonctionner sans problème et vous pourrez manipuler le dump sans problème dans votre debuggeur préféré ; - ).

    On récapitule la méthode :

    * On trouve l'adresse de l'OEP (situé juste après l'instruction POPAD);
    * On dump le programme (en breakant bien sur je jump vers l'OEP);
    * On redéfinit l'adresse de l'EP (à l'aide de l'OEP trouvé précédemment);
    * On reconstruit l'IAT pour que le log puisse retrouver les adresses des fonctions utilisées (dans les dll) par le log;
    * On replace l'EP dans la bonne section pour permettre le break sur l'EP.
     

    Pourquoi ne pas utiliser UPX Shell ?

    Je voulais juste rajouter une petite précision qui a son importance. Pourquoi chercher a décompresser manuellement un programme compressé par UPX alors que des logs comme UPX Shell le font automatiquement. Et bien il arrive parfois que la décompression avec ce genre de prog ne se fasse pas correctement. Dans ce cas, il faut tout faire "à la main". D'ailleurs c'est ce qu'il se passera dans la partie Pratique de ce tuto ... De plus, vous êtes pratiquement sur que la décompression se sera bien déroulée. Et entre nous, une fois que vous aurez assimilé la méthode il vous faudra moins de 5 minutes pour unpacker n'importe quel programme ! ; - p

    Prérequis

    Logiciels necessaires :

    Excel Password DiscoveryExcel Password Discovery
    LordPE DeluxeLordPE Deluxe
    ProcDump v1.62ProcDump v1.62
    ImpRECImpREC
    OllydbgOllydbg
    Stud PEStud PE
    UPX Shell (facultatif)
    UPXUnpack (facultatif)

    But du tuto :
    Le but de ce tuto est d'appliquer concrètement les méthodes citées dans le tuto sur le manual unpacking. On va unpacker manuellement le programme Excel Password Recovery pour faire apparaitre les Strings Data Reference.

    Excel Password Recovery est un logiciel de brute-forcing pour les fichiers excel protégés par mot de passe ; - ) . Un programme qui peut toujours servir... PS : si vous n'avez pas lu la partie théorique sur le manual unpacking faîtes le en allant ici, sinon vous n'allez rien comprendre : - ).

    Unpacker automatiquement le logiciel

    De l'organisation ! Bon je commence par un petit point sur l'organisation du travail. Si vous avez un minimum l'habitude de cracker un log passez cette partie. Pour les autres je vous conseille de répartir votre travail comme ceci :


    Vous vous rendez à l'adresse ou se trouve le logiciel, vous créez deux dossiers, un nommé crack, l'autre back up. Dans le dossier back up faîtes une copie de uepwdr10l.exe, si vous faîtes une mauvaise manip vous pourrez récupérer l'exe à partir de ce dossier. Copiez également l'exe dans le dossier crack, c'est dans ce dossier que vous ferez les manipulation de unpackage et de crack. Voilà, si vous êtes un peu bordélique essayez de vous organiser comme ceci à chaque fois que vous devez cracker un log.

    Test de décompression automatique :

    Installez Excel Password Recovery ... Rendez-vous dans le dossier de l'executable (par défault C:\Program Files\Intelore\Excel-Password). Comme d'hab on lance StudPe (clique droit sur l'executable uepwdr10l.exe » Stud PE Analyse ). Dans l'onglet Signature on voit :

    Le programme a subit une compression UPX, quel suprise !!!! ; - )

    Test avec UPX Shell :

    On va d'abord essayer de le décompresser avec un logiciel fait pour ça... Commencons par exemple par UPX Shell (lien pour le télécharger au dessus).Dons installez le, dans l'onglet Ouvrir un fichier cliquez sur le bouton "ouvrir" et aller chercher l'exe. Ensuite, dans l'onglet décompression cliquez sur le bouton :



    Nommez l'exe unpacké uepwdr10l_unpack.exe par exemple...si vous le pouvez, car vous remarquez que la décompression ne se fait pas !!!! Bizarre n'est ce pas...

    Test avec UPX Unpack :

    Bon ba, on va essayer avec UPX Unpack. Installer le, lancez le, sélectionnez l'exe,lancez la décompression.... Vous devez obtenir ceci :



    Comme vous le voyez, on dirait que la reconstruction de l'IAT ne s'est pas fait correctement, par conséquent le programme ainsi décompressé est inutilisable !!! Qu'à cela ne tienne, on va se le décompresser manuellement eh eh eh !!

    Unpacker manuellement le log

    Detection du Loader et Détermination de l'OEP :

    On va unpacker le logiciel à l'aide de Olly bdg cette fois-çi (équivalent à Windasm mais plus puissant).Installez le si ce n'est pas déja fait, ouvrez le et importez uepwdr10l.exe à partir de l'onglet File » Open. Si Olly affiche une messageBox validez en appuyant sur le bouton "oui". Il nous faut donc chercher le Loader. Générallement il se trouve tout à la fin. En effet vous remarquez le PUSHAD à l'offset 0053EAB0 et le POPAD à l'offset 0053EC12, suivit d'un jump vers l'offset 004D7C14 (qui correspond donc à l'adresse de l'OEP. Donc notez bien cette offset :

    Créer un Dump :

    On va charger le logiciel dans la RAM. Pour se faire, rappelez vous la partie théorique : on pose un break sur le jump, en l'occurence à l'adresse 0053EC13 : double-cliquez sur la ligne dans la 2ème colonne pour poser le break (sur .-E9 [...]). La ligne d'offset devrait alors rester en surbrillance. Lancez l'.exe en cliquant sur le bouton "lecture". Le programme break alors.
    Maintenant il vous faut installer, LordPE Deluxe... Lancez le et cherchez le programme uepwdr10l.exe dans la listView. Si vous ne le trouvez pas, pas ne panique (ça me le fait aussi sous XP). Dans ce cas téléchargez ProcDump, lancez le et cette fois-çi vous devrez voir apparaître uepwdr10l.exe dans la ListView. Pour info, PorcDump et LordPe sont 2 programmes pratiquement similaires (même interface, même option, ect...); donc quand je vous demanderais d'utiliser LordPe vous pourrez également utiliser ProcDump pour faire la même opération...
    Une fois que vous avez trouvé uepwdr10l.exe, faîtes un clic droit dessus » Dump (Full) :


    Une nouvelle fenêtre, vous permettant de nommer le dump; appelez le uepwdr10l_decomp.exe. Un message devrait apparaitre pour vous dire que le dump a bien été crée. Vous pouvez essayer de lancer le dump, et vous verrez que ça marche pas, ce qui est normal : - ) . Vous devez donc avoir ceci :



    Correction de l'EP :

    Toujours dans LorpPe cliquez sur le bouton "PE Editor" et sélectionnez le fichier dumpé, une nouvelle fenêtre s'ouvre; on va pouvoir modifier l'EP a partir de cette fenêtre :



    Vous pouvez voir l'adresse de l'EP, et l'adresse de l'image. On va calculer l'OEP. Donc ouvrez la calculatrice windows : Demarrer » executer » commande calc... Onglet affichage » scientifique. Selectionnez également Hex (pour Hexadécimal)...
    Calcul de l'OEP = Jump de l'Entry Point (qu'on a noté au début) - Image Base.
    Donc OEP = 0013EAB0 - 00400000 = D7C14 = 000D7C14.
    Donc remplacez la valeur actuelle de l'Entry Point (0013EAB0) par 000D7C14. Cliquez sur OK vous valider les changements. Vous pouvez fermer Lord PE (ou ProcDump) ansi que Olly.

    Reconstruction de l'IAT :

    Pour reconstruire l'IAT on va utiliser ImpREC. Donc téléchargez-le, installez le et lancez le. Vous obtenez cette fenêtre :


    PS : la fenêtre ci-dessus est représenteé lorsque l'IAT a été reconstruit...
    Lancez uepwdr10l.exe normalement (le log décompressé) pour qu'il apparaisse en mémoire, puis lancez ImpREC. Ensuite faîtes comme ceci :
    1 - Selectionnez uepwdr10l.exe dans la liste déroulante.
    2 - Modifier la valeur de l'OEP par notre EP calculé précédemment (000D7C14).
    3 - Cliquez sur le bouton "IAT AutoSearch". Si tout se passe bien, une MessageBox devrait s'afficher.
    4 - Cliquez sur le bouton "Get Imports". La liste va se remplir avec les APIs utilisées par le programme.
    5 - Cliquez sur le bouton "Fix Dump", sélectionnez le fichier dumpé (uepwdr10l_decomp.exe). ET voilà !!!! Le fichier final sera nommé comme ceci : uepwdr10l_decomp_.exe.

    Placement de l'EP dans la bonne section :

    Il nous reste une dernière opération pour pouvoir utiliser l'executable décompressé dans un debuggueur comme olly. Pour l'instant si vous essayez de l'ouvrir dans Olly vous obtiendrez ceci :



    Pour réaligner les sections il vous faut utiliser impérativement LordPE (cette manipulation ne marche pas avec ProcDump). relancez donc LordPe, puis cliquez sur le bouton " PE Editor" et sélectionnez votre programme dumpé. Cliquez sur "sections" et regardez par rapport au VOffset dans quelle section doit se trouver l'EP :



    Je vous rappelle que l'adresse de l'EP est D7C14, donc par rapport au VOffset (correspondant à l'adresse de départ du secteur, la fin du secteur étant désigné par le VOffset du prochain secteur) :
    1000 < D7C14 < DA000
    L'EP doit donc être situé sur le secteur EPRX. Fermez cette fenêtre et dans la fenêtre précédente remplacez la valeur de BaseOfCode par le VOffset du début de la section dans laquelle se trouve l'EP, c'est-à-dire 1000 dans ce cas...Cliquez ensuite sur Save pour appliquer les changement... vous pouvez fermer Lord Pe.



    Maintenant essayez de lancer uepwdr10l_decomp_.exe. Et voilà,le prog se lance normalement, vous pouvez refaire une analyse de l'exe avec Stud Pe pour vous apercevoir que le programme a été programmé avec Borland Delphie v6 à 7, et vous remarquerez également que le fichier dumpé fait environ 1,27 mo ( pour 426 ko pour l'exe original).Allé dîtes le maintenant : "Je suis un fou! Un psychopathe ! Faut pas me résister, je suis dangereux moi !!!"...Un peu de modestie s'il-vous-plais quand même ; - p
    Vous pourrez maintenant cracker le log normalement. Ce tuto étant réservé au manual Packing je m'arrête là pour aujourd'hui, mais vous pouvez toujours essayez de cracker Excel Password Recovery si vous vous en sentez capable ; - ) .
    Allé ciao, et à bientôt pour un prochain tuto de cracking !!!!


    votre commentaire


    Suivre le flux RSS des articles de cette rubrique
    Suivre le flux RSS des commentaires de cette rubrique