[ - Intro - Explications - L'outil expliqué - Liens - Notes de fin - ]
 
[ - Tutoriaux : Variable d'enregistrement ~ Winrar 3.0b7 ~ Notepad - ]
Crack de Notepad

Pour cet exemple ultra simpliste pour 100% débutant sur Softice, on va se servir d'un prog pur Microsoft : Notepad.
Quand un fichier a le malheur d'être trop gros, une boite nous demande si on veut l'ouvrir sur Worpad, autre éditeur de texte...Bref, c'est ultra logique de demander ça puisqu' on n'a pas changé d'avis !
Donc, on va faire quelque chose pour que l'ouverture soit directe sur Worpad.
Je vais détailler à mort et introduire les instructions très importantes "rfl" et "a".

Emplacement : Sur Windows ou dans le package pour ma version.
Outils : Softice 4.05 ou une autre version, Hexworkshop 2.56
 

A la recherche des protections perdues

1 / Approche sous Softice : 1ère solution.

On prend un fichier suffisament volumineux pour avoir notre problème, puis on clique dessus. On a la boite suivante :

Voilà, voilà, merci les concepteurs pour cette logique implacable.
On clique sur "Non" pour recommencer notre opération mais avec notre débugger. On passe sous Softice ( Ctrl D ) et on réfléchit au breakpoint qu'on va poser. Dans les API Windows, on a MessageBoxExA, MessageBeep...et MessageBoxA. C'est ce dernier qui nous intéresse.
Donc, on tape  " bpx MessageBoxA " et on revient sous Windows ( F5 ou Ctrl D ) puis on reclique sur notre fichier texte.
Hop, Softice revient et on est dans "User32 !", bref en plein dans le traitement de notre API, donc il faut revenir à la surface, dans notre programme. On tape "F12" pour revenir à l'appel de notre "MessageBoxExA" dans Notepad.
Et là, on repasse sous Windows avec notre boite. On clique sur "Oui" et Softice réapparait dans "User32!". On refait un "F12" et là, on est bien dans "Notepad". ( la ligne au-dessus de la console de commandes nous le confirme. )

017F:004033AE FF7508                        push [ebp+08]
017F:004033B1 FF15A8644000             call [USER32! MessageBoxA]
017F:004033B7 83F806                        cmp eax, 00000006   <===== On arrive ici !
017F:004033BA 0F85A7000000             jne 00403467          <===== Si eax différent de 6, saute en 00403467
017F:004033C0 6804010000                  push 00000104

Donc, on voit que Notepad appelle l' API MessageBoxA, puis fait une comparaison ( cmp ) sur le registre eax par rapport à la valeur 6. Si eax = 6 , alors on n' a pas de saut en 00403467.
Si on regarde dans la zone des registres, on voit que eax=6 donc on n'a pas de saut.
On trace en passant à l'instruction suivante avec "F10".
La mention ( no jump ) apparait, ça nous confirme bien que notre saut n'est pas fait.

Voilà, voilà...on tape sur "F5" pour continuer le lancement du programme et on se retrouve avec notre texte dans Wordpad.
Donc, on va patcher toute la zone de l'affichage de notre boite comme ça, on passe directement à Wordpad.
En regardant un peu au-dessus de notre call [USER32! MessageBoxA], on a :

017F:0040339F FF1590634000            call [kernel32!GetStartupInfoA]
017F:004033A5 6A24                          push 00000024
017F:004033A7 A1B4504000               mov eax, dword ptr [004050B4]
017F:004033AC 56                              push esi
017F:004033AD 50                              push eax
017F:004033AE FF7508                      push [ebp+08]
017F:004033B1 FF15A8644000          call [USER32! MessageBoxA]  <===== Notre call

Ok, ok...donc ce qu'il faut savoir c'est que les push précédent un call sont ses arguments, donc si vous décidez de flinguer juste le call, le programme va planter car les push vont mettre dans la pile des valeurs qu'on ne récupérera pas et donc si on a déjà des valeurs dedans, elles vont être décalées.
Donc, en patchant le call, on patche ses push...donc de 004033A5 à 004033AE inclus.
La première solution, c'est de faire notre patch comme un bourrin et de remplacer toutes nos instructions par des nop !
 

2 / Approche sous Softice : 2ème solution

On revient au moment où Softice nous a fait atterir sur :
017F:004033B7 83F806                        cmp eax, 00000006

On a validé "Oui", le registre eax est égal à 00000006. Si on avait choisi "Non", on aurait eu une autre valeur pour eax. ( On peut vérifier ça en recommençant et en validant "Non" )
Le truc est de voir pour la suite que notre registre flag en Z n'est pas validé. Le "Z" est en minuscule et en 
Donc, on tape sur "F10" pour demander à Softice de passer à l'instruction suivante.
Là, on est sur notre "jne" et on voit que notre registre flag a été modifié en "Z". Celui-ci est passé en majuscule et en couleur.

On va voir si notre "théorie" que le saut conditionne l'ouverture de Wordpad.
On est toujours sur le "jne" et on tape "rfl z" dans la zone de commandes. Cette instruction permet de prendre un flag dans le registre ( ici, "Z" ) et de le "renverser".
Dans notre cas, "Z" est validé ; en tapant "rfl z", on voit que celui-ci revient en minuscule. Bref, il est dévalidé.
Donc, notre saut est activé, d'ailleur, on voit "jump" avec une fléche vers le bas sur la ligne de code.
On tape "F5" pour continuer le lancement et on voit qu'on n'a rien ! C'est très bien ! On a cliqué qu'on ne voulait pas l'ouverture sous "Wordpad" et on ne l'a pas !

"rfl z" sert beaucoup pour vérifier des hypothèses sur des sauts. Ca permet d'éviter de passer sous un éditeur hexa et de changer le code pour voir si ça marche.

Donc, ok, on a le noeud du problème. On peut appliquer la solution précédente mais on a mieux et plus simple.
Pourquoi ne pas faire un saut par dessus l'affichage de notre boite ?
On va sur la 1ère instruction qui lance la boite, on colle un saut qui va atterir sur le branchement vers l'ouverture de Notepad.

017F:0040339F FF1590634000            call [kernel32!GetStartupInfoA]
017F:004033A5 6A24                          push 00000024   =====>  jmp 004033CO
017F:004033A7 A1B4504000               mov eax, dword ptr [004050B4]
017F:004033AC 56                              push esi
017F:004033AD 50                              push eax
017F:004033AE FF7508                      push [ebp+08]
017F:004033B1 FF15A8644000            call [USER32! MessageBoxA]
017F:004033BA 0F85A7000000            jne 00403467
017F:004033C0 6804010000                push 00000104  <=====  On doit atterir ici.

Pour faire ça, on a 2 solutions.
(1) Bien connaitre les opcodes et sortir le code hexa de "jmp 004033C0" en réfléchissant.
(2) Passer sous Softice et changer directement en "Live" le code. 

On va choisir la 2ème solution, pour introduire l'instruction "a".

Donc, on est toujours sur notre saut mais on remonte un peu dans le code avec les fléches. On efface notre breakpoint avec "bc*", puis on doubleclique sur la ligne 017F:004033A5 ou on tape "bpx #017F:004033A5".
On revient sous Windows avec ( Fquelque chose, depuis le temps vous devriez le connaitre.) puis on reclique sur notre fichier texte. Softice apparait sur notre ligne.
On tape "a" et "017F:004033A5" apparait dans notre zone de commandes. C'est le grand moment ! S.I nous demande par quoi remplacer la ligne de code.
On rentre " jmp 004033C0" puis "entrée". "017F:004033A7" apparait mais on ne veut pas modifier le reste donc on tape sur "échap" pour revenir en mode commande. On voit bien que notre instruction a bien été modifiée par notre saut !
Si vous avez introduit "CODE ON" dans le "INIT" de winice.dat, vous devriez avoir l' hexidécimal correspondant, sinon tapez le.
On obtient " EB19   jmp 004033C0"
On tape "F5" pour vérifier que notre modification ne fait pas tout planter. Bingo ! Ca marche.

Si vous avez tout suivi, vous voici en possession de 2 instructions importantes de Softice.
 

Lise Grim 2002 / WiA