II] SUPRESSION DU NAGSCREEN


1) un peu de théorie

ce qu'on va essayer de faire, c'est de supprimer le nagscreen (boite de dialogue
qui te fait attendre et te dit que tu n'est pas enregistré au lancement).
Cette methode n'est pas la meilleure puisque au final, on n'est pas enregistré
mais on a simplement suprimé les symptomes de l'état non enregistré.
La structure du programme peut être shématisée comme cela:

exemple:
call1--> affiche le nagscreen puis la fenetre winzip (affiche le nag)
.........call2 --> controle de la clef de registe pour le nagscreen (affiche le nag)
..............call3 --> affiche le nagscreen si pas de clef ou clef non valide (affiche le nag)


si on execute le programme pas à pas en commencant par le début, le nagscreen
s'affiche quand on arrive sur le call1. On serait tenté de supprimer ce call pour
empecher l'affichage du nagscreen, mais cela crérait une erreur 


Pour réussir, il faut donc remonter le plus prés possible du call qui affiche reellement
le nagscreen et le supprimer. (on peut peut être supprimer le call3 ou le call2).


2) la pratique

installez winzip et dezipez les fichiers d'ollydbg. Cliquez sur ollydbg.exe (icone rouge)
pour demarrer le debugger. Cliquez sur File, Open, et selectionez winzip32.exe
(normalement dans C:\program files\winzip). On obtient ca:

D'abord, pour avoir le code en couleur, clic droit sur le fenetre principale
Appearance > Highlighting > Christmas tree

On execute le programme pas à pas avec la touche F8 (pour ne pas rentrer dans les call).
on appuye sur F8 jusqu'a ce que le nagscreen apparaisse(on peut laisser le doigt appuye
sur F8) quand le nagscreen de winzip apparait a l'ecran, on le quitte en cliquant sur sa
croix en haut a droite. Voila ce qu'on obtient dans la fenetre d'ollydbg:


olly

ollydbg s'est arrette à la lgine 004A84FA (début de ligne en noir)
et la ligne juste au dessus, on voit CALL WINZIP32.00481393
c'est donc ce call qui a declenché l'affichage du nagscreen
On va mettre un breakpoint sur la ligne 004A84F5 en selectionnant
la ligne avec la souris puis en appuyant sur F2 (la ligne devient rouge)


olly

remarque: un breakpoint est un point d'arret pour signifier au debugger
qu'on veut s'arreter a la ligne selectionnee
on peut donc lancer winzip avec F9, il s'arretera au niveau du breakpoint


