Muad'dib Keygen Crackme #1



- Afficher le bon serial à la place du msg d'erreur
- ré-écrire une routine de contrôle du serial (oui, je me fais chier)

Tutorial by ACiD BuRN [Immortal Descendants]





  њ      њ    -  -- A C i D B U R N - P R O D U C T i O N S -- - м   њ     њ
     А    м  А      м м  м       А мА          А м     м         олм   м А
  мллВпплллнмВлппплллнолнолллппплВмоВллпплллмАмВлн пм  олллпплллмАВллм олВм
  лллн АВллнллл Апппп ппп ллл А лллнллл  оллВАВлл А ллнолллн оллВ лллплмлллн
  ВллппплллнлллнА АВлнлллнллл А лллнлллпппллмоллл А лллолллппВллм лллн плллн
 АВллнА ллл ВллнА лллнлллАВлл Аолллнлллн млллолллнААВллАВллн олллнлллнА лллм
 олллнА лллолллнА лллоллВоллл АолллАВллнАолллолллн олллнлллнА лллнлллнА ллВпм
 олллнА лллолллнА лллоллВоллл Аолллоллл Аолллолллн олллнлллнААВлл ВллнА ллн
 оллВ АоллВпБллмммлллБллВолллммллБпВлллммллллпллллмВлллпВлБм олп АВллл олп
  п      пА  п    п    п       п          п         п   А    п      п  п
  њ      њ    -  -- A C i D B U R N - P R O D U C T i O N S --  -    њ     њ
                                SRT - CRO



Introduction:
Pour commencer, je fais rarement des cours en français, on va changer ça :)
Je pense bientôt écrire un cours sur le dernier Armadillo, en Français bien sûr :P
et je vais bientôt convertir tout mes tuts !!! donc voilà pour les cours en français,
finis de mails pour ça ok ?? :PP

Parlons de ce crackme, il faut faire un keygen, les keygens ça commence à me gonfler, on
va pas coder un keygen (qui d'ailleurs est très simple à faire) mais forcer le crackme
à afficher le bon serial à la place du message: "try again , Blablabla.."


utils nécessaires:  

	- Soft-ice (it r0x)
	- éditeur hexadécimal




Let's kick some ass =)


Bon, déjà on lance ce con de crackme, et on entre son nom: ACiD BuRN et un serial
à 2 francs: 0800
Ensuite dans Soft-ice (ctrl+d), on tape: Bpx hmemcpy
On click sur Register et on arrive dans Soft-ice.. F12 pour sortir dans dlls et dès 
qu'on est dans le crackme on commence à tracer.
On arrive assez vite à une routine qui contrôle le type de nom entré (minuscules,
majuscules, espaces, chiffres ...) mais il y a d'abord un check sur la longueur du nom:

025F:004010A3  83F804              CMP     EAX,04     <-- compare la taille du nom à 4
025F:004010A6  7304                JAE     004010AC   <-- ok si supérieur ou égal à 4
025F:004010A8  C9                  LEAVE
025F:004010A9  C21000              RET     0010

Apres ça, il y a le contrôle des caractères :

025F:004010AC  BA00000000          MOV     EDX,00000000
025F:004010B1  8A8200314000        MOV     AL,[EDX+00403100]
025F:004010B7  3C00                CMP     AL,00
025F:004010B9  7426                JZ      004010E1
025F:004010BB  3C20                CMP     AL,20
025F:004010BD  7408                JZ      004010C7
025F:004010BF  3C41                CMP     AL,41
025F:004010C1  7C07                JL      004010CA
025F:004010C3  3C5A                CMP     AL,5A
025F:004010C5  7F03                JG      004010CA
025F:004010C7  42                  INC     EDX
025F:004010C8  EBE7                JMP     004010B1
025F:004010CA  6A00                PUSH    00
025F:004010CC  687D304000          PUSH    0040307D
025F:004010D1  684D304000          PUSH    0040304D
025F:004010D6  6A00                PUSH    00
025F:004010D8  E8BD000000          CALL    USER32!MessageBoxA


Cette merde check si notre nom a des minuscules, majuscules, espaces ...
Si c'est pas ok, ça jump à 4010CA, et un message box nous dit d'enter que des majuscules
et espaces...
Merci, mais on avait compris ;)


Donc, on sort de Soft-ice, on mets: ACID BURN comme nom, et 0800 tjs pour le serial
et on y retourne. On trace et on tombe sur la comparaison finale:

