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
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)
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
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....
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]
* 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...
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...
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é