|
Tutorial n° 1
AddWeb 3.15 (Standard Edition)
Par Freud
- Date : 4 mars 2000
- Logiciel : AddWeb 3.15
- Distributeur : CyberSpace HQ
- Protection : AsPack, NagScreen, Limitations
- Outils : PESniff, ProDump, Softice ,Hiew, Wdasm
- Pour me contacter : French_Freud@Hotmail.com
- Intro
Salut à tous,
Ne sachant que faire dans la nuit du jeudi 2 au vendredi 3 mars 2000, j'allumais mon pc histoire de trouver une
occupation...qu'est ce que je pourrai bien faire...jouer ouaih voyons mon répertoire de jeux...
Bof!! pas grand chose d'intéressant... tiens qu'est ce que j'ai foutu dans ce répertoire c:\Various
Useful Programs....voyons ah oui c'est vrai des sharewares que j'ai téléchargé l'autre jour.
Hehehe...une idée me vint tout de suite à l'esprit et si je faisais un petit crack histoire de me
défouler un peu!! je venais de trouver une occupation . Au hasard, prenons AddWeb3 de CyberSpace HQ, c'est
parti!!!
- Voyons à quoi on a affaire...
Avant toute chose lançons ce petit proggy pour voir ce qui se passe.
Bon ben ca a le mérite d'être clair, on a un beau NagScreen au lancement du programme qui nous propose
soit de nous enregistrer en tapant un nom et une clé d'enregistrement, soit de poursuivre en mode non enregistre...
De plus, le nagscreen nous indique la liste des limitations en mode non enregistre... Bien bien bien...
Comme a l'habitude voulant en faire le moins possible, je rentre un serial bidon genre nom : Freud, serial : whocares
et là je note le message ici : "Invalid Serial Number....".
Ok, je sors de AddWeb3 et lance Wdasm32 mon désassembleur préfèré histoire de voir
si je peux pas trouver des string reference du message d'erreur "Invalid Serial number..." mais la oh
surprise Wdasm ne désassemble rien du tout.... tiens tiens tiens bizarre bizarre vous avez dit bizarre...
Lançons AddWeb3 sous le Symbol Loader de Soft-Ice, softice ne break pas aie aie aie ca s'annonce mal...les
caractéristiques des sections ont sûrement du être changées.
Voyons ca avec ProDump, on clique sur PE Editor puis on choisit le soft AddWeb3.exe, puis on clique sur section,
voila ce que ca donne chez moi :
Name Virt Size Virt Offset Raw Size Raw Offset Characteristics
------------------------------------------------------------------------------------
CODE 00123000 00001000 0006CC00 00000400 C0000040
DATA 00003000 00124000 00001400 0006D000 C0000040
BSS 00002000 00127000 00000000 0006E400 C0000040
.idata 00003000 00129000 00001200 0006E400 C0000040
.tls 00001000 0012C000 00000000 0006F600 C0000040
.rdata 00001000 0012D000 00000200 0006F600 C0000040
.reloc 00012000 0012E000 00000000 0006F800 C0000040
.rsrc 000A1000* 00140000 00021000* 0006F800 C0000040
.data 00002000 001E1000 00001800 00090800 C0000040
On remarque tout de suite que ce qui empêche le désassemblage
par Wdasm32 et le break de Soft ice, c'est les caractéristiques de la section CODE qu'il faut changer en
E000020 !!!
ProDump fait ca très bien, un petit click droit sur CODE, Edit Section, et hop on change les caractéristiques
de la section CODE... Maintenant SoftIce break et Wdasm32 désassemble magique non??!!!
Un rapide coup d'oeil sur la taille des sections sur le disque (Raw Size) et la taille des sections en mémoire
(Virtual Size) a de quoi en intriguer plus d'un... il y a beaucoup de différence (section .rsrc : Raw Size
(voir *) = 00021000
(hexa) ce qui donne 135168 (deci) et Virtual Size (voir * ) = 000A1000 (hexa) ce qui donne 659456 (deci)). Pourquoi le proggy réserve autant de
mémoire pour si peu de données, vous avez trouve?? Ben oui le logiciel doit être compresse
!!!
Du coup on balance PESniff (soft qui reconnaît de nombreux types de compression) et la il nous confirme que
AddWeb3 est compresse avec AsPack !!!! BINGO !!
- Supprimons maintenant le test entre le bon code et le mauvais
Bon on a déjà pas mal de renseignements, maintenant on va
passer a l'annulation du test de comparaison entre notre serial et le bon. Le problème de AsPack on verra
ça en dernier.
On va procéder comme a l'habitude. On ouvre le soft et on tombe sur ce ?##!! de NagScreen. On clique sur
Enter a resgitration number. Là il nous demande notre nom et notre code, on lui entre gentiment n'importe
quoi (nom : Freud, Code : 123456789 par exemple).
CTRL-D, pour retourner dans Soft-Ice, On pose un point d'arret BPX Hmemcpy et F5 pour retourner dans AddWeb3 c'est
aussi simple que ca. On clique sur Ok, et hop on revient Soft-Ice
On a donc un premier Break Point :
Il ne nous intéresse pas, en effet, après quelques appuie sur F12 (7 pour être précis),
pour sortir de l'API Hmemcpy et quelques F8 pour exécuter des instructions RET
on a les instructions suivantes :
:004E6CCC E8F3D2F3FF CALL 00423FC4
:004E6CD1 8B45E4 MOV EAX,[EBP-1C] <-- Ici Eax pointe vers Freud
:004E6CD4 8D55E8 LEA EDX,[EBP-18]
En tapant d EAX sous Soft-Ice, on note qu'il pointe vers notre nom. On s'en
tape un peu de ca, on appuie sur F5 et hop de nouveau dans Soft-Ice, ici même cinéma : F12, un peu
de traçage avec F8 pour exécuter des RET et de nouveau :
:00424017 8B45FC MOV EAX,[EBP-04] <-- Ici Eax pointe vers Freud
On presse F5, et hop de nouveau retour dans Soft-Ice mais pour des choses
beaucoup plus intéressante!!!
Comme d'hab, F12 pour sortir de Hmemcpy, et quelques F8 pour exécuter des RET, on arrive ici :
:004E6CFE 8B45E4 MOV EAX,[EBP-1C] <-- Pointe sur "123456789" notre code
:004E6D01 8D55E8 LEA EDX,[EBP-18]
:004E6D04 E8FF19F2FF CALL 00408708
:004E6D09 8B55E8 MOV EDX,[EBP-18]
:004E6D0C 8B45FC MOV EAX,[EBP-04]
:004E6D0F 8B80E4010000 MOV EAX,[EAX+000001E4]
:004E6D15 E8DAD2F3FF CALL 00423FF4
:004E6D1A A128645200 MOV EAX,[00526428]
:004E6D1F 8A00 MOV AL,[EAX]
:004E6D21 8845F3 MOV [EBP-0D],AL
:004E6D24 8D55E4 LEA EDX,[EBP-1C]
:004E6D27 8B45FC MOV EAX,[EBP-04]
:004E6D2A 8B80Ea010000 MOV EAX,[EAX+000001E4]
:004E6D30 E88Fd2F3FF CALL 00423FC4
:004E6D35 8B45E4 MOV EAX,[EBP-1C]
:004E6D38 50 PUSH EAX
:004E6D39 8D55E0 LEA EDX,[EBP-20]
:004E6D3C 8B45FC MOV EAX,[EBP-04]
:004E6D3F 8B80DC010000 MOV EAX,[EAX+000001DC]
:004E6D45 E87AD2F3FF CALL 00423FC4
:004E6D4A 8B45E0 MOV EAX,[EBP-20]
:004E6D4D POP EDX
:004E6D4E E8B5EEFFFF CALL 004E5C08 <-- Test Code valide et notre code "123456789"
:004E6D53 A128645200 MOV EAX,[00526428]
:004E6D58 803800 CMP BYTE PTR [EAX],00
:004E6D5B 0F858B000000 JNZ 004E6DEC <-- Test si Code Ok on saute sinon on continue
En analysant un peu cette partie de code, on s'aperçoit que la seule
comparaison après que la valeur du code ait été mis en mémoire par Hmemcpy se trouve
a l'adresse :004E6D5B.
Par conséquent le CALL a l'adresse :004E6D4E doit effectuer le test entre la bon code et le notre. On se dit qu'avec un peu de
chance en inversant le saut on passera directement en mode enregistre.
Eh bien, bonne surprise....mais de courte durée !! Effectivement, quand on modifie le saut on arrive bien
a une boite de dialogue qui indique "Thank you for registering AddWeb!". Mais car il y a un mais c'est
quand on referme cette boite, on se retrouve toujours dans le NagScreen et rien a changer pour nous !!!
En réfléchissant un peu on se dit que le CALL a l'adresse :004E6D4E qui compare les deux valeurs doit être exécuter d'autre fois dans le
programme a d'autre endroit...c'est pour cette raison que l'enregistrement ne fonctionne pas.
Bon ben pour vérifier cela on va poser un BPX juste a la première instruction de ce CALL, histoire
de voir si on break une fois ou plusieurs fois.
BINGO !! On passe une autre fois dans ce CALL étant donné que Soft-Ice nous rend la main 2 fois.
La solution est donc de modifier quelque chose dans ce CALL et non pas de modifier le saut a l'adresse :004E6D5B.
En tracant un peu dans le CALL on trouve ceci :
:004E5CF9 8B45EC MOV EAX,[EBP-14] <-- Eax pointe sur le bon code (Notez le :))
:004E5CFC 8B55E8 MOV EDX,[EBP-18] <-- Edx pointe sur notre code
:004E5CFF E87CE2F1FF CALL 00403F80 <-- Contrôle des deux codes
:004E5D04 7526 JNZ 004E5D2C <-- Si code ok, on saute pas sinon on saute
Vous me voyez venir....eh ouaih modifier le saut a l'adresse :004E5D04 et comme on dit
par chez nous "That will do the trick !!!".
Entre parenthèses, on a eu un peu de chance que ca marche aussi "facilement" car dans le CALL
a l'adresse :004E5CFF
le proggy aurait très bien pu mettre une valeur en mémoire a 0 ou 1 pour dire si le code etait bon
ou pas. Cette valeur aurait pu être teste ailleurs dans le prog. Enfin ca n'aurait pas ete dur de la trouver
de toute façon...
Voila, le programme accepte dorénavant n'importe quel code et nom :) et s'enregistre correctement. A noter
que ce crack est pour enregistrer la version Standard Edition. Pour enregistrer AddWeb sous d'autre version (Gold,
Enterprise), il y a d'autres manips a effectuer mais cela ne nous concerne pas ici !!
- Maintenant qu'on a l'endroit a modifier, Comment patcher
le programme compressé ?
On se rappelle que le programme est compresse avec AsPack on ne va donc
pas pouvoir patcher directement sur le fichier comme tout autre crack...
Peu importe ca va nous compliquer un peu la tâche mais c'est pas grave les personnes qui ne savent pas comment
cracker un programme compresse pourront y trouver des infos intéressantes (du moins je l'espère).
Pour commencer, on peut se demander comment fonctionne un proggy compresse.
Quand on lance le soft, voila en gros se qui se passe :
1. En tout premier, le décompresseur ou loader (qui n'est pas compressé lui!! et heureusement) va
décompressé le prog en mémoire.
2. Le loader redonne la main au programme décompressé dans sa totalité.
Notre but a nous est de patcher le programme décompressé en mémoire. L'unique facon pour nous
d'agir se situe lorsque tout le programme a été décompressé c'est a dire lorsque le
loader va rendre la main au programme décompressé.
Il faut donc trouver cette endroit mais ne vous inquiétez pas ce n'est pas très sorcier!! Une fois
cette endroit trouve, on "jump" vers notre modification dans notre cas ce sera un truc du style MOV BYTE
PTR[004E5D04],00000074 (004E5D04 étant l'adresse de notre saut). puis une fois les modifs terminées
on saute vers le début du programme décompressé et hop c'est gagne!! BINGO.
C'est partie :
1. Trouver le moment ou le loader passe la main au programme décompressé.
En général, les sauts vers le programme décompresse sont relativement bizarre!!! Du genre
: JMP EAX ou CALL EAX,etc...
Chargeons donc le Symbol Loader de Soft-Ice, si vous avez fait les modifs des caractéristiques de la section
CODE comme je l'ai expliqué au début de ce tut Soft-Ice doit breaké à l'entry point
du programme c'est a dire a la première instruction exécutée (ce sont les instructions du
loader AsPack en l'occurrence).
Ici l'entry point est a l'adresse :0006DAC4 (ProDump nous le dit quand on fait un PE Editor sur AddWeb3.exe) Appuyer
donc 3 fois sur F8 histoires de passer 3 instructions et on tombe là-dessus :
:005E1000 60 PUSHAD <-- Signe du loader
:005E1001 E800000000 CALL 005E1006
:005E1006 5D POP EBP
:005E1007 81ED3ED94300 SUB EBP,0043D93E
:005E100D B838D94300 MOV EAX,0043D938
:005E1012 03C5 ADD EAX,EBP
:005E1014 2B850BDE4300 SUB EAX,[EBP+0043DE0B]
:005E101A 898517DE4300 MOV [EBP+0043De17],EAX
:005E1020 80BD01DE430000 CMP BYTE PTR [EBP+0043DE01],00
:005E1027 7515 JNZ 005E103E
:005E1029 FE8501DE4300 INC BYTE PTR [EBP+0043DE01]
:005E102F E81D000000 CALL 005E1051
:005E1034 E879020000 CALL 005E12B2
:005E1039 E812030000 CALL 005E1350
:005E103E 88503DE4300 MOV EAX,[EBP+0043DE03]
:005E1044 038517DE4300 ADD EAX,[EBP+0043DE17]
:005E104A 8944241C MOV [ESP+1C],EAX
:005E104E 61 POPAD <-- Signe qui ne trompe pas
:005E104F FFE0 JMP EAX <-- Saut vers notre programme décompressé
noter l'adresse contenu dans EAX (correspond a l'entry point du programme
décompressé)
Un signe caractéristique du loader (en tout cas pour AsPack) c'est
qu'il commence pas sauvegarder les registres (PUSHAD). En traçant un peu on trouvera sans peine le POPAD
(la c'est vraiment simple, il est vraiment tout près) qui signifie que le loader a fini son boulot. D'ailleurs
on trouve un JMP EAX qui confirme notre supposition. On en profite pour noter l'adresse contenu dans EAX (Ici :
0523110). Donc, il faudra remplacer les instructions de la fin du loader par un jump vers notre routine de modification
en faisant bien attention de reecrire les instructions que l'on a efface pour faire notre saut dans notre routine
afin qu'elle soit exécutée!!
ca donne a peu près ca :
------------------------
JMP Notre_Routine --> fin du loader
...
Instructions efface du loader --> debut notre_routine
Notre modification --> faire nos modifs
JMP entry_point du prog decompresse (EAX=0523110) --> rend la main a addweb3
Maintenant, il y a un truc important à trouver, c'est de la place pour écrire notre_routine. Dans
l'exécutable AddWeb3.exe, seul le loader n'est pas compresse ce qui veut dire que la place qu'il prend sur
le disque dur (Raw Size dans ProDump) est la même qu'il prendra en mémoire.
De plus, comme tout programme est divise en sections, et que chaque sections possède une entrée dans
le PE Header ca veut que notre loader possède une section dans le PE Header. Le plus logique est donc d'essayer
de trouver un peu de place a la fin de la section consacre au loader.
Comment trouver la section consacrée au loader? Normalement, c'est celle qui contient l'entry_point du programme
(étant donne que c'est le loader qui s'exécute en premier). Si on applique cette règle a notre
cas, l'adresse de l'entry_point est 0006DAC4, ce qui signifie en regardant les virtual address des sections a l'aide
de ProDump (il est vraiment bien utile ce p'tit logiciel) que qui voudrait dire que le loader est contenu dans
la section CODE ??!! c'est vraiment bizarre vous trouver pas???
Heureusement SoftIce nous en dit un peu plus long, vous vous rappelez lorsque qu'on lance AddWeb3 grace au loader
de SoftIce on break bien a l'entrypoint (006DAC4) mais on voit les instructions suivantes :
:0046DAC6 7500 JNZ 0046DAC8 <-- instruction qui suit l'entry point
:0046DAC8 E9333351700 JMP 005E1000 <-- Saut vers hehe lisez la suite
Vous allez me dire et alors?? Ben ca vous rappelle rien la valeur 005E1000 du JUMP. Eh oui,
c'est le début de la section .data (en effet 005E1000-Image Base (400000)=1E1000). La section consacrée au loder etait donc .data
(etait ce une ruse de CyberSpace??).
Ainsi comme on sait que la taille de cette section (.data) sur disque est de 1800 bytes (cf Raw Size dans ProDump),
on additionne 1E1000+1800=1E2800 qui correspond a la fin de notre section .data!!! Y'a plus qu'a espérer
qu'il y ait de la place c'est a dire des séries de 0, avant l'adresse 1E2800.
C'est facile d'aller voir ca avec SoftIce, on lance addweb3 sous le symbol loader et une fois dans le code du loader,
on tape d 5E2800...(faut pas oublier d'ajouter l'image base) eh la oh magie, ya vraiment de la place qui reste
c'est donc la qu'on va installer notre routine de modification.
Moi j'ai choisit l'adresse 5E2601. Par précaution j'ai place un BPM a cette adresse pour être sur
que le soft ne l'utilise pas. Non, c'est ok.
Bon alors normalement j'ai toutes les infos nécessaires je peux patcher addweb3.exe sans problème
Reprenons :
Etape 1 : JMP Notre_Routine
:005E103E 88503DE4300 MOV EAX,[EBP+0043DE03]
:005E1044 038517DE4300 ADD EAX,[EBP+0043DE17]
005E104A 8944241C MOV [ESP+1C],EAX
:005E104E 61 POPAD
:005E104F FFE0 JMP EAX
Voila la fin du loader. L'info a coder est la suivante : JMP 05E2601 -->
on jump vers notre routine de modification
En Hexa JMP 05E2601 se code sur 5 octets.
Voyons...oui on va l'insérer a l'adresse 005E104A étant donne que du MOV au POPAD on a 5 octets, ainsi on a bien un équilibre
du code.
Taper donc a 005E104A
sous soft-ice : puis jmp 05E2601 et 2 fois entrée
La fin du loader ressemble plus a ca maintenant:
:005E103E 88503DE4300 MOV EAX,[EBP+0043DE03]
:005E1044 038517DE4300 ADD EAX,[EBP+0043DE17]
:005E104A E9B2150000 JMP 5E2601
:005E104F FFE0 JMP EAX
c'est mieux, non???
Les infos que l'on a écrase (MOV [ESP+1C],EAX et POPAD) on les retapera dans la routine de modification.
Etape 2 : Ecrire notre routine de modification
on tape a 05E2601 sous softice (pour assembler des instructions a l'adresse 05E2601)
D'abord on écrit les instructions écrasées :
MOV [ESP+1C],EAX
POPAD
Puis notre modification (enfin!!)
MOV BYTE PTR [004E5D04],00000074
Et enfin notre jump vers l'entry point du programme compresse c'est a dire : JMP 0523110
deux fois entrée et hop c'est fini!!!!!!!
Vous croyez!!! et non malheureusement :(
C'etait sans compter sur ce %#??!! de AsPAck !!!
Regarder voila notre nouveau source :
:005E1000 60 PUSHAD <-- Signe du loader
:005E1001 E800000000 CALL 005E1006
:005E1006 5D POP EBP
:005E1007 81ED3ED94300 SUB EBP,0043D93E
:005E100D B838D94300 MOV EAX,0043D938
:005E1012 03C5 ADD EAX,EBP
:005E1014 2B850BDE4300 SUB EAX,[EBP+0043DE0B]
:005E101A 898517DE4300 MOV [EBP+0043De17],EAX
:005E1020 80BD01DE430000 CMP BYTE PTR [EBP+0043DE01],00
:005E1027 7515 JNZ 005E103E
:005E1029 FE8501DE4300 INC BYTE PTR [EBP+0043DE01]
:005E102F E81D000000 CALL 005E1051
:005E1034 E879020000 CALL 005E12B2
:005E1039 E812030000 CALL 005E1350 <-- Ici
:005E103E 88503DE4300 MOV EAX,[EBP+0043DE03]
:005E1044 038517DE4300 ADD EAX,[EBP+0043DE17]
:005E104A 8944241C MOV [ESP+1C],EAX
:005E104A E9B2150000 JMP 5E2601
:005E104F FFE0 JMP EAX
Effectivement, je ne sais pas trop bien pourquoi (en fait ca doit une protection
de plus), quand il passe dans le CALL a l'adresse :005E1039, le JMP que l'on a rajoute a la place du MOV et du POP se modifie tout seul!!!
Incroyable, en fait non l'explication est très simple dans le CALL, le prog copie a l'emplacement mémoire
qui correspondait au POPAD la valeur hexa 61 (ce qui a pour conséquence de modifier notre JMP), et savez
vous comment est code POPAD en hexa :)...bonne réponse 61!!! AsPack essai donc de "s'autoréparer"
si on peut dire.
Enfin pas pour longtemps...car on pose un BPM sur l'emplacement mémoire douteux (ie 05E104E) pour finir
par noper un STOSB (se trouvant dans le CALL) qui place la valeur 61 vers la case mémoire 05E104E. Voila
notre JMP n'est pas près de se modifier tout seul !!!
Bon je vous ai pas dit a qu'elle emplacement mémoire se trouvait le STOSB mais je vous laisse chercher c'est
poa dur...
Voila on relance le tout et on a un beau prog qui s'autopatch au démarrage!!! Y'a plus qu'a faire les modifications
avec Hiew !!
- Conclusion
Pour conclure, je voulais simplement signaler que c'etait mon premier tutorial.
Je me suis rendu compte en le tapant que faire un tutorial c'etait super long. J'en profite donc au passage pour
saluer Christal (Tes tuts sont vraiment excellents, continue!!! à me (nous) montrer la voie). Je voulais
aussi remercier Brénuche, président de l'IRIP, pour son super site.
Au passage, si vous trouvez des absurdités, des erreurs dans ce tut (ce qui est loin d'être impossible)
ou que vous avez une remarque a faire, n'hésitez surtout pas a prendre contact avec moi (French_Freud@Hotmail.com).
Voila, je crois que j'ai tout dit, Don't give the fight
Freud
Le mot de la fin : "You Know what suckZZZ....When Ya
spill a full beer !!!"
|