Tutorial Crack-me 3 de Crudd

Par SOM'R

20 juillet 2003 - 26 août 2003




Bonjour à tous c'est mon premier Tut alors soyez indulgent...

On va s'attaquer aujourd'hui au crack-me de Crudd

OUTILS utilisés

HexDecCharEditor ou tout autre éditeur Héxa
WinDasm 9 et 8.9
ResHack
ProcDump
Et le crack-me
Des connaissances variés(CCA, rajout de section et lib compressé en Aspack,Meltice)

Nota

La notion de GoodBoy dans ce tutorial correspond à la routine affichant ou nous amenant vers le message disant que nous avons réussi à le cracké

De même la notion de BadBoy correspond à la routine affichant ou nous amenant vers le message disant que nous n'avons cracké le programme

On va broyer du Crack-me

Extrait de son fichier Instructions

Make the "UNREGISTERED" at the top Say "REGESTERED"(or whutever you see fit)

Level One:

A disabled menu item with a message box to patch away
A normal CD-Check

Level Two:

A disabled menuitem but a bit harder :)
A CD-Check again a bit harder(no string refs and a few other tricks)
An Anti-SI Serial number, and using frogsice doesnt teach you anything :P

Level Three

All the same as above but in a packed dll, how you deal with the packed file is up to you(whether you unpack the dll and patch, or write a mem patch) but try to learn something.
A Reverse Me, shouldnt be to difficult

En clair tu prend ton éditeur Héxa, tu cherches la chaine de texte et tu vires UN devant UN REGISTRED



Avant




Après


Tu remplaces le UN par des espaces (En Code ASCII espace=20) si tu met des 00 à la place de Un le crack-me affiche des trucs bizarres...
Au passage tu remarques des SICE et NTICE au dessus, bon bah tant qu'on y ait on remplace çà par SOMR et SOM'R ;-)
En enregistre et Hop on lance le programme...
Et la miracle dans la barre des titres et tout autre pop-up on est REGISTERED de plus la protection ANTI-SOFTICE de niveau deux et trois à disparu c'était tellement facile que s'en ai désespérant... Heureusement qu'il nous dit de ne pas utiliser frogice on aurait perdu du temps à le lancé alors qu'un petit patch et plus de protection....

C'est parti pour le Level One

Il faut faire apparaître le menu enable me
Donc on prend ResHack et on regarde ce que le programme à dans le ventre...
Tu vas dans menu et à coté de "MENUITEM "&Enable Me", 4," tu vois ça GRAYED
Bon c'est marrant, on va l'enlever sans oublier la virgule après le 4, puis appuyez sur compiler et on va voir ce que donne...
Miracle le bouton est apparu c'était dur...
Sauf que quand on clique sur le bouton un Popup apparaît et nous dis qu'il faut cracké le programme pour que ce soit complet
Bon on s'exécute...
On prend WinDasm on regarde les SDR et on voit pas le message du popup mais on voit Level 1 enable me passed.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004013EB(C)
|
* Possible StringData Ref from Data Obj ->"Level 1 Enable me passed"
|
:00401402    6850324000            push 00403250
:00401407    FF3590324000       push dword ptr [00403290]

Il est appellé par un saut conditionnel à l'adresse 004013EB
Allons voir ce qui à dans le coin...

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004013C9(C)
|
:004013EB    7415             je 00401402
:004013ED    6A00           push 00000000

On va poser un Breakpoint sur le je, CTRL+L puis SHIFT+F12 on tape 004013EB , ok, puis F2 sur la ligne

On lance en appuyant sur Run

On clique sur Enable Me et hop là WDSAM break donc là pas trop dur on va changer le je en jmp et il ira toujours vers le bon message...

On note l'adresse en bas de WDSAM ici 7EB. On lance l'éditeur CTRL+T on tape 7EB puis on remplace 74 par EB et voila le tour est joué

 

Dans un second temps il faut faire accepter un Cd au programme....

 

Il nous dit Insert your Blabla on regarde les SDR avec Windasm

Et juste au dessus qu'est que l'on voit :

 

* Reference To: KERNEL32.GetDriveTypeA, Ord:00F0h

|

:00401424     E873050000              Call 0040199C

:00401429     83F805                     cmp eax, 00000005