on cliques sur le menu debug puis restart
la on cliques sur F9 pour executer le programme normalement. Ollydbg s'arrete sur
la ligne rouge (la ligne est rouge foncé car l'execution est arrétée à cet endroit)
au lieu de continuer l'execution du programme avec F8 comme tout a l'heure, on appuie
une fois sur F7 pour rentrez à l'intérieur du call et on continue ensuite a
executer les instructions avec F8 jusqu'a ce que le nag réapparaisse.
le nagscreen réapparait en 4813AF. Il est affiché par le CALL 4812A3.
On met un breakpoint sur ce call avec F2

olly debug

on reexecute le prog avec restart, on execute avec F9. Le programme bloque sur
notre premier breakpoint, donc on reclique sur F9. Le programme bloque sur
notre deuxième breakpoint. On cliques sur F7 pour rentrer à l'intérieur du call
et on execute de nouveau avec F8 jusqu'a faire apparaitre le nagscreen.
On applique cette methode plusieur fois pour arriver jusqu'a un sixieme call.

remarque sur la gestion des breakpoints: un breakpoint est signalé par une ligne rouge 
on peut le suprimer ou le remettre en selectionnant la ligne et en appuyant sur F2
si on veut ajouter un breakpoint sans allez sur la ligne, on va dans le menu plugins,
command line, command line, et on tape bp 47B491 pour mettre un breakpoint sur 47B491
On peut aussi acceder a tous nos breakpoint en cliquant dans le menu View sur breakpoints
On peut aussi desactiver ou reactiver un breakpoint en appuyant sur la barre d'espace

voila toutes les adresses ou on doit breaker (on a 9 call en tout)

bp liste calls

le call 9 (ligne grisée) est le dernier call, on ne peut pas aller plus loin, car si on rentre
dedans avec F7 on se retrouve dans la fonction DialogBoxParamA de User32.dll et
plus dans Winzip. En faisant quelques essais, on s'aperçoit qu'on peut patcher à partir
du call 5 (patcher avant n'est pas possible car winzip n'est pas suffisament initialisé)

le call 5

on va supprimer le call 5 à l'adresse 44661C. On double clic sur la ligne 44661C

Remarque: ollydbg effectue une action différente en fonction de l'endroit ou on cliques
sur la ligne (dessin ci dessous)

call 5

une fenetre assemble at 44661C apparait. Cela va nous permettre de changer l'instruction
on rentre nop et on tape sur entrée. L'instruction a été remplacé par 4 lignes de nop...


call 5 nopé


On execute... et le programme se lance sans afficher notre nagscreen
--> on a un peu de chance, mais ça marche.



le call 6

J'ai expliqué tout à l'heure qu'on pouvait patcher les call à partir du call 5. Que se
passe t'il si on veut noper le call 6 au lieu du call 5? Voila comment ça se presente:


call 6

un peu avant le call 6, on fait appel au call de verification du serial (on verra ça dans
le cours suivant) si al=1 au sortir de ce call, le serial est valide et on évite le call 6
pour ne pas afficher le nagscreen. Dans notre cas, al=0 car on n'est pas enregistré
donc ça execute le call 6 et le nagscreen apparait. Mais si on se contente de noper
le call 6, cela ne marche pas.. Pourquoi? --> Le call 6 attend une valeur en retour
dans eax. Si al = 1 ça signifie qu'on a cliqué sur le bouton "Use Evaluation Version"
--> on peut afficher la fenetre de winzip. Si al=0 ça signifie qu'on a quitté
le nagscreen en cliquant sur la croix en haut à gauche --> winzip doit se fermer.

On se rend compte de ça en regardant la valeur que prend eax quand on clique sur
les differents boutons. Du nagscreen. Si on veut patcher au niveau du call 6, on doit
donc se debrouiller pour que al=1. --> on peux remplacer le call 6 par l'instruction
assembleur mov al, 01

call6 modif



le call 7

Et si on veut patcher au niveau du call 7? Voila comment ça se presente:

call 7

Au sortir du call 7, eax = 1 si on a cliqué sur le bouton "Use Evaluation Version",
0 sinon. Ensuite, le prog regarde la valeur stockée à l'adresse 4E3B91. Pour avoir
al = 1 au niveau du RETN (la fin du call), il faut que deux conditions soient réunies:
al = 1 et 4E3B91 = 1. Oui, mais d'ou vient cette valeur [4E3B91]?  Pour le savoir,
on clic droit dans la fenetre des adresses memoires, goto, expression 4E3B91,
on selectionne le byte, clic droit, et breakpoint  hardware on write, byte --> on relance
Winzip et on clique sur le bouton "Use Evaluation Version" Ollydbg breake sur la
ligne grisée:

bp on write

juste au dessus, une instruction met 1 dans 4E3B91. Cette partie de code est
appelée dans la section WM_INITDIALOG du nagscreen. Si le nagscreen ne
s'affiche pas, cette portion de code n'est pas executée et 4E3B91 reste à zero.
Winzip vérifie donc que le nagscreen s'est bien lancé (pour éviter un patching
avec un simple nop). Pour patcher au niveau du call 7, on doit donc mettre al à 1
 et 4E3B91 à 1 --> voila comment on va patcher:

call 7 modif

remarque: on peut aussi patcher les call 8 et 9 avec cette methode. On a donc
vu que suprimer un
nagscreen peut être trés simple (un simple nop pour le call 5).
ou plus compiqué --> pour les call 6 ou 7
il faut regarder par ou passe le prog
quand on clic sur le bouton evaluation pour inverser quelques sauts
ou lui donner
les valeurs attendues.


Pour garder nos modifications en dur, on selectionne ce qu'on vient de modifier,
on fait un clic droit, et on cliques sur Copy to Executable-->selection.
Dans la fenetre qui apparait, on fait un clic droit et on selectionne save file et
on sauve avec le même nom. On vient de cracker winzip....

3) Winzip32.exe  

Si on sauve nos modifications dans un fichier qui n'a pas le même nom que
Winzip32.exe, on a le message d'erreur suivant:--> c'est pas trés pratique ça
--> on va essayer de s'en débarasser....

wzinfo.dll

On va appliquer la meme methode que pour le nagscreen pour arriver le plus
prés possible du call qui affiche ce message. On arrive au sixieme call qui
affiche le message:

message d'erreur

On remonte un petit peu à la recherche d'un saut conditionnel qui nous
permettrait de ne pas passer par ce call. On trouve un saut conditionnel.
Si on le nope, on a un jmp 477CAC a la suite ce qui nous permet
d'eviter l'affichage du message d'erreur.


modif 1

on s'est débarrassé du message mais le même message re-apparait:


message 2

Pour s'en debarrasser, meme methode --> on patche de la même façon tout à coté:

modif2


4) Pour faire plus joli

Dans le menu Help dans About Winzip, on voit ceci:
"This is an unregistered copy for Evaluation use only")
Avec un editeur hexadecimal, on peut rechercher cette phrase et la
supprimer pour faire plus joli...


cours precedent                                                                                      cours suivant