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 :


Figure-29


Figure-30

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 :
<<
La pêche aux Serials

Cours suivant :
Faire passer un faux serial pour un vrai – 2ère Partie >>