:0040142C     7412                         je 00401440

* Possible StringData Ref from Data Obj ->"Please insert your Crudd Me 3.0 "

->"CD."

|

:0040142E     680A324000           push 0040320A

:00401433     FF3590324000        push dword ptr [00403290]

 

Une référence à GetDriveTypeA autrement dit il regarde ce qui y a dans le lecteur de CD-ROM car le test en dessous compare eax (ce que l'API à renvoyé) avec 5 (donc CD-ROM)

Puis un petit saut vers le message GOODBOY si eax=5 bon on peut réfléchir sur la manière à employer.

 

Soit on supprime le call et on remplace le cmp eax,00000005 par mov eax,00000005 et là on émule le bon CD

Soit on remplace le JE par un JMP et il ira toujours vers le bon message

 

Le choix en fait se situe dans le type de programme, dans un jeux les références au CD sont en générale varié et supprimé le Check du CD rendra le programme plus rapide.

Ici c'est un crack-me (et étant partisan du moindre effort ;-) ) JMP suffira.

On remplace à l'adresse 82C 74 par EB

Pour l'autre solution on aurait Noppé le Call et remplacé cmp par mov c'est à dire en Héxa 83 par B8

On serait donc passé de E87305000083F805 à 909090B805000000

 

Voilà Level One fumé... Voyons ce que nous réserve la suite...

 

 

Youpi je suis au Level Two

 

Il faut refaire pareil qu'au Level one sauf que il y a un contrôle de Serial qui a été Anti-SI...

Problème le Enable me 2 n'est pas Grayed avec Reshack donc on réfléchis un peu et on se dit si il est pas grisé c'est qu'il est désactivé

Donc on va le réactivé allez c'est parti...

 

On reprend Windasm et on voit dans les SDR "Enable Me 2" on pointe sur ce qui a au tour...

 

* Possible Ref to Menu: DICK, Item: "Enable Me 2"

|

:004010E8     6A06                             push 00000006

:004010EA     FF356C324000            push dword ptr [0040326C]

* Reference To: USER32.EnableMenuItem, Ord:00B4h

|

:004010F0     E841080000                   Call 00401936

C'est marrant on voit un Call faisant référence à EnableMenuItem si on le virait pour voir comme çà...

On remplace avec l'éditeur Héxa à l'adresse 4F0   E841080000 par 9090909090

Et comme de par hasard le Enable Me 2 est activé...

 

Autre façon de faire

On remarque un :004010E6 6A01 push 00000001

Juste avant le Enable Me 2 donc si on le met a 0 donc 6A01 en 6A00 a l'adresse 4E6 le menu est activé aussi...

Mais il ne nous affiche pas de texte comme quoi nous avons réussi or dans les ressources à l'adresse 875 il existe bien un message

Donc on va regarder avec Windasm ou il fait appel au message en continuant la recherche d'un 0000006

Et on tombe sur ça

:00401455     6683F806                  cmp ax, 0006

:00401459     0F8583000000           jne 004014E2

:0040145F     E8BD030000             call 00401821

:00401464     EB0A                         jmp 00401470<= Donc allons en 00401470

:00401466     47                               inc edi

:00401467     6F                              outsd

:00401468     6F                              outsd

 

:00040146F 00EB add bl, ch

:00401471 1D2E202045 sbb eax, 4520202E

Sauf que l'adresse 00401470 n'est pas valide en lançant le debugger et en posant un BP sur jmp 00401470 on s'aperçoit(Mode Pas à Pas) qu'il effectue bien le saut et que il exécute l'instruction comme un saut... En fait il s'agit d'une protection CCA (Code Changeant d'Apparence)

 

 

 

Bon donc allons regardez le code en 0040148F

 

:0040148F     6A00                     push 00000000

:00401491     A066144000         mov al, byte ptr [00401466]<=Good Job

:00401496     660FB6C0             movzx ax, al

:0040149A     6650                     push ax

:0040149C     6A00                     push 00000000

:0040149E     A094324000         mov al, byte ptr [00403294]<=Du vide

:004014A3     660FB6C0           movzx ax, al

:004014A7     6650                     push ax

* Reference To: KERNEL32.lstrcpyA, Ord:02DCh

|

:004014A9     E812050000         Call 004019C0

