[ - Intro - Explications - L'outil expliqué - Liens - Notes de fin - ] |
[ - Tutoriaux : Variable d'enregistrement ~ Winrar 3.0b7 ~ 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
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".
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.