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