:004014AE     6A00                    push 00000000

:004014B0     A072144000         mov al, byte ptr [00401472]<=Message car il renvoie vers l'adresse 875

:004014B5     660FB6C0             movzx ax, al

:004014B9     6650                      push ax

:004014BB     6A00                    push 00000000

:004014BD     A094324000       mov al, byte ptr [00403294]<=Du vide

:004014C2     660FB6C0           movzx ax, al

:004014C6     6650                     push ax

* Reference To: KERNEL32.lstrcatA, Ord:02D3h

|

:004014C8     E8ED040000        Call 004019BA

* Possible Reference to Dialog:

|

:004014CD     6894324000         push 00403294

:004014D2     FF3590324000     push dword ptr [00403290]

* Reference To: USER32.SetWindowTextA, Ord:0259h

|

:004014D8     E895040000         Call 00401972

:004014DD     E98A020000       jmp 0040176C

 

Analysons la situations il pousse le bon message et le remplace par du vide deux fois deux suite donc il faut remplacer le code de telle façon qu'il nous affiche le bon message...

 

Nota tout les codes compilé on été trouvé grâce à la fonction patch code de Windasm

 

Donc comme LSTRCPYA prend les deux dernières valeur pousser dans la pile on s'arranger pour qu'il y est le minimum de changement...

Donc en 00401491 on va remplacer le mov(A0) par un push(68) puis ensuite on va pousser du vide donc en 00401496 on va remplacer par  6894324000 après on va directement à l'api donc JMP 004014A9 soit EB0C.

De même juste après le call on peut s'économiser un push(6A00) mais minimum de  changement donc on va le laisser donc en 004014B0 on va changer le A0 en 68 puis on refait la même manipulation en poussant du vide (6894324000) puis direct à l'API JMP 004014C8 soit encore un EB0C.

 

Récapitulatif : 

 

Adresse 891 A0=>68

              896 660FB6C066=>6894324000

              89B 506A=>EB0C

              8B0 A0=>68

              8B5 660FB6C066=>6894324000

              8BA 506A=>EB0C

 

Et la on a le message et l'Enable Me 2 est complètement fini.

 

Un peu plus bas on voit le même truc pour le Enable Me 3 on va en profité pour faire de même...

 

:004010F5 6A01 push 00000001

* Possible Ref to Menu: DICK, Item: "Enable Me 3"

|

:004010F7 6A09 push 00000009

:004010F9 FF356C324000 push dword ptr [0040326C]

* Reference To: USER32.EnableMenuItem, Ord:00B4h

|

:004010FF E832080000 Call 00401936

Donc à l'offset 4FF on a E832080000 et ça va devenir 9090909090

Ou on remplace le Push...

Et là le Enable Me 3 contre toute attente n'apparaît pas... :-(

Bon bah on verra quand on serra au niveau trois comment on va faire...

 

Passons au CD Check 2

Regardons combien de fois le programme fait référence à l'API GetDriveTypeA

Donc il fait référence trois fois comme c'est curieux il y a trois niveaux...

On va poser un breakpoint sur les autres références la première étant pour le niveau un on la vue toute à l'heure...

