|
Faire passer un faux serial pour un vrai – 1ère Partie |
J’ai devisé ce cours en 2 afin de vous permettre de bien dissimiler et mieux comprendre, nous prenons comme exemple mIRC v6.03.[www.mirc.com]
Vous avez installé le programme ? quand vous l’exécutez il affiche a chaque démarrage une fenêtre qu’on appel un NAG nous disant que nous n’avons pas enregistré notre soft :

Figure-23
On appui sur Echap et on accède au programme, cliquer sur Register… du menu Help et le programme vous demande d’entré votre nom complet et votre code d’enregistrement, on fait comme d’habitude et je lui donne Willingness comme nom et 12345 comme code :

Figure-24
On désassemble le programme et on cherche notre message

Figure-25
On
remonte un peut plus haut et on tombe sur ça :
* Referenced
by a (U)nconditional or (C)onditional Jump at Address:
|:004C689A(C)
on vas rendre une petite visite a ce saut (Shift+F12) à l’adresse 004C689A:
----------------------------------------------------------------------------
:004C6893 E821FBFFFF call 004C63B9
:004C6898
85C0 test eax, eax
:004C689A 0F84B7000000
je 004C6957
----------------------------------------------------------------------------
La même chose que nous avons fait dans le cours précédant : le programme saute vers le mauvais message donc on doit faire en sorte qu’il saute pas et ça grâce à un NOP (pour supprimer le saut). où on inverse le saut donc on change le 0F84B7000000 en 0F85B7000000, on lance et la il nous donne:

Figure-26
On va voir s’il y a des changements ?!
Avant :
![]()
Figure-27

Figure-28
Après :
|
|
|
Le nag disparaît,
Register disparaît aussi du Menu Help et dans About il est enregistré
au nom que vous aviez entré.
Donc a priori tout marche
bien ! Fermer le programme et re-lancer le, vous allez constater que le nag a
effectivement disparu mais sur le menu Help, Register re-apparaît ? Et sur About
il nous dit : Unlicensed Copy ?
Quant on s’enregistre, le
programme accepte n’importe quoi ! Et s’enregistre sans problèmes, mais quant on
le relance il semble être non enregistré.
A chaque lancement du
programme il vérifie si on est enregistré, on vas pas s’enregistré a chaque fois
qu’on le lance! Comme même ça ne sera pas très cool
revenant
a notre saut :
----------------------------------------------------------------------------
:004C6893 E821FBFFFF call 004C63B9
:004C6898
85C0 test eax, eax
:004C689A 0F84B7000000
je 004C6957
----------------------------------------------------------------------------
Ça se passe comme ça : il vérifie le code, test si eax=0 & saute si égal à zéro. On a changer le JE en JNE et ça n’as rien donner, notre but c’est que le saut ne s’effectue pas, pour cela eax doit être égal à 1 (si eax=0 le saut s’effectue). Il faut tout d’abord savoir que la valeur que contiendra eax dépend du CALL : il vérifie le code qu’on lui a donner, si le code est faux il met eax à zéro et c’est ici qu’on vas entrer en jeu à la fin du CALL on doit forcer eax à 1 ainsi le saut ne s’effectuera pas.
Pour cela je vais vous
montrer 4 méthodes afin de forcer eax à 1 (à l’intérieur du CALL)
Première Méthode :
Souvenez vous q’un
CALL se
termine toujours avec un RET (cours n°2), on doit suivre la ligne du call
jusqu’à ce qu’on retrouve notre RET et la on met eax à 1 ! je vous l’est déjà
dit ? comment mettre un 1 dans eax (cours n°2 l’exemple sur MOV)
MOV
EAX,00000001 en hexadécimal ça Donne ça : B801000000 nous devons donc trouver
une instruction avec la même longueur hexadécimal afin de la remplacer par notre
instruction.
Pour
cela cliquer sur la ligne :
:004C6893
E821FBFFFF
call 004C63B9
et le
bouton
sera
activé cliquez dessus et vous allez rentré dans le call vous descendez les
lignes en cherchons un RET qui fera revenir le programme :
----------------------------------------------------------------------------
| :004C64D3 | E8EEFDFFFF | call 004C62C6 |
| :004C64D8 | 85C0 | test eax, eax |
| :004C64DA | 7407 | je 004C64E3 |
| :004C64DC | B801000000 | mov eax, 00000001 |
| :004C64E1 | EB02 | jmp 004C64E5 |
| * Referenced by a (U)nconditional or (C)onditional Jump at Address: | ||
| |:004C64DA(C) | ||
| | | ||
| :004C64E3 | 33C0 | xor eax, eax |
| * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: | ||
| |:004C644F(U), :004C64E1(U) | ||
| | | ||
| :004C64E5 | 5F | pop edi |
| :004C64E6 | 5E | pop esi |
| :004C64E7 | 5B | pop ebx |
| :004C64E8 | 5D | pop ebp |
| :004C64E9 | C20800 | ret 0008 |
----------------------------------------------------------------------------
Qu’il est gentil vous voyer le mov eax, 00000001 ?! (4ème ligne) juste en bas il y a un xor eax, eax qui force eax à zéro (nous avons trouver le méchant) il est appeler par le saut qui est juste avant notre mov eax,00000001 donc il saute directement vers xor, pour y remédier nous allons enlevé ce saut grâce a l’instruction NOP, on remplace 7407 par 9090, il sera forcer a 1 et le JMP nous conduira directement sur RET.
Deuxième Méthode :
On a vue qu’avant le RET du CALL il y a un xor qui force eax à 0, souvenez vous du registre al il fait partie de eax donc si on change al on change impérativement eax (ce qui veut dire que si al=1 eax sera lui aussi égal à 1)
|
EAX |
|||||||
| AL | |||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Pour forcer AL à 1 on utilise
la même instruction MOV ce qui donne mov al, 01 en hexadécimal :
B001 la
solution est donc très simple on remplace 33C0 par
B001.
Il y a
aussi deux autres méthodes, que je vais expliquer dans le prochain cours,
c'est-à-dire la deuxième partie de ce cours.
|
Cours précédant : |
Cours suivant : |