Muad'dib Keygen Crackme #1


          - Afficher le bon serial a la place du msg d'erreur

- re ecrire une routine de controle 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 francais , on va changer ca :)
Je pense bientot ecrire un cour sur le dernier armadillo en Francais bien sur :P
et je vais bientot convertir tout mes tuts !!! donc voila ppur les cours en francais
finis de mails pour ca ok ?? :PP

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


utils nescessaires:  

	- soft ice (it r0x)
	- editeur hexadecimal




Let's kick some ass =)


Bon , deja on lance ce con de crackme , et on entre son nom: ACiD BuRN et un serial
a 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 des 
qu'on est dans le crackme on commence a tracer.
On arrive assez vite a une routine qui controle le type de nom entree (miniscules,
majuscules , spaces , chiffres ...) mais il y a d'abord un check sur la longeur du nom:

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

Apres ca , il y a le control des caracteres :

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 , minuscules , spaces ...
Si c pas ok , ca jump a 4010CA , et un message box nous dis d'enter que des majuscules
et spaces...
Merci , mais on avait compris ;)


Donc , on sort de soft ice , on met: ACID BURN comme nom , et 0800 tjs pour le serial
et on y retourne.on trace et on tombe sur la comparaison final:

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 resume , on voit une comparaison bon serial /  mauvais serial execute 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 , ca saute a 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 pas ca qu'on veut :)
on veut forcer le prog a montrer le bon serial a 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 a la con !
donc pour le faire afficher le bon serial tu prends l'address du push 'bon serial' et tu la
copies a la place du push 'message comme quoi tu as foire' !!

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'a midifier physiquement notre crackme , et le bon pass apparaitra
a la place de l'erreur :) et voila notre super keygen pour branleurs :)
hehe , c 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, met un serial en majuscules et goodie :))
le good serial apparait , Facile ....

remarques on a toujours le titre : erreur code dans la msg box , rien ne vous empeche
de le changer en: Keygen ;)



voila c'etais facile , je me fais chier la donc , je vais vous montrer comme controler 
si le serial est valid ou pas , mais d'une autre manier (simple aussi).
on va donc recoder le check du serial dans soft ice pour s'occuper
ca vas prendre 10 secs , mais bon ;)
C'est juste pour montrer que 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


Compaison grace a l'api lstrcmp.
on va transcrire ca 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 fais exactement la meme chose , mais n'utilise pas d'API pour comparer
on met en EAX: l'addresse du serial entre , et en EDX le bon serial.
on les compare via : CMP EAX, EDX
ensuite un saut conditionel a la con et un Jump...
Les nop n'etaient pas utile , mais ca fais plus clean ;)
Voila , le prog controle si le serial est valide d'une autre maniere, ca sert a
rien , c'etais 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 paramettres (les push)...


Les mots de la fin:


Bref , j'espere que ce cour vous a plus et que vous avez apris une ou deux petites choses.
Bien sur , le cour etait destine aux debutants , donc tous les crackers "avances" ne vous
plaigne pas ;) 
et lisez mon cour sur cdilla si ce n'est pas deja fais :p

Pour les questions et autres commentaires :
ACiD_BuRN@nema.com ou acid2600@hotmail.com

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