Et là on est grave énervé car le programme il breake pas :-[

Bon c'est pas grave on vas regarder d'un peu plus prés le code...

 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:00401538(C)

|

:0040154C     6A00                              push 00000000

* Reference To: KERNEL32.GetDriveTypeA, Ord:00F0h

|

:0040154E     E849040000                   Call 0040199C

:00401553     83F805                           cmp eax, 00000005

:00401556     75E2                               jne 0040153A

:00401558     6815154000                  push 00401515

:0040155D     FF3590324000             push dword ptr [00403290]

Et on s'aperçoit qu'il y a un test au dessus du Call GetDriveTypeA donc on va voir ce fameux test...

:00401535     83F801                           cmp eax, 00000001

:00401538     7412                                je 0040154C

Un JE classique on va le remplacer en JMP donc en 938 avec l'éditeur Héxa on remplace 74 par EB pour ceux qui n'aurait pas suivis...

On relance et voit maintenant que le programme accède à l'API bien... En dessous un autre test en JNE cette fois-ci on va le remplacer par un JE

Donc en 956 on remplace 75 par 74 et voilà il nous dit que notre CD est bon...

 

Passons au Serial

Deux solutions s'offre à nous :

Soit trouver un Serial valide pour notre Nicks

Ou fumer le proggy pour qu'il accepte n'importe quelle Serial

 

De toutes façon on commence comme çà...

On tape son surnom pour moi SOM'R ;-)

Et un serial bidon du style 123 (Nous irons aux bois, à bon c'est pas ça, désolé...)

Et il nous tout naturellement Nope, Wrong Serial rassurez vous plus pour longtemps

On regarde un peu le programme...

 

* Reference To: USER32.GetWindowTextA, Ord:015Bh

|

:00401898 E8A5000000 Call 00401942<= On retourne notre nom

:0040189D A25C354000 mov byte ptr [0040355C], al

:004018A2 8D1D94344000 lea ebx, dword ptr [00403494]

:004018A8 0FB60D5C354000 movzx ecx, byte ptr [0040355C]<= On retourne le nombre de Chars

:004018AF 33FF xor edi, edi<= On remet les compteurs à zéro

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:004018BD(C)

|

:004018B1 0FB603 movzx eax, byte ptr [ebx]<= On retourne un character en ASCII

:004018B4 F7E1 mul ecx<= On multiplie ce charactere avec ca position

:004018B6 03F8 add edi, eax<= On ajoute le résultat avec le Char ASCII correspondant

:004018B8 43 inc ebx<= On décale la position des Char

:004018B9 49 dec ecx<= On décrémente ecx

:004018BA 83F900 cmp ecx, 00000000<= On compare pour savoir si on est au dernier char

:004018BD 75F2 jne 004018B1<= Si ecx=0 on saute si non on continue

:004018BF 57 push edi

:004018C0 6A12 push 00000012

:004018C2 6834354000 push 00403534

:004018C7 FF3584324000 push dword ptr [00403284]

* Reference To: USER32.GetWindowTextA, Ord:015Bh

|

:004018CD E870000000 Call 00401942<= On retourne notre serial

:004018D2 8BC8 mov ecx, eax

:004018D4 8D3D34354000 lea edi, dword ptr [00403534]

:004018DA 33DB xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:004018E8(C)

|

:004018DC 0FB607 movzx eax, byte ptr [edi]<= En fait on fait exactement les même manipulations avec des registres différents

:004018DF F7E1 mul ecx

:004018E1 03D8 add ebx, eax

:004018E3 47 inc edi

:004018E4 49 dec ecx

:004018E5 83F900 cmp ecx, 00000000

:004018E8 75F2 jne 004018DC<=fin de la boucle

:004018EA 58 pop eax

:004018EB 3BC3 cmp eax, ebx<=comparaison des deux codes retournés

:004018ED 7517 jne 00401906<=Si deux codes identiques alors pas de saut et GOODBOY

Bon en fait c'est tellement con de trouver son Serial qu'aucune modification s'impose

Si vous avez pas tout suivis un petit résumé...

On prend le Nicks on fait des manipulations dessus et on obtient un code

On prend le serial et on fait les même manipulations pour trouver un autre code

On les compare... Donc notre serial c'est notre Nicks c'est fou non... ;-)

Pour les amoureux des patchs il suffit de nopper le JNE en 8ED de remplacé 7517 par 9090

Et voila c'est fini pour le niveau deux...

 

La classe le Level Three

 

Bon la c'est trop dure vous vous débrouillez tout seul !-(

Mais je rigole bien sure je suis pas comme ça....!!

 

 

 

Bon il est sympa il nous dit que le reste est dans une dll...

Comme y en a qu'une qui est fourni avec le prog ça va pas être trop dure de trouver laquelle... And the Winner is CM3.dll

Ben oui surpris :-?

On va décompiler la librairie avec WinDasm pour voir...

 

Number of Objects = 0006 (dec), Imagebase = 10000000h

Object01: .text       RVA: 00001000 Offset: 00000400 Size: 00000400 Flags: 60000040
Object02: .rdata     RVA: 00002000 Offset: 00000800 Size: 00000200 Flags: C0000040
Object03: .data      RVA: 00003000 Offset: 00000A00 Size: 00000200 Flags: C0000040
Object04: .reloc     RVA: 00004000 Offset: 00000C00 Size: 00000200 Flags: C0000040
Object05: .
aspack  RVA: 00005000 Offset: 00000E00 Size: 00001200 Flags: C0000040
Object06: .data      RVA: 00007000 Offset: 00002000 Size: 00000000 Flags: C0000040

 

Il mentais pas Crudd quand il disais que ça dll était cryptés bon c'est comme même du Aspack :-(

Va falloir réussir à obtenir une source lisible et c'est là que ça se complique.......

Euh la je suis désolé après deux heures de bataille avec la dll j'arrive pas à la décompresser si quelqu'un y arrive qu'il m'envoie un mail

Et vous voyez que j'était comme çà... ;-(

 

Attention la partie trois du crack-me plante sous Xp... Alors on va gentiment passé sous un Win9x

 

Allez on va comme continuer

Donc pour le enable-me 3 deux références normalement la première a été patché en même temps que l'Enable Me 2

Et la deuxième référence nous avons cette portion de code.

* Possible Ref to Menu: DICK, Item: "Enable Me 3"
|
:004011B6      6A09                         push 00000009
:004011B8      FF356C324000        push dword ptr [0040326C]
:004011BE      FFD0                        call eax
:004011C0      837D0C02               cmp dword ptr [ebp+0C], 00000002
:004011C4      750C                        jne 004011D2
:004011C6      6A00                        push 00000000

 

En posant un BP sur le call eax on s'aperçoit qu'il appelle en fait l'API EnableMenuItem

Donc assez simple on va virer le call en le Noppant, donc à l'adresse 05BE on va remplacer FFD0 par 9090

On relance et quand on clique sur le Enable-Me 3 le crack me affiche une belle MsgBox et on s'aperçoit qu'elle est dans la lib compressé

Donc on va essayer de décompresser la Lib avec Stripper (Merci Oliver the One, par contre désolé les autres le log est en Chinois...)

 

Donc une fois décompressé on voit dans le PE qu'il fait appelle à l'API  MessageBoxA donc on va dans le menu des fonctions importées et on click sur MessageBoxA, le premier correspond au Reverse Me, les autres n'étant pas explicites on va poser un BP sur les Apis pour voir laquelle correspond à l'enable me.

 

Donc on lance l'exe, on appuie sur Run ensuite on clique sur la dll cm3.dll il nous demande de la désassemblé on accepte...

On lance le menu des Imp Fn et on clique sur MessageBoxA on appuie sur F2 sur toutes les occurrences sauf celle relative au reverse me.

On met le focus sur l'exe on clique sur Enable Me 3 la Windasm break en 10001285 donc on enlève le BP et on regarde le code autour...

 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000123E(U)
|
:10001270     3D66060000     cmp eax, 00000666
<= Comparaison avec 666

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001253(C)
|
:10001275     7415          je 1000128C
<= Saut vers GoodBoy ;-)
:10001277     6A00         push 00000000