025F:0040112D  68F6304000          PUSH    004030F6      <- d 4030f6 = fake serial
025F:00401132  6800314000          PUSH    00403100      <- d 403100 = bon serial
025F:00401137  E840000000          CALL    KERNEL32!lstrcmp  
025F:0040113C  83F800              CMP     EAX,00
025F:0040113F  7517                JNZ     00401158
025F:00401141  6A00                PUSH    00
025F:00401143  68D3304000          PUSH    004030D3   <- d 4030D3 = Good (titre de la msg box)
025F:00401148  6889304000          PUSH    00403089   <- d 403089 = Bon message qd tu as le serial
025F:0040114D  6A00                PUSH    00
025F:0040114F  E846000000          CALL    USER32!MessageBoxA
025F:00401154  C9                  LEAVE
025F:00401155  C21000              RET     0010
025F:00401158  6A00                PUSH    00
025F:0040115A  68EA304000          PUSH    004030EA   <- d 4030EA = Bad (titre de la msgbox)
025F:0040115F  68DD304000          PUSH    004030DD   <- d 4030DD = bad boy ;p pas le bon pass
025F:00401164  6A00                PUSH    00
025F:00401166  E82F000000          CALL    USER32!MessageBoxA



En résume, on voit une comparaison bon serial/mauvais serial exécuté par l'API
lstrcmp, qui compare des strings. On voit un CMP EAX,00 : si la comparaison est ok 
le serial est bon, donc EAX = 0 et on affiche le bon messagebox :)
Sinon, ça saute à la mauvaise box !!

Ok donc pour nous, ici :

025F:0040112D  68F6304000          PUSH    004030F6      <- d 4030f6 = fake serial
025F:00401132  6800314000          PUSH    00403100      <- d 403100 = bon serial


d 4030f6 nous donne: 0800
d 403100 nous donne: XZP]P[LKW

Le bon serial ok, mais c'est pas ça qu'on veut :)
On veut forcer le prog à montrer le bon serial à la place du message d'erreur :)
Pour cela, on voit que juste avant la msg box Bad serial il y a 2 push:

le caption du titre de la title bar = push 4030EA
le texte du message du msgbox  = push 4030DD

Il push ces merdes, et ensuite il affiche le message à la con !
Donc pour lui faire afficher le bon serial tu prends l'address du push 'bon serial' et tu la
copies à la place du push 'message comme quoi tu as foiré' !!

025F:0040115A  68EA304000          PUSH    004030EA 
025F:0040115F  68DD304000          PUSH    004030DD 
025F:00401164  6A00                PUSH    00
025F:00401166  E82F000000          CALL    USER32!MessageBoxA


cela devient:


025F:0040115A  68EA304000          PUSH    004030EA   
025F:0040115F  6800314000          PUSH    00403100   <-- push bon serial
025F:00401164  6A00                PUSH    00
025F:00401166  E82F000000          CALL    USER32!MessageBoxA


On a maintenant plus qu'à modifier physiquement notre crackme, et le bon pass apparaîtra
à la place de l'erreur :) et voilà notre super keygen pour branleurs :)
hehe, c'est rapide, efficace, et on se fatigue pas :P

on cherche donc dans l'exe: 68EA30400068DD304000 
on remplace dans l'exe par: 68EA3040006800314000

Tu saves le fichier, et tu lances, mets un serial en majuscules et goodie :))
Le good serial apparaît, Facile ....

Remarques on a toujours le titre : erreur code dans la msg box, rien ne vous empêche
de le changer en: Keygen ;)



Voilà c'était facile, je me fais chier là donc, je vais vous montrer comment contrôler 
si le serial est valide ou pas, mais d'une autre manière (simple aussi).
On va donc recoder le check du serial dans Soft-ice pour s'occuper,
ça va prendre 10 secs, mais bon ;)
C'est juste pour montrer qu'on peut faire bcp de choses en fait....

				notre routine de base:


025F:0040112D  68F6304000          PUSH    004030F6      <- d 4030f6 = fake serial
025F:00401132  6800314000          PUSH    00403100      <- d 403100 = bon serial
025F:00401137  E840000000          CALL    KERNEL32!lstrcmp  
025F:0040113C  83F800              CMP     EAX,00
025F:0040113F  7517                JNZ     00401158
025F:00401141  6A00                PUSH    00
025F:00401143  68D3304000          PUSH    004030D3   <- d 4030D3 = Good (titre de la msg box)
025F:00401148  6889304000          PUSH    00403089   <- d 403089 = Bon message qd tu as le serial
025F:0040114D  6A00                PUSH    00
025F:0040114F  E846000000          CALL    USER32!MessageBoxA
025F:00401154  C9                  LEAVE
025F:00401155  C21000              RET     0010
025F:00401158  6A00                PUSH    00
025F:0040115A  68EA304000          PUSH    004030EA   <- d 4030EA = Bad (titre de la msgbox)
025F:0040115F  68DD304000          PUSH    004030DD   <- d 4030DD = bad boy ;p pas le bon pass
025F:00401164  6A00                PUSH    00
025F:00401166  E82F000000          CALL    USER32!MessageBoxA


Comparaison grâce à l'api lstrcmp.
On va transcrire ça en :


025F:0040112D  A1F6304000          MOV     EAX,[004030F6]
025F:00401132  8B1500314000        MOV     EDX,[00403100]
025F:00401138  3BC2                CMP     EAX,EDX
025F:0040113A  7405                JZ      00401141
025F:0040113C  EB1A                JMP     00401158
025F:0040113E  90                  NOP
025F:0040113F  90                  NOP
025F:00401140  90                  NOP
025F:00401141  6A00                PUSH    00
025F:00401143  68D3304000          PUSH    004030D3
025F:00401148  6889304000          PUSH    00403089
025F:0040114D  6A00                PUSH    00
025F:0040114F  E846000000          CALL    USER32!MessageBoxA
025F:00401154  C9                  LEAVE
025F:00401155  C21000              RET     0010
025F:00401158  6A00                PUSH    00
025F:0040115A  68EA304000          PUSH    004030EA
025F:0040115F  68DD304000          PUSH    004030DD
025F:00401164  6A00                PUSH    00
025F:00401166  E82F000000          CALL    USER32!MessageBoxA


Ceci fait exactement la même chose, mais n'utilise pas d'API pour comparer.
On mets en EAX: l'adresse du serial entré, et en EDX le bon serial.
On les compare via : CMP EAX, EDX
ensuite un saut conditionnel à la con et un Jump...
Les nop n'étaient pas utile, mais ça fait plus clean ;)
Voilà, le prog contrôle si le serial est valide d'une autre manière, ça sert à
rien, c'était juste pour montrer ce qu'on peut faire avec de l'imagination, hehe
comme les messages box, on peut en ajouter dans un programme aussi, il suffit
de mettre les bons paramètres (les push)...


Les mots de la fin:


Bref, j'espère que ce cours vous a plus et que vous avez appris une ou deux petites choses.
Bien sûr, le cours était destiné aux débutants, donc tous les crackers "avancés" ne vous
plaignent pas ;) 
Et lisez mon cours sur cdilla si ce n'est pas déjà fait :p

Pour les questions et autres commentaires :
[email protected] ou [email protected]

Tous mes cours sont disponibles ici: http://acidburn2000.cjb.net


Greetings: 
group greetings: ID - ECLiPSE - CiA - ODT - EXEC - TiTaNe - PWA - PC - UCF- CORE - CC

Also greetingz to: (no specific order)

R!SC, ^INFeRNo^, AB4DS, Cyber Blade, Klefz, , Volatility, TORN@DO, T4D
Jeff, [Virus], JaNe , Appbusta , Duelist , tKC , BuLLeT , Lucifer48 , 
MiZ , DnNuke , Bjanes , Skymarshall , afkayas , elmopio , SiFLyiNG , 
Fire Worx , CrackZ , neural_en  , WarezPup , _y , SiONIDE , SKORPIEN
Lazarus , Eternal_Bliss , Magic Raphoun , DEZM , Bisoux , Carpathia ,
K17 , theMc , noos , Xmen , TeeJi , JB007 , Arobas , T0AD ,ytc , Kwai_lo ,
Killer_3K, TaMaMBoLo , gizmo , Gota , ExtaBrain , Alpine , WarezPup, 
zoltan , [yAtes], TarGon , Icecream , Punkguy2 , Sortof, TRDdonjuan,
Lord Soth, Judged, G-Rom, Quantico, Christal, psike, Leo0n, Albator,
+Spath, +Frog's Print, toutim et tous ceux que je connais mais que j'ai oublie
 les nicks ;p desole ...


Copyright (c) ACiD BuRN and the Immortal Descendants.

		
				http://www.immortaldescendants.com/




Copyright 1999 ACiD BuRN and the Immortal Descendants