Serial fishing sur un soft.pdf

(227 KB) Pobierz
Dans ce cours, nous allons voir comment faire du sérial fishing sur un soft. Qu'est ce que le
sérial fishing ?
C'est l'art de cracker un programme en trouvant le sérial qui correspond à son nom. Le sérial
fishing peut être assez simple lorsque le sérial apparaît en clair dans le programme au cours du
debugging, par exemple dans les vieilles versions de Winzip ou PowerArchiver, mais il peut
devenir tout de suite plus compliqué lorsque ce sérial correspond à une valeur hexadécimale
stockée dans une adresse mémoire...
Je rappelle que je ne peux en AUCUN CAS être tenu pour responsable d'un dommage survenant
sur votre PC lors de la mise en pratique de ce tuto.
Prérequis :
Vous aurez besoin de connaître le fonctionnement d'OllyDbg, et d'avoir de (très) bonnes
connnaissances en assembleur, sinon vous n'irez pas très loin.
Voici une introduction à OllyDbg par Crisanar :
http://deamonftp.free.fr/deamoncrack/Tuts/Crisanar/introOlly.htm
Pour l'assembleur, j'ai sélectionné deux cours très bien faits, accessibles aux débutants mais
proposant tout de même une approche assez complète.
Cours de Deamon :
http://deamonftp.free.fr/deamoncrack/index0.htm
Cours de Falcon :
http://xtx.free.fr/liens/tut/Assembleur%20par%20Falcon/Assembleur.html
Pour les API, j'ai sélectionné un cours qui propose une approche assez fouillée et bien vulgarisée:
Cours de Falcon :
http://xtx.free.fr/liens/tut/api/api.htm
Normalement vous n'avez besoin de rien de plus.
Outils :
Eusing Free Registry Cleaner 2.0
(
http://www.eusing.com/free_registry_cleaner/registry_cleaner.htm
)
• Peid 0.95 ou RDG Packer Detector 0.6.6 (au choix)
• Un débuggeur/désassembleur
: OllyDbg (1.10 ou 2.0)
• Le plugin CommandBar pour Olly
(
www.openrce.org/downloads/details/105/CommandBar )
• Un cerveau
:)
Les anciennes versions des logiciels proposés (Peid / RDG) marchent également. Pour Olly, je l'ai
fait avec la version 1.10. Tout ces logiciels sont trouvables rapidement dans
Google.
Sérial fishing
Eusing Free Registry Cleaner (EFRC) est un freeware assez utile qui sert à nettoyer votre
registre. Or, ce logiciel nous balance un nag au début qui nous nous demande de nous enregistrer,
et l'on remarque dans "Help" que l'on a un menu pour s'enregistrer. Je ne sais pas vous, mais moi
ça me dérange
(même si j'approuve ce concept, au contraire des sharewares…). Regardons donc
ce qui se passe si l'on veut s'enregistrer avec pour nom "Horgh" et pour sérial "123456".
Ou
On obtient une messagebox avec un message d'erreur. (Si vous avez une messagebox vide, c'est
parce que le fichier pour traduire le logiciel en français est mort. Remettez-le en anglais. J'ai
renvoyé le fichier corrigé à l'éditeur du soft :).
Remarquez aussi qu'il est signalé que le nom n'influence pas sur le sérial (je ne sais plus où).
Passons maintenant le soft sous Peid pour voir si il est packé :
C'est bon, nous avons de la chance, il n'est pas packé.
Placez le plugin CommandBar dans le dossier ou se trouve Olly, puis lancez notre debugger
préféré. Vous apercevez la barre en bas ?
Cette barre permet d'utiliser les commandes de SoftIce dans Olly. Elle va nous servir ici à poser
un breakpoint sur l'API MessageBoxA (la fonction qui appelle les Messagebox :).
En effet, vous avez remarquer que lorsque l'on veut s'enregistrer on obtient juste une
messagebox vide. Si l'on fait breaker Olly au moment où il appelle celle-ci, on va pouvoir
remonter jusqu'à l'instruction qui a décidé si notre sérial était bon ou pas. Je rappelle que l'on
recherche une routine de ce genre : CALL + TEST / CMP + SAUT CONDITIONNEL.
Comme il n'y a pas la string (bon, il y a, RES_Registration_Error, mais on ne l'a pas vue… :), nous
allons employer une autre méthode pour retrouver l'endroit où le sérial est vérifié.
Allez donc dans la CommandBar et mettez bpx MessageBoxA. Pourquoi bpx ? Parce que c'est la
commande qui permet de placer un breakpoint sur tous les calls qui font appel à l'API
MessageBoxA.
Vous avez donc ceci :
Faites entrée, coupez la fenêtre "Intermodular Calls" qui s'ouvre, retournez dans la fenêtre CPU,
et faites F9 pour lancez le programme.
Mettez "Horgh" comme nom, et "123456" comme sérial. Faites "OK".
Et là que se passe t'il? Olly breake au moment où il appelle la messagebox !
On va donc commencer à faire le chemin inverse pour retrouver comment est on arrivé à cet
endroit. Remontez les instructions une à une en gardant à l'œil le cadre sous le code pour voir si
des jumps nous font arriver à cet endroit. Arrêtez vous en 0048430A et regardez en bas :
On voit un "Jump from 00484302", mais ce n'est pas le bon, en effet, c'est celui qui est deux
lignes plus haut… Continuez donc à monter jusqu'au XOR EAX,EAX en 004842E6. On remarque
alors un deuxième saut. Pour y aller, click droit => Go to => JE FROM 00484284.
Bon, il n'y a rien d'intéressant non plus ici, alors continuons à monter.
Et là, regardez en bas : on arrive ici par 8 calls ! La solution ici, c'est de placer un BP sur les huit
calls, et de voir sur lequel le programme breake. Mais je suis gentil, je vais vous dire lequel nous
intéresse : c'est le deuxième, le CALL 004C560D. Faites click droit => Go To => Call from
004C560D. Arrivés là, vous continuer à remonter. Or, que voit-on en 004C55DB ? Une string
"RES_Registration_Error". IL semblerait donc que nous soyons sur la bonne voie.
Au dessus, on a aussi quelque chose qui ressemble à une routine de vérification de sérial (CALL /
TEST/ JNZ). Placez donc un Bp sur le CALL.
Faites F9, la messagebox s'affiche, refaites ok, et Olly breake sur notre CALL en 004C55BD. Il
est donc fort problable que nous ayons retrouver l'endroit ou le sérial est vérifié :).
Rentrez dedans avec F7. On remarque tout d'abord que EAX contient la string "123456". En
debuggant avec F8 ligne par ligne, nous arrivons à un premier CMP (il y en a 6 bout à bout) :
Ces CMP sont tout le temps suivis de sauts conditionnels. Il semblerait donc que le soft effectue
des tests à différents endroits de notre sérial. Analysons le code :
1 ) Premier contrôle
CMP EAX, 0A : EAX est égal à 6, c'est à dire au nombre de caractères que nous avons inscrits.
Le CMP compare donc le nombre de caractères de notre sérial à 10 (0Ah = 10d).
JNZ 004D5387 : Si ce n'est pas égal à 0, c'est à dire si EAX n'est pas égal à 10, saute vers le
XOR EAX, EAX qui mettra le registre à 0.
Nous voyons qu'avec notre sérial le JNZ saute. Pour continuer à suivre la procédure de test,
mettez le Z-flag à 1, ce qui empêchera le saut de s'effectuer. Modifiez les Flags en conséquence
pour les sauts suivants (ce ne sera pas toujours le Z).
2) Deuxième contrôle
XOR ECX,ECX
MOV CL,BYTE PTR DS:[EAX]
MOV EAX,ECX
EDX,DWORD PTR SS:[EBP-4]
MOVZX ESI,BYTE PTR DS:[EDX+4]
// met ECX à 0
// met le 1
er
caractère du sérial dans CL
// met la valeur de ECX (càd CL) dans EAX
// met la valeur EBP-4 (le sérial) de la stack dans EDX
// met la valeur du 5
e
caractère du sérial dans ESI (pour
// voir à quel caractère correspond EDX+.. , faites follow
// in dump sur le registre).
ADD EAX,ESI
// ajoute la valeur du caractère 1 et du caractère 5
SUB EAX,60
// résultat
60h
CMP EAX,8
// Compare EAX à 8
JLE 004D53B7 : Si EAX inférieur ou égal à 8, saute vers XOR. Le reste de la soustraction doit
donc être au minimun de 9 pour que nous passions le test avec succès. La somme des valeurs
ASCII de votre premier et 5
e
caractère doit donc être au moins égale à 69.
3) Troisième contrôle
MOV EAX,ECX
// met ECX dans EAX
Zgłoś jeśli naruszono regulamin