* Possible StringData Ref from Data Obj ->"Crudd Me 3.0"
|
:10001279     6813300010          push 10003013
:1000127E     6840120010          push 10001240
:10001283     6A00                     push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:10001285      E81A000000         Call 100012A4
<= Appel de Bad Boy
:1000128A     EB0D                     jmp 10001299

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001275(C)
|

* Possible StringData Ref from Data Obj ->"Level 3 Enable Me passed"
|
:1000128C     6824310010             push 10003124
:10001291      FF7508                    push [ebp+08]

Bon vous l'avez compris on va forcez le JE en 10001275 en JMP et on auras toujours le bon Msg

Donc en 675 on va remplacer 74 par EB

Et voilou il nous dit Level 3 Enable Me passed

 

On se lance dans le Cd-check

 

Il nous dit quand on le lance

 

Pas bien donc on va regarder le code de la librairie...

 

Les SDR ne donne rien de satisfaisant donc on va se retrancher sur l'Api GetDriveTypeA sauf qu'elle n'est pas présente non plus 8-(

Bon on va rechercher cmp eax, 00000005 qui est l'instruction qui va de paire avec cette Api... Et oh miracle le code n'est présent qu'une seule fois dans la dll on va poser un BP dessus pour être sure et sur le call juste avant...

:10001068     E855020000         Call 100012C2
:1000106D     6A00                    push 00000000
:1000106F     FFD0                    call eax
<= Ici
:10001071     83F805                 cmp eax, 00000005
<= et là
:10001074     7433                     je 100010A9

 

