CIBLE


Pixel 32 v0.98

INFECTIONS


Nagscreen
Boite d’enregistrement
Fonctions désactivées
Time Limit (j’suis pas sur)...

OUTILS


W32Dasm v8.93
Softice v4.01
Procdump v1.62
Editeur hexa (Winhex, hexworkshop, Hiew ß le top ...)

HOWTO



Bon voilà un p’tit soft de dessin qui m’a l’air bien sympa (écrit avec les routines directx en plus). Mais il y a un problème énorme : confiant je lance le soft . Et là première surprise un nag me demandant de m’enregistrer apparait au démarage. Bon j’me suis dis que pour le tester c’était pas génant . Mais là en continuant mon avancé dans le soft ; deuxième surprise : il y a plusieurs fonctions de désactivées avec un nag qui nous le dit. Bon là j’me suis décidé : il fallait faire quelque chose ; et oui comment évaluer la qualité du soft sans toutes ses fonctions.

Bon on est parti à la contre attaque (j’viens de voir l’empire) , on va s’enregistré avec un serial bidon comme cà on pourra profiter du soft. Mais là il y a un problème, il nous dit gentilment de relancer le soft pour que le changement prenne effet, il créé même pas un sérial bon en mémoire (pis de toute façon c’est pas très interressant de juste chopé le sérial). Et là j’aime pas trop cà : et oui va falloir s’occuper de trouver où c’est qui vérifie le sérial au démarage et où c’est qu’il met tout OK pour que le soft ce charge.
Et là décidé à faire mon retour (et non je ne suis pas un Jedi) dans le soft , je change de méthode. Elle est plus compliqué au premier abord (on verra que non par la suite).

Bon maintenant on en est sur c’est la guerre (des étoiles ?). On va désassembler le prog dans W32dasm, et là troisième surprise : il y a pas de string reference, pas cool ( L ). Mais si on regarde de plus près il y a pas non plus de fonctions d’importées et ça c’est pas possible dans un prog normal. Conclusion il est compréssé, et comme je connais qu’un seul compresseur, UPX, capable de laisser W32dasm désassembler le soft je me suis dit que c’était lui. Pour en avoir le coeur net on va regarder le prog à l’aide d’un éditeur hexa, et oui UPX laisse ça signature en gros. Et là qu’est ce qu’on trouve : UPX ! ! !

Bon là on a un max de chance , Procdump va se charger de décompresser le soft (si ca avait pas marcher ca aurait été plus long).
Donc on lance Procdump on va sur unpack on sélectionne pixel.exe on attend qui se lance , on clique sur OK et là une fenêtre apparait pour enregistrer le dump où l’on veut. On le fait, on peut quitter le soft, mais on reste sous procdump : On va en profiter pour modifier les caractéristiques des sections de notre dump. Donc on clique sur pe editor , on ouvre notre dump, on va sur sections et on edite toutes les section en mettant E0000020 (readable, writable...) dans la charactéristique des sections. Maintenant on désassemble notre dump sous W32dasm.
On va donc pouvoir chercher comment cracker le prog. La première idée qui m’est venu c’est de chercher dans les string reference une phrase qui se réfère au nag du début. On la trouve (Please register and ...) on clique dessus et on atterit là :
 
 

* Referenced by a CALL at Address:
|:0047139E
|
:00418E08 55                 push ebp
:00418E09 89E5               mov ebp, esp
:00418E0B 803D58C65F0000     cmp byte ptr [005FC658], 00 <-- compare à 00
:00418E12 7502               jne 00418E16 <-- saute si pas égal
:00418E14 EB02               jmp 00418E18 <-- saute vers nag si égal

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418E12(C)
|
:00418E16 EB0A               jmp 00418E22 <-- arrive là si pas égal et saute et évite le nag

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418E14(U)
|

* Possible StringData Ref from Data Obj ->"JPlease register and support this "
->"program development. Is it $25 "
->"too much ?"
|
:00418E18 68A3914700         push 004791A3 <-- arrive sur nag si égal
:00418E1D E8A6190400         call 0045A7C8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418E16(U)
|
:00418E22 C9                 leave
:00418E23 C3                 ret

Donc en 418E0B il y a une comparaison entre ce qu’il y a en 005FC658 et 0. Si il y a 0 en 005FC658 alors le saut qui suit ne s'’effectue pas mais celui d’après oui et nous envoie sur le nag. Si le résultat est différent de 0 alors on évite le nag . Et là une perspective merveilleuse s’ouvre à nous : on va peut-être pas être obligé de changer tout ce qui marche plus dans le prog . En effet il y a fort à parier que ce 005FC658 joue un rôle dans le prog pour s’avoir si oui ou non on est enregistré ! ! !

On effectue une recherche sur (dans find, search) byte ptr[005FC658] (ce qu’il y a en 5FC658 est de type byte soit 1 octet) . Et là on trouve plein de comparaison à zéro suivit de saut (avec des message comme quoi c’est valable que dans la version enregistré, c’est donc cela qui détermine si on est enregistré), mais ce que l’on cherche c’est où est initialisé cette valeur donc un truc du genre mov byte ptr[005FC658], XX . Et là on trouve deux endroits interressants : un où on met 0 et un où on met 1 . J’ai décidé de m’occuper de l’endroit où l’on met 1 mais on aurait pu s’occuper de l’autre. Voilà le listing :
 

