FruityLoops 1.40 : méthode Dumping par Artex


Bon je vous préviens tout de suite que ce compte-rendu va être rapide mais qu' il va vous demander du travail personnel (je sais qu' avec les exercices et ici le travail personnel, vous êtes à l' école, à bonne école ;)

Je vous conseille de lire au préalable le compte-rendu d' Ethan, très instructif et bien écrit (nous voulons d' autres cours de cette trempe !)
Je vous conseille aussi d' aller faire un tour sur le site de Wotsit pour tous les détails sur les PE et autres (une mine d' informations !)
Je vous conseille de tout faire par vous même, et ensuite de refaire la même démarche avec un programme que vous connaissez bien, ou mieux un programme de votre création personnelle auquel vous aurez appliqué la protection Codesafe.

Zou !

On commence par Hview qui nous donne les informations suivantes :

1- EntryPoint RVA : E9E00
2- Base Of Code : 1000
3- Image Base : 400000
4- Size Of Code : AFC00

Que constate-t-on ? Que le Base Of Code est très loin du EnrtyPoint RVA ce qui confirme ce que l' on subodorait : c' est crypté.

Ensuite, on essaye de déassembler avec wdasm : on ne voit rien de plus comme informations, si ce n' est que le code semble incompréhensible (crypté).

On charge en mémoire notre Memory-Dumper : j' utilise WDump95 que vous trouverez surement sur la page de Iczelion (cf section LIENS). Je crée une Memory Mapped File de 1000 KO (on ne sait jamais combien il faudra, donc prévoir large).

SoftIce :
On laisse le proggie se lancer, nous narguer avec son écran qui nous rappelle que nous ne sommes pas enregistré et ensuite on arrive dans le proggie en lui-même.
Bon maintenant on est quasiment certains que le proggie est décompacté en mémoire (puisqu' il s' exécute.) Ce que l' on veut c' est pouvoir revenir sous softice pour pouvoir faire notre cuisine. Il faut revenir sous le contexte du proggie et non pas par un banal Ctrl-D car si vous faites à ce moment là un d 401000 vous ne verrez pas ce que vous êtes sensés voir. Par exemple on peut revenir en utilisant la routine du serial qui est atteinte par Ctrl+Alt+F9. Ceci s' effectue grâve à un bpx hmemcpy ou autre suivi du nombre approprié de F12. On contrôle en faisant un d 401000 et l' on doit voir apparaitre à cet endroit les mots comme Boolean, Integer etc... C' est ce qui se trouve au début des proggies écrit en Pascal ou en languages de haut niveau..

Une bonne chose de faite, maintenant il faut que l' on "dumppe" avec nos petits doigts experts (ceci car la fonction "move" de soft-ice n' est guère satisfaisante et ne fonctionne pas très bien ici). On doit trouver un endroit pour écrire notre petite routine qui effectuera la sale besogne. Si on regarde un peu plus haut que 401000 on constate qu' il y a plein d' espace inutilisé. Prenons pas exemple 400400.
- Notez l' EIP actuel (et oui, on veut pouvoir revenir ! ;)
- r eip 400400 ; on pointe sur le début de notre routine
- a eip ; on écrit notre routine

push edi ; on sauvegarde les différents registres car on va les modifier et on veut les retrouver dans leur état initial quand on "rendra" la mains
push esi ; pareille
push ecx ; pareille
mov esi, 00401000 ; on va copier les octets qui commencent ici : c' est le Base Of Code+ Image Base de tout à l' heure
mov edi, ******** ; là vous mettez l' adresse que vous donne votre memory dumper
mov ecx, 2BE85 ; on veut dumpper cette longeur : codesize/4 (ie AFA14/4) cf plus bas pour les explications.
repe movsd ; un conseil : sous soft-ice tapez d' abord repe puis enter puis movsd et hop ! ça marche !
pop ecx ; on restaure dans le bon ordre pour pouvoir resortir sans problème.
pop esi
pop edi