Et si vous avez coché la case Enable Documented API Details vous avez pu remarquez en première ligne du call 

API UINT Arg00 = GetDriveTypeA(Arg01)

Curieux le call n'est autre qu'un GetDriveTypeA bon là on le fait comme on veut pour être tranquille moi je vais patcher le saut juste après en le forçant donc en 474 on va remplacer le 74 en EB et on est tranquille il ira toujours vers GoodBoy sauf que une fois que l'on vérifie  on est gratifié d'un joli : 

 

Avec l'aide de cette fenêtre il nous dit qu'il faut allez voir du coté de l'adresse 100010A9

Allons-y...

:100010A9      0000                      add byte ptr [eax], al<=Pas bien en effet il impossible de mettre une partie du registre dans lui-même
:100010AB      6A00                     push 00000000
:100010AD      6A00                     push 00000000
:100010AF      6A00                     push 00000000
:100010B1      6A00                      push 00000000
:100010B3      6A00                      push 00000000
:100010B5      A0AA100010        mov al, byte ptr [100010AA]
:100010BA     660FB6C0             movzx ax, al
:100010BE     6650                       push ax
:100010C0     6A0C                     push 0000000C
:100010C2     68A9100010          push 100010A9
:100010C7     6A00                      push 00000000

* Reference To: KERNEL32.GetVolumeInformationA, Ord:0162h
|
:100010C9     E8FA010000         Call 100012C8
:100010CE     68AA100010         push 100010AA
:100010D3     68A9100010         push 100010A9

* Reference To: KERNEL32.lstrcmpA, Ord:02D6h
|
:100010D8     E8F1010000         Call 100012CE
:100010DD     7597                     jne 10001076
<=Saut vers BadBoy

Donc on va remplacer ça par un Nop, donc on va changer le 0000 à l'adresse 4A9 en 9090

Met là on a toujours le message d'erreur donc on voit un saut juste après qu'y nous renvoie vers BadBoy donc soit on le Noppe soit on le remplace en JE ... Le plus propre étant de le Noppé...

Donc on remplace à l'adresse 4DD le 7597 en 9090.

Et voila le cd-check est fini... Il n'y a pas de message nous disant que nous avons réussi mais on peut faire du RE pour qu'il le fasse...

 

Passons au Serial...

Bon si vous avez installez SI vous avez pu remarquez que quand vous cliquez sur Check-It vous avez un message avec écrit Bad Bad cracker

De même que si vous avez regardez un peu avec l'éditeur Hexadécimal vous avez pu revoir les fameux //SICE //NTICE qui est en fait une protection meltice bon on va apprendre à le patcher proprement plutôt qu'en remplaçant SICE par SOMR et NTICE par SOM'R ;-)

Vous n'êtes pas sans savoir que cette protection utilise la fonction CreateFileA donc une petite recherche dans la librairie et

* Possible StringData Ref from Data Obj ->"\\.\SICE"
|
:100010FA 6800300010 push 10003000

* Reference To: KERNEL32.CreateFileA, Ord:0032h
|
:100010FF E8B2010000 Call 100012B6
:10001104 83F8FF cmp eax, FFFFFFFF
:10001107 7523 jne 1000112C
<=BadBoy
:10001109 6A00 push 00000000
:1000110B 6880000000 push 00000080
:10001110 6A03 push 00000003
:10001112 6A00 push 00000000
:10001114 6A03 push 00000003
:10001116 68000000C0 push C0000000

* Possible StringData Ref from Data Obj ->"\\.\NTICE"
|
:1000111B 6809300010 push 10003009

* Reference To: KERNEL32.CreateFileA, Ord:0032h
|
:10001120 E891010000 Call 100012B6
:10001125 83F8FF cmp eax, FFFFFFFF
:10001128 7502 jne 1000112C
<=BadBoy

 

Bon on remarque que après les deux routines le programme saute vers la même adresse qui correspond au message BadBoy...

Donc on va noppé les deux sauts et on est tranquille donc en 507 et 528 on va remplacer les 7523 et 7502 en 9090.