:00418DCC 68FF000000             push 000000FF
:00418DD1 8DBDC4FBFFFF           lea edi, dword ptr [ebp+FFFFFBC4]
:00418DD7 57                     push edi
:00418DD8 E867180500             call 0046A644
:00418DDD 8DBDC4FBFFFF           lea edi, dword ptr [ebp+FFFFFBC4]
:00418DE3 57                     push edi
:00418DE4 8DBDC4FCFFFF           lea edi, dword ptr [ebp+FFFFFCC4]
:00418DEA 57                     push edi
:00418DEB E8809CFFFF             call 00412A70 <-- enregistré ?
:00418DF0 08C0                   or al, al
:00418DF2 7502                   jne 00418DF6 <-- saute si pas enregistré
:00418DF4 EB0E                   jmp 00418E04 <-- saute si enregistré

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418DF2(C)
|
:00418DF6 C6050095470023         mov byte ptr [00479500], 23
:00418DFD C60558C65F0001         mov byte ptr [005FC658], 01 <-- on est enregistré

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418DF4(U)
|
:00418E04 C9                     leave <-- arrive ici si pas enregistré
:00418E05 C3                     ret
 

Donc il suffit de forcer le saut en 418df4, 7502 par EB02, pour que la valeur en 005fc658 soit 1 et que le prog croit que l’on est enregistré.
Mais pour cela il va falloir faire ce crack dans le prog original qui est compressé ! ! !
Bon comme c’est UPX cà va pas être trop dur , en effet dans le code, à l’endroit où il passe la main au prog décompressé en mémoire, et bien juste après il y a plein de 000000 où l’on peut mettre notre patch. Maintenant il faut trouver où il passe là main au prog décompressé en mémoire. Pour cela on modifie avec Procdump les caractéristiques des sections du prog compressé (comme on l’a fait plus haut) et on le lance à l’aide du symbol loader. Là softice ce déclenche et va falloir tracer avec F10 et éviter toute la décompressions du prog (pour cela on peut repérer les boucles qu’il fait et mettre des points d’arrêt juste après et on appuie sur F5 et on continue à tracer). Bon au bout d’un moment on arrive là :
 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0067BF49(C)
|
:0067BF52 61                   popad
:0067BF53 C3                   ret

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0067BF0F(C)
|
:0067BF54 61                   popad
:0067BF55 E9B250D8FF           jmp 0040100C <-- saute vers le début du prog en mémoire
:0067BF5A 00000000000000000000 BYTE 10 DUP(0)
:0067BF64 00000000000000000000 BYTE 10 DUP(0)
:0067BF6E 00000000000000000000 BYTE 10 DUP(0)
:0067BF78 00000000000000000000 BYTE 10 DUP(0)
:0067BF82 00000000000000000000 BYTE 10 DUP(0)
:0067BF8C 00000000000000000000 BYTE 10 DUP(0)
:0067BF96 00000000000000000000 BYTE 10 DUP(0)
:0067BFA0 00000000000000000000 BYTE 10 DUP(0)
:0067BFAA 00000000000000000000 BYTE 10 DUP(0)
:0067BFB4 00000000000000000000 BYTE 10 DUP(0)
:0067BFBE 00000000000000000000 BYTE 10 DUP(0)
:0067BFC8 00000000000000000000 BYTE 10 DUP(0)
:0067BFD2 00000000000000000000 BYTE 10 DUP(0)
:0067BFDC 00000000000000000000 BYTE 10 DUP(0)
:0067BFE6 00000000000000000000 BYTE 10 DUP(0)
:0067BFF0 00000000000000000000 BYTE 10 DUP(0)
:0067BFFA 00000000000000000000 BYTE 10 DUP(0)

Comment je sais que c’est là qu’il saute vers le début du prog en mémoire et bien il suffit de regarder les adresses : on est en 67bf55 et il saute en 40100c , bonjours la différence. Donc le point d’entré du prog décompressé est 40100C. D’ailleurs pour savoir cela il suffisait de regarder le listing du prog décompressé où le PEP est 40100c...

Bon on va pouvoir appliquer notre patch. On lance le prog avec le symbol loader (fournit avec softice) et softice apparait : on met un point darrêt en 67bf54 (le popad avant le saut) , on appuie sur F5 et softce réapparait où l’on voulait.

On va pouvoir mettre notre patch ici car avec toute la place libre après il suffit de décaler le saut (et le popad). Donc on tape a 67bf54 et on met l’instruction mov byte ptr [00418DF2], EB (notre patch) on remet le popad et le saut, ce qui donne en mémoire :

:0067BF53 C3         ret
:0067BF54 61         popad
:0067BF55 E9B250D8FF jmp 0040100C
:0067BF5A 0000       add [eax], al

remplacé par

:0067BF53 C3             ret
:0067bf54 C605F28D4100EB mov byte ptr [00418DF2], EB
:0067BF5B 61             popad
:0067BF5C E9B250D8FF     jmp 0040100C
:0067BF61 0000           add [eax], al

On appuie sur F5 pour voir lancer le prog et voir si la modif marche : impeccable on a plus de limitation.

Donc il suffit de rechercher avec un éditeur hexa la chaine e9b250d8ff (le saut) et d’effectuer les modifications à cette endroit là (on met les nouvelles valeurs hexa obtenues en mémoire, sans oubliées celle du popad et du saut). On a même pas besoin de rééquilibrer le code grace au 000000 qui suivent.

Note : Quand on est lobotomisé comme moi on fait un patch plus long pour virer le message de tips qui apparait au lancement du nag ( ben oui y me plaisit poa, et pis faut tracer sous softice), mais le truc c’est que pour qui s’affiche pas y suffisait d’enlever l’option dans les propriétés du prog.
 
 

Voilà c’est fini . J’espère que c’ est assez clair. N’hésitez (J ) surtout pas à me contacter pour me dire ce que vous en penser : city_of_bitch@caramail.com.

LuTiN NoIR

PS : Et surtout n’oubliez pas : que la force soit avec vous ! ! !