Normalement si vous tracez pas à pas (F10) et que vous regardez à l' endroit de votre mapped file vous allez voir qu' elle s' est remplie de ce que contenait le Code Section de FruityLoops.
On ressort en effaçant le breakpoint et on quitte FruityLoops après avoir effectué le dump. Globalement on peut dire que vous avez un fichier qui contient ce que contenait la mémoire auparavant et qui correspond au Code Section.

Avant dernière étape : Hview à nouveau.
Ce que l' on veut c' est remplacer ce que l' on vient de dumpper <=> Code Section décompacté par l' ancien qui est le Code Section compacté.
Donc, sous Hview on passe en Hexa (F4), on va en
B0A14 on appuie sur la touche * on va ensuite en 400 on appuie à nouveau sur la touche *. Ensuite on tape Crtl-F2 et on contrôle que l' on veut bien remplir entre 400-B0A14 pour une longueur de AFA14. Vous remplissez le nom du fichier de dump et vous laissez tel quel ('As Is').

Explication de la longueur de AFA14 : on part d' une taille de AFC00 (Code Size) mais à laquelle on enlève le Optional Header et Magic Header. On a (cf Hview)
Optional Header+Magic Header= E0+10B=1EB
Donc AFC00-1EB=AFA15 c' est la taille qu' il a fallu dumpper (on n' est pas à un octet ;)

Explication de l' adresse de fin du dump : cela correspond à Code Size+Base Of Code ie AFA15+1000=B0A15

NB : ici il faut savoir jongler entre les adresses physiques (sur le disque) et les adresses virtuelles (en mémoire) et c' est loing d' être évident au début (inquiétez vous car c' est toujours aussi confus par la suite ;)

Il ne nous reste plus qu' à modifier l' Entry Point RVA grace au PE Editor de ProcDump (c' est vrai que l' on aurait pu aussi le faire à la mains avec un éditeur hexadécimal mais bon, hein...)
Donc on le change de E9E00 en B04C4.

Explication du nouvel EntryPoint RVA : ici il y a plusieurs solutions : on peut rechercher un contexte que l' on connait, par exemple grâce aux versions antérieures de FruityLoops car en général le tout début du proggie ne change pas entre deux versions successives. On peut aussi s' amuser à tracer le code qui décrypte le proggie et l' on verra que le programme fonctionne avec des xor ; Attention pour cette méthode : FruityLoops via CodeSafe possède une routine anti-débugger qui vous forcera à rebooter si vous ne la voyez pas à temps... On peut aussi se baser sur CodeSafe en écrivant un petit proggie que l' on protège par CodeSafe : c' est le plus simple mais pas le plus préférable car on n' a pas toujours le crypteur à portée de mains (pour cette méthode cf Essais de Ethan sur ce site). En fait moi, j' aime bien avoir les mains dans le camboui et voir réellement ce qui se passe : tout d' abord on comprends mieux, et c' est TOUJOURS applicable...

Voilà, FruityLoops 1.4 fonctionne normalement, la seule différence étant qu' il est maintenant déassemblable par Wdasm et que vous allez pouvoir le cracker de manière 'normale'... Je ne détaille pas ici la façon de le cracker car c' est exactement la même méthode que pour la version 1.38 (cf mon compte-rendu sur le site.)

Notes Finales

Comme disait Ethan dans son compte-rendu : J' espère que vous avez appris quelquechose, en tout cas moi OUI !
J' ai mis pas mal de temps à écrire ce compte-rendu car j' ai été perturbé par des examens universitaires : quelle idée de mettre des examens juste au moment où je devais rédiger ce compte-rendu ! pfuu !

Pour tous les outils cités ici, cf la page de liens où vous trouverez surement une référence vers un site qui contient votre bonheur.

Autre chose : on pourrait si on le désirait tronquer le .rsrc Section et modifier l' ImageSize ainsi que le .rsrc Lenght mais ce n' est pas nécessaire dans notre cas.

Mars-Avril 99
Artex@caramail.com