Voilà qui est mieux...

 

Maintenant place au Serial lui même...

On rentre un nom et un serial par exemple SOMR et 12345

On pose des BP sur les GetWindowsTextA le premier fait des manipulations sur le Nom et le 2ieme sur le Serial une comparaison et hop GoodBoy ou BadBoy...

 

Rentrons dans la logique de calcul pour faire un keygen ...

 

:10001177         E822010000         Call 1000129E
:1000117C         A240320010       mov byte ptr [10003240], al
<=Nombre de caractère de notre nom soit N

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001151(C)
|
:10001181         8D1D78310010 l          lea ebx, dword ptr [10003178]
<= notre nom dans EBX
:10001187         0FB60D40320010        movzx ecx, byte ptr [10003240]
:1000118E         33FF                             xor edi, edi
<= on nettoie edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000119C(C)
|
:10001190         0FB603                 movzx eax, byte ptr [ebx]
<=on pousse le Nieme caractère sous son code ASCII
:10001193         F7E1                     mul ecx
<=on multiplie le Nième code par N-position (par exemple pour le caractère à la première position N=4 pour SOMR ECX=4-0=0)
:10001195         03F8                     add edi, eax
<=EDI plus le résultat de l'opération précédente
:10001197         43                         inc ebx
<=On décale les caractères du Name
:10001198         49                        dec ecx
<=On soustrait 1 au position
:10001199         83F900                cmp ecx, 00000000
<=Compare ECX à 0
:1000119C         75F2                    jne 10001190
<=Si tout les caractères sont passé à la moulinette alors on saute pas
:1000119E         81C766060000    add edi, 00000666
<=On ajoute au  résultat final 666
:100011A4         57                        push edi
<=Pousse le code dans la pile
:100011A5         6A12                   push 00000012
:100011A7         6818320010       push 10003218
:100011AC         FF750C             push [ebp+0C]

 

* Reference To: USER32.GetWindowTextA, Ord:015Bh
|
:100011AF     E8EA000000         Call 1000129E
:100011B4     8BC8                       mov ecx, eax
:100011B6     8D3D18320010      lea edi, dword ptr [10003218]
<= notre serial dans edi avec le nombre de caractère dans eax
:100011BC     33DB                     xor ebx, ebx
<=on nettoie ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100011CA(C)
|
:100011BE     0FB607                 movzx eax, byte ptr [edi]
<=on pousse le Nieme caractère sous son code ASCII
:100011C1     F7E1                     mul ecx
<=on multiplie le Nième code par N-position (par exemple pour le caractère à la première position N=5 pour 12345 ECX=5-0=0)
:100011C3     03D8                    add ebx, eax
<=EBX plus le résultat de l'opération précédente
:100011C5     47                         inc edi
<=On décale les caractères du Serial
:100011C6     49                         dec ecx
<=On soustrait 1 au position
:100011C7     83F900                cmp ecx, 00000000
<=Compare ECX à 0
:100011CA    75F2                    jne 100011BE
<=Si tout les caractères sont passé à la moulinette alors on saute pas
:100011CC    53                         push ebx
<=Pousse le code dans la pile
:100011CD    6A00                   push 00000000
:100011CF    FF7508                push [ebp+08]

Après il s'amuse un peu mais ne change pas les codes

Bon donc pour trouver notre serial qui lui n'a pas +666 à la fin il va falloir résonner à l'envers

A savoir que notre serial aura plus de caractère que notre nom...

Sinon n'ayant pas réussi à tirer quelque chose de visual++ et Qbasic je ne pourrait vous proposer une source de Keygen

Mais j'ai réussi a bricolé quelque chose avec Excel... Il faut afficher le code avec Visual Basic Editor...

 

 

Name = SOMR

SERIAL = SOMRzzA

Attention au minuscule/MAJUSCULE ;-)

Si de faire un Keygen vous ennuie vous pouvez toujours patchez le saut

:10001215         3BC3         cmp eax, ebx
:10001217         7510           jne 10001229 

Donc transformez le JNE en Nop et voilou soit à l'adresse 671 7510 par 9090

 

 

Et le plus Marrant un peu de RE pour finir

 

Donc on ajoute notre section avec Procdump...

Donc on clique sur PE Editor on ouvre notre fichier on appuie sur Sections, puis clique droit Add Section on lui donne un petit nom style SOMR ;-)

On change les deux sections concernant la taille et on les met a 200 et mettre en caractéristique E0000020... On rajoute si ce n'est pas fait (ça dépend de la version de Procdump) 200 octets à la fin du fichier avec l'éditeur héxa...

 

Et là on va s'amuser

 

:00401692 E88A010000 call 00401821


Donc le call que l'on va modifier et que l'on va faire pointer vers notre nouvelle sections qui normalement commence à 00405000

On peut d'ailleurs le voir avec Windasm on a une nouvelle section dans le PE et à la fin du fichier on a que des instructions à 00

Donc on va changer le call 00401821 en jmp 00405000 pour qu'il exécute notre code puis on remettra un jump  pour que le programme retourne ou il était soit en 0040176C...

 

Donc on change le E88A010000 en E969390000 pour aller en 0405000

Après il faut mettre à la fin de son code un saut pour 0040176C un jmp 0040176C

Entre les deux par exemple un message dans la boite de dialogue donc on met assez loin notre message par exemple en 405020 puis en 405000

on restaure en vidant la boite donc CALL 00401821 puis on pousse notre message sur la pile PUSH 00405020 et une petite balise du programme que l'on retrouve avant tout ces appels de l'Api (PUSH DWORD PTR [00403290]) et l'api elle-même CALL USER32.SetWindowTextA

 

Récapitulatifs : 

(Offset 1C00)

:00405000     E81CC8FFFF             CALL 00401821
:00405005     6820504000                PUSH 00405020
:0040500A   FF3590324000            PUSH DWORD PTR [00403290] 
:00405010     E85DC9FFFF             CALL USER32!SetWindowTextA 
:00405015     E952C7FFFF              JMP 0040176C

 

(Offset du message 1C20)

 

Section bonus CD-check 3

 

Donc on veut que le programme nous affiche par exemple Level 3 CD-Check Passed

Donc comme au-dessus il faut prendre partie d'un JMP le redirigé vers notre section puis à la fin de notre code retourner vers le JMP initial...

Donc on peut profiter de notre section...

Voila on as vu que l'on avait noppé un saut gênant sauf que l'on peut en tirer parti et le remplacer par saut vers notre section par exemple en 00405030 ou on aurait la même chose que en 00405000

Donc préparons notre saut...

Donc on breake sur notre nop (100010DD) on clique sur Patch code et on tape jmp 00405030 il nous donne le code compilé (E94E3F40F0)

Sauf que petit problème notre code est plus grand que nos 2 Nop (9090) donc il va falloir avant de repartir dans la dll remettre les fonctions effacées

Soit xor eax, eax (33C0) et un leave met on est confronté à un autre problème c'est que ce leave peut être appelé par un saut en 100010A7

Donc la seul solution est de supprimer des fonctions avant soit la fonction lsrtcmpa (qui fonctionnait d'ailleurs avec notre JNE) on compte et on voit que la fonction fait pile le nombre d'octet donc on va remplacer à l'adresse 4D8 E8F1010000 en  E9533F40F0 (le code à changé par rapport au Nop mais on peut l'obtenir facilement avec la même procédure) voila on a donc fini avec la dll

 

Passons à notre exe le code va donc ressembler à ça (début de l'adresse 1C30) avec en 00405050 Notre Message de réussite

:00405030     E8ECC7FFFF             CALL 00401821
:00405035     6850504000                PUSH 00405050
:0040503A   FF3590324000            PUSH DWORD PTR [00403290] 
:00405040     E82DC9FFFF             CALL USER32!SetWindowTextA 
:00405045     E995C0BF0F              JMP
100010DF

 

 

Bon voila la fin des réjouissance c'était un gros crack-me je pense que maintenant vous êtes un peu meilleur qu'avant ...

 

 

Nota : Le programme cracké fourni ne fonctionne pas sous Windows XP

 

Par SOM'R 

E-mail :  som.r@caramail.com 

Je voulais remercier tous ceux qui anime le forum de Deamoncrack

Et plus particulièrement Deamon, Jubidet, AXL... Et pardon pour ceux que j'ai oublié