¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ MILLENIUM CRACKING TUTORIAL (PART II) ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ [ NdRedoxx : le génial tutorial de tHE ANALYST continue dans ce noumbeurre touh de APOCALYPSE, et il se cloturera dans la prochaine issue. Je vous rappelle également que son ancien pseudo est ACiD BuRN et qu'il a écrit ce turial sous ce nom là, donc ne vous étonnez pas si vous le trouvez écrit. Ce deuxième "tome" va du chapitre 8 au chapitre 12, et, comme le précédent, il est clair et bien expliqué. Allez, let's go!!! ] Sommaire :::::::::: :::::::::: 8) Transformer un Programme en son propre keygen 9) Time Limits (limitation de 30 jours et autres merdes !!) 10) Nag et autres Splash screen (diverses méthodes...) 11) Keyfile 12) CD Check (les BPX, et techniques diverses..) Transformer un programme en son propre keygen :::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::: - Afficher le bon serial à la place du msg d'erreur Introduction: Il faut faire un keygen, les keygens c'est marrant mais on va apprendre autre chose cette fois. On ne 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 de n'enter que des majuscules et des espaces... 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 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ésumé, on voit une comparaison bon serial / mauvais serial exécutée 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 le faire afficher le bon serial tu prends l'adresse 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 ;) *********************************************************** **** Reprogrammer la routine de Contrôle du serial **** *********************************************************** Toujours sur le même crackme !! 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 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 [ 4030D3 = Good (titre de la msg box) 025F:00401148 6889304000 PUSH 00403089 [ 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 [ 4030EA = Bad (titre de la msgbox) 025F:0040115F 68DD304000 PUSH 004030DD [ 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 met 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 utiles, mais ça fais 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 On peut bien s'amuser donc :] Time Limits (limitation de 30 jours et autres merdes !!) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Comme vous l'avez sûrement remarqué, il existe des programmes qui ne sont pas enregistrables car il n'y pas moyen de s'enregistrer !! Ils sont en générale limités à 30 jours!! C'est ce qu'on appelle: Time limit protection !!! Comment cracker ça ? Il y a plusieurs façons !! Nous allons voir ça de suite !! Méthode avec W32Dasm: Vous avez un programme nomme X, qui après 30 jours ne marche plus :( Mais en revanche, il nous envoie une messagebox disant: "La période d'évaluation est terminée..." ou "Trial version expirée..." Bref ce genre de conneries !! Alors si vous avez ça, vous lancez W32Dasm et désassemblez le fichier à cracker. Vous cherchez cette phrase dans les String Data References et une fois que vous avez trouvé, double-clickez dessus afin d'aller à la place de cette phrase dans W32Dasm !! Et maintenant ?? Ben on étudie le code aux alentours !! Ca ne vas pas être bien dur !! Généralement vous devriez trouver au dessus du message d'erreur des sauts conditionnels de type JL, JLE, JG, JGE ..... Par exemple: CMP DWORD PTR EAX, 1E <-- 1Eh = 30 en décimal (30 jours!) JLE 00405840 <-- jump au programme si c'est égal ou inférieur à 30 jours Ici on voit qu'il compare le nombre de jours écoulés avec 30! Tant que c'est inférieur ou égal à 30 jours le programme marchera !! Mais une fois dépassé les 30 jours !! Ca marche plus :( Donc pour cracker ça on force le programme à sauter quoi qu'il arrive en changeant le JLE en JMP !! et le programme sautera inconditionellement comme si de rien n'étais! Il croira tjs que l'on est encore dans la période des 30 jours heheh !! Avec Soft-ice: Tout d'abord regardons les API utilisées dans les time limites!! : (eq: win32API.hlp) Je ne traduirais pas, pour ne pas détériorer les infos données. ******************************************************************************************** * GetFileTime The GetFileTime function retrieves the date and time that a file was created, last accessed, and last modified. BOOL GetFileTime( HANDLE hFile, // identifies the file LPFILETIME lpCreationTime, // address of creation time LPFILETIME lpLastAccessTime, // address of last access time LPFILETIME lpLastWriteTime // address of last write time ); Returns If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError ******************************************************************************************** * GetLocalTime GetLocalTime function retrieves the current local date and time. VOID GetLocalTime( LPSYSTEMTIME lpSystemTime // address of system time structure ); Returns This function does not return a value. ******************************************************************************************** * GetSystemTime The GetSystemTime function retrieves the current system date and time. The system time is expressed in Coordinated Universal Time (UTC). VOID GetSystemTime( LPSYSTEMTIME lpSystemTime // address of system time structure ); Returns This function does not return a value. ******************************************************************************************** * SystemTimeToFileTime The SystemTimeToFileTime function converts a system time to a file time. BOOL SystemTimeToFileTime( CONST SYSTEMTIME * lpst, // address of system time to convert LPFILETIME lpft // address of buffer for converted file time ); Returns If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError. ******************************************************************************************** Voilà !! Donc ça c'était les API les plus couramment utilisées dans les protections par time limites! Cependant, l'API la plus souvent utilisée est : Getlocaltime Donc vous mettez un Bpx dessus et vous lancez le programme ! Soft-ice break ! Pressez F12 pour arriver au bon endroit dans le programme et commencer à tracer !! Si vous voyez un saut de type: JL, JLE, JGE, JG vous savez ce qu'il vous reste à faire !! Je ne vais pas écrire des tonnes encore sur cette protection aussi stupide que simple à cracker !! Vous trouvez un exemple de Time limite mais dans la partie Visual Basic!! Comment cracker un programme VB avec W32Dasm original !! ;-) l33t hehe Sinon, j'espère que vous voyez comment cracker ça maintenant ...... Nag et autres Splash screen (diverses méthodes) ::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::: C'est la partie qui me fait le plus chier à écrire je pense !! Pourquoi ? Car j'aime pas les nags screen !! Je trouve ça ennuyeux ;) Mais on doit y passer alors commençons dès maintenant !! Qu'est-ce qu'un Nag screen ? Un nag screen, c'est une fenêtre qui vient vous dire que vous n'êtes pas enregistré et qu'il faut payer vite fait pour qu'elle disparaisse :) Bref, c'est vraiment ennuyant, on peut tomber sur un NAG avec un bouton désactivé qui se réactive après qq secondes par exemple !! Bref casse-couilles à souhait ;) Avant de commencer avec les trucs un peu plus compliqués avec Soft-ice et tout, on va commencer par Simple !! Cracker un nag screen avec seulement un éditeur hexadécimal. Quoi ? Vous vous demandez quelle connerie je suis en train de raconter lol !! L'exemple que vais vous montrer est comment cracker le NAG screen de WinRAR 2.6 quand la limite dans le temps à expirée !! Vous pourrez essayer cette technique sur ICQ99 afin de kicker les 8 secs au démarrage!! Bref assez bavardé !! Let's start : ********************************* * Cracker le nag de WinRAR 2.6b * ********************************* Tu lances WinRAR, après avoir mis la date en avance, style : 2002. Là tu vois un nag screen avec 5 boutons de merdes !! Il y en a 1, avec Close... Tu clicks dessus et WinRAR marche normalement. Donc, on va émuler la pression sur ce bouton. Piner Le nag :) ~~~~~~~~~~~~~~ Donc, voici une méthode qui marche souvent, pour émuler la pression d'un bouton... Vous avez juste besoin d'un éditeur hexadécimal (moi j'utilise hex workshop). Donc, vous lancez WinRAR encore et regardez le caption du bouton : Close puis ouvrez WinRAR avec un éditeur hexa et recherchez en hexa: 43006C006F0073006500 43006C006F0073006500 = C l o s e donc vous recherchez la valeur hexa de chaque Caractères, plus 00 entre chaque valeur. Vous devez arrivez ici : 4600 0E00 0100 FFFF 8000 4300 6C00 6F00 F.........C.l.o. <== C l o s e ici !!! heh 7300 6500 0000 0000 0000 0150 0000 0000 s.e........P.... 9500 4300 4600 0E00 0900 FFFF 8000 2600 ..C.F.........&. 4800 6500 6C00 7000 0000 0000 0700 0050 H.e.l.p........P 0000 0000 0400 0400 8B00 4D00 FFFF FFFF ..........M..... 8000 0000 0000 0000 0000 0250 0000 0000 ...........P.... 0900 1000 8200 3700 FFFF FFFF 8200 5000 ......7.......P. 6C00 6500 6100 7300 6500 2000 6E00 6F00 l.e.a.s.e. .n.o. Donc, voilà vous êtes à la bonne place, now pour émuler, vous avez juste à regardez le FFFF82 ou FFFFFFFF82 le plus proche et changer le 82 en 7E !!! donc : 4600 0E00 0100 FFFF 8000 4300 6C00 6F00 F.........C.l.o. 7300 6500 0000 0000 0000 0150 0000 0000 s.e........P.... 9500 4300 4600 0E00 0900 FFFF 8000 2600 ..C.F.........&. 4800 6500 6C00 7000 0000 0000 0700 0050 H.e.l.p........P 0000 0000 0400 0400 8B00 4D00 FFFF FFFF ..........M..... 8000 0000 0000 0000 0000 0250 0000 0000 ...........P.... 0900 1000 8200 3700 FFFF FFFF 8200 5000 ......7.......P. <-- ici tu vois FFFFFFFF82 !!! 6C00 6500 6100 7300 6500 2000 6E00 6F00 l.e.a.s.e. .n.o. COOL !! Là tu es à la bonne place, donc tu remplaces le 82 par un 7E et hop le nag a mouru ;) Donc : 0900 1000 8200 3700 FFFF FFFF 8200 5000 ......7.......P. devient : 0900 1000 8200 3700 FFFF FFFF 7E00 5000 ......7.....~.P. Tu saves ton fichier WinRAR, le relance et plus de nag du tout :) Si tu remets la date en arrière, toujours pas de nag, donc Voilà c'est terminé. Conseil: Ils auraient dû fermer le prog une fois le temps dépassé! Ca aurait forcé le cracker à jouer un peu plus et cracker le time limite ! Pour le reste des protections, c'est tres simple ! Avec ce que vous avez dû lire avant d'arriver ici, vous ne devriez pas avoir de problèmes ! On va passer à un autre type de Nag Screen !! Les messagebox. C'est très chiant, mais quand on voit ça !! On est quand même content car ça se vire en 10 secondes ;) Les messageboxes se reconnaissent grâce à leurs icônes déjà ! Les icônes que l'on voit dans Windows avec comme signe: le point d'exclamation, la croix blanche sur rond rouge.... et un message l'accompagnant !! Comment cracker ça ? Bien je vais montrer 2 façons!! - Avec W32Dasm (cracker like a wanker): Vous lancez votre programme et vous voyez le message qui nous dit: "Version Shareware! please Register" ou un truc chiant du style !! Pour virer ça, vous ouvrez W32Dasm et désassemblez le fichier du programme! Vous faites un tour dans les String Data References à la recherche de cette phrase! Vous allez la trouver avec 98 % de chances !! Donc vous double-cliquez sur cette phrase et recherchez au dessus d'un saut conditionnel qui vous fait atterrir sur le nag ou au contraire le sauter !! ET vous le nopez ou forcez a sauter en fonction de ce que vous trouvez !! ex: JE 00406280 ................. Possible String Data Reference BLABLA to: Please Register Now !... XXXX:00406280 PUSH 00 XXXX:00406282 PUSH 004062E0 ;"Register!" XXXX:00406287 PUSH 00406360 ;"Please Register Now!!.." XXXX:0040628C PUSH 00 XXXX:0040628E CALL [USER32!MessageBoxA] .................... Ici, si ce "je" nous amène à tout les coups sur le message d'erreur, on le NOP et il ne sautera plus jamais ! Ceci est un exemple mais ça ressemble à ça en gros. C'est pas très clean, et ça fait branleur mais bon :) Plus ça va vite et plus vous êtes content je présume .... - Avec Soft-ice: Avec Soft-ice on va tout simplement poser un BPX sur MessageBoxA! Donc Ctrl+D et tapez votre BPX! Lancez le programme et Soft-ice break! Pressez F12 et vous retournez sous Windows !! Là vous clickez sur le bouton OK du nag et vous vous retrouvez sous Soft-ice encore une fois !! Juste au dessus de votre emplacement actuel vous devez voir le Call qui appelle le messageBox !! On peut cracker comme un bourin en nopant ce call, mais ça fait pas très pro, le mieux c'est de foutre un RET juste après être entré dans le CALL.. Petit exemple théorique: XXXX:00406280 PUSH 00 XXXX:00406282 PUSH 004062E0 ;"Register!" XXXX:00406287 PUSH 00406360 ;"Please Register Now!!.." XXXX:0040628C PUSH 00 XXXX:0040628E CALL [USER32!MessageBoxA] <--- ici on fait F8 Après avoir fait le F8 on voit un truc comme ça : 025F:00401510 FF253C324000 JMP [USER32!MessageBoxA] <-- le F8 nous mène ici 025F:00401516 FF2540324000 JMP [USER32!MoveWindow] 025F:0040151C FF2544324000 JMP [USER32!DialogBoxParamA] ........................ Après avoir fait le F8, on est donc sur un JMP qui va appeler le MessageboxA . Donc sur cette ligne vous faites: A {enter} RET {Enter} {echap} Le programme arrive et prends le RET et sort de cette routine en 2 temps 3 mouvements! et hop il continue sa route sans jamais afficher aucune connerie ! Ensuite vous faites la modif dans l'exécutable lui-même et on en parle plus :] Je vais expliquer Rapidement une méthode qui utilise un BPX qui est très rarement utilisé pour cracker les Nags, mais plutôt dans les names / serials ! Mais c'est un plaisir de l'utiliser dans les programmes écrits en Delphi par exemple ! Le BPX est : hmemcpy Méthode théorique: Vous mettez ce BPX et vous lancez le programme en Delphi à cracker! Soft-ice break! Vous pressez F5 le nombre de fois qu'il faut pour obtenir le NAG screen et vous comptez le nombre de F5 qu'il vous a fallut bien sûr!! On va dire: 14 fois F5 pour voir le nag !! Alors on relance le programme et on fera F5 le nombre de fois que vous avez trouvé moins 1 !! (14 - 1 = 13 ici) On presse 13 fois F5 ici !! Ensuite on presse F12 pour revenir dans l'exécutable et quitter ces dlls à la con :=) Après avoir fait ça, vous tracez comme un dingue avec F10 et vous allez arriver sur une série de CALL , MOV , CALL , MOV .... Ca se voit tout de suite, il y a quasiment que ça !! Et là vous mettez un BPX à l'emplacement où cette routine commence et vous tracez avec F10! Le NAG screen va apparaître en passant sur un call normalement !! Vous repérez quel CALL c'est et puis vous lui mettez un bpx une fois avoir désactivé tout les autres! Vous breakez dessus! Première façon bourin: on nope le call comme un goret ;) On a de la chance ça marche !! KeWl !! Alors on peut entrer dans le Call avec F8 et mettre un ret sur le Push ebp qui doit s'y trouver!! (c'est pas tjs un Push ebp ;p) On presse F5 et si le nag est parti et que ça ne crash pas, c'était le bon endroit !! Si tout ça a amené à un méchant crash :-/ , il vous faut après avoir entré ce call chercher un autre call qui affiche le nag à l'intérieur !! et le noper !! Si le nag est avec timer, on doit trouver un CALL GETTICKCOUNT pas loin de celui-ci non plus !! Cette API est souvent utilisée pour ça ;) On peut aussi utiliser L'API: Destroywindow qui nous amène dans Soft-ice après avoir tué le nag ! Là on presse F12 et on regarde les calls plus haut et on retrouve souvent les calls et les movs de tout à l'heure qui sont si charmants, lol. Bref, cette technique, je ne l'ai jamais vu dans aucun cours en français ou bien US, mais elle permet de cracker un nag Delphi en 2 mins sans se faire chier à tracer comme un dingue jusqu'à trouver LE CALL !! Sinon, voici une liste d'API utilisées dans le cracking des nags screen: pour tout ce qui est messagebox: MessageBox MessageBoxA MessageBoxExA MessageBeep ou encore ceci pour afficher du texte! SENDMESSAGE WSPRINTF et pour les générations de fenêtre: createwindow createwindowexa showwindow Voilà, je pense que vous avez déjà de quoi cracker pas mal de nags screen à la con! La plus part du temps c'est : Posez le BPX, tracez, trouvez le CALL, killez le ! et on ne reparle plus du NAG !! Keyfile ::::::::: ::::::::: Qu'est ce qu'un keyfile ? C'est un fichier licence que l'on place dans le répertoire courant du programme pour l'enregistrer ! On a donc rien à entrer comme un name / serial! On n'utilise pas les mêmes API mais surtout l'API CreateFileA. Je vais montrer un exemple: ******************************** * termial Cilla's CrackMe 1.0 * ******************************** Je vous préviens de suite, ce crackme contient une protection par Key file, qui est très simple, mais que je considère bien pour le sujet d'un cours général ! Je ne vais pas vous faire un cours sur un keyfile qui est trop long et qui va vous perturber !! Le crackme a besoin d'un fichier keyfile, ici il s'appelle TC1.key . Je crée un fichier keyfile à la con contentant le texte: "ACiD BuRN 4 EVER Ph34rs " Si on édite en hexa on obtient ceci: 00000000: 41 43 69 44 20 42 75 52 4E 20 34 20 45 56 45 52 00000010: 52 20 50 68 33 34 72 73 20 20 20 20 20 20 20 20 Lancez le crackme et on voit qu'il y a un bouton pour checker le keyfile !! Un open box apparaît si vous clickez dessus et vous dit de choisir un fichier, ok on va le faire l'ami :) Tout d'abord mettez un BPX sur createfilea et quittez Soft-ice avec F5 ! Ensuite il vous suffit de choisir le fichier et Soft-ice revient de plus belle ! Pressez F11 et vous devriez voir le code suivant: :0040461F CALL KERNEL32!CreateFileA :00404624 CMP EAX,-01 ; Est-ce que le fichier existe ? :00404627 JZ 00404652 ; si il n'existe pas ça saute :00404629 MOV [EBX],EAX :0040462B POP EDI :0040462C POP ESI :0040462D POP EBX :0040462E RET ; tout est ok! on sort d'ici! On a notre fichier, donc le test est ok ! On continue à tracer avec F10 on passe le RET et on trouver un code du genre: :00429D93 CALL 00402618 :00429D98 JMP 00429DB4 :00429D9A LEA EDX,[EBP-01] :00429D9D LEA EAX,[EBP-0150] :00429DA3 CALL 004044E8 :00429DA8 CALL 00402618 :00429DAD XOR EAX,EAX ; EAX = 0 :00429DAF MOV AL,[EBP-01] ; Prends le caractère du keyfile (dans ebp-1) :00429DB2 ADD EBX,EAX ; additionne la valeur à EBX :00429DB4 LEA EAX,[EBP-0150] :00429DBA CALL 00404494 :00429DBF CALL 00402618 :00429DC4 TEST AL,AL ; On a fait toutes les lettes ? :00429DC6 JZ 00429D9A ; non ? alors on saute sinon on continue :00429DC8 LEA EAX,[EBP-0150] :00429DCE CALL 00404458 :00429DD3 CALL 00402618 :00429DD8 CMP EBX,000020A9 ; La somme des caractères = 20A9h ? :00429DDE JNZ 00429DEE ; Si c'est égal alors le keyfile est valide La somme de mon fichier fait: 794h Ce n'est pas égal à 20A9h donc le keyfile n'est pas valide!! On va rectifier ça !! 20A9h - 794h = 1915h Il nous faut donc ajouter 1915h à notre keyfile! On va ajouter des FFh (255) Je n'ai plus le keyfile sous la main, mais je pense que vous avez compris comment ça marche ! Alors je vous laisse vous amuser !! Sinon, le keyfile le plus petit possible est : 00000000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00000010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00000020: C9 Il n'y a aucun texte dans cette keyfile, on retrouve juste la somme nécessaire: 20A9h Alors amusez vous à faire votre propre keyfile et si vous n'avez pas compris comment faire, essayez de compléter mon keyfile :) Voilà, la partie keyfile fut brève ! Il existe un crackme un peu plus compliqué mais très intéressant à essayer: Cruehead Crackme 3 ! Il est toujours simple, mais plus fin à cracker ;) Vous devez l'essayer, et pourquoi par faire un keymaker ! Il existe d'autres crackme utilisant les keyfiles! Alors vous pouvez vous entraîner si vous avez du mal! Note: N'essayer pas de cracker CuteFTP juste après avoir lu ce cours, si vous n'avez jamais cracké de keyfiles de votre vie! C'est un conseil .... CD Check (les BPX, et techniques diverses...) ::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::: Alors là, c'est la partie cracking jeux!! Qu'est qu'un CD check ? Un CD check est la détection du CD dans le lecteur pour éviter aux petits pirates en herbes de copier les jeux sur leur disque durs pour y jouer sans CD :) lol!! Il y a bcp de jeux protégés par CD check mais bon, les 3/4 on se pisse de rire!! La protection actuelle qui calme les "petits" crackers est CDilla, cette protection est en effet d'un niveau élevé par rapport aux protections que l'on trouve dans: Quake 2, Formula 1, King Pin et bcp d'autres !! Mais, je vais vous montrer comment cracker les 2 avant-dernières protections de CDilla !! N'ayant aucun jeux originaux (hehe, no way ) je n'ai pas pu tester la toute dernière version encore, qui est soi-disant plus dure;) Je vais aussi vous parler des protections commerciales ! Mais je ne vous décrirais que CD Lock et CDilla ! Il existe de nombreux cours sur securom, et autres protections CD commerciales ! J'écris pas un roman lol Alors nous allons commencer par les protections TRES TRES simples !! Les CD check de bases: *** Avec W32Dasm: ***** Comme exemple on va prendre Formula 1: Il contrôle si il y a le CD du jeu et si ce n'est pas le cas il refuse de se lancer. Après avoir installé le jeu on le lance (après avoir retiré le CD !!!) Et un message apparaît "Formula 1 CD NOT Found". Il n'en faut pas plus pour le cracker. Prenez W32Dasm et désassemblez le fichier exécutable, en l'occurrence F1win.exe. Cherchez dans String Data References (Menu "Refs") de W32Dasm et recherchez la phrase. On trouve ça quelques lignes avant le message d'erreur : 00409AC3 FF5234 call [edx+34] 00409AC6 85C0 test eax, eax 00409AC8 7D50 jge 00409B1A Là il y a un test qui ne nous envoie pas au jeu si il ne trouve pas le CD, donc on place des NOP et il n'y a plus aucun Test et le jeu se lance quoi qu'il arrive. Cela donne : 00409AC3 FF5234 call [edx+34] 00409AC6 90 nop 00409AC7 90 nop 00409AC8 7D50 jge 00409B1A Donc pour le cracker il faut rechercher avec un éditeur hexadécimal la chaîne FF 52 34 85 C0 7D 50 et la remplacer par FF 52 34 90 90 7D 50 c'est tout. 2ème exemple : Quake 2 v3.14 Après avoir installé le jeu ou après avoir mis le patch 3.14, quand on lance Quake 2 sans le CD dans le lecteur, il marche jusqu'au menu puis lorsqu'on lance une nouvelle partie boum! Le message "You must have the Quake 2 CD in ..." On désassembles le fichier avec W32Dasm puis on cherche dans String Data References le message "You must have the Quake 2 CD in ..." Bcp de jeux utilisent cette connerie de message !! (ils sont rares de nos jours cependant!) Vous marquez "Please insert the XXX CD" (vous cherchez cette phrase dans String Data References.) Après avoir trouvé cette phrase dans String Data References, clicker 2 fois dessus, cela vous amènera au désassembler à la ligne du message. Remontez un peu avec la barre de défilement, vous trouverez juste au dessus: E82BFFFFFF call 0042F520 803800 cmp byte ptr [eax], 00 750F jne 0042F609 Là on voit un petit "750F" qui représente le "Jne" (celui dont je vous parlais au début), il représente un saut si ce n'est pas égal. Donc si il n'y a pas le CD dans le lecteur, ce n'est pas "égal au CD" donc le programme saute au message d'erreur et le jeu ne marche pas! On va noper ce con de saut !! Le code devient: E82BFFFFFF call 0042F520 803800 cmp byte ptr [eax], 00 90 nop 90 nop Et c'est partie !! Les CD checks de ce type!!: That's bullshits ! Donc pour cracker définitivement le jeu on cherche la chaîne Hexadécimale suivante avec un éditeur Hexa du style HexWorkshop, Hedit. La chaîne : FF FF 80 38 00 75 0F et la remplacer par FF FF 80 38 00 90 90. Fermez W32Dasm et lancez Quake 2. Bingo le jeu marche c'est cool! Vous allez me dire !! Ca marche que sur les vieux jeux ça ;PP Alors comme autre Exemple: KingPin version Fr *************** *** KingPin *** *************** Cracking part: Qd vous lancez le jeu avec un CD gravé, on voit les super (lol) messages: You must have the KingPin CD in the drive to play... Hahah, j'adore ce genre de conneries! Lancez W32Dasm et désassemblez le jeu! Allez dans les References et cherchez la phrase du jeux! Double click dessus et on ne voit rien de super! donc on re-double click dessus ! Et cette fois-ci!! On trouve qq chose de bien : * Referenced by a CALL at Address: |:0043D5F1 <== hoho :)) | :00442030 56 push esi :00442031 E84AFFFFFF call 00441F80 :00442036 8BF0 mov esi, eax :00442038 85F6 test esi, esi :0044203A 750E jne 0044204A * Possible StringData Ref from Data Obj ->"You must have the KINGPIN CD in " ->"the drive to play." | :0044203C 68C8414500 push 004541C8 <== on arrive ici :00442041 50 push eax :00442042 E859D7FDFF call 0041F7A0 :00442047 83C408 add esp, 00000008 Donc, nous voyons le message d'erreur et un petit jne juste avant !! Mais bon, remplacez un je en Jne et autres, ça fait branleur !!! Réfléchissons un peu ;) On a vu : * Referenced by a CALL at Address: |:0043D5F1 Donc avec W32Dasm on va regarder ce call !! Allez dans le menu "Goto" et clickez sur "goto code location" et entrez : 43D5F1 Maintenant on arrive ici: :0043D5E5 A184274900 mov eax, dword ptr [00492784] :0043D5EA 83C40C add esp, 0000000C :0043D5ED 85C0 test eax, eax :0043D5EF 7505 jne 0043D5F6 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0043D5D2(U) | :0043D5F1 E83A4A0000 call 00442030 <== get the fuck outta here! * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0043D51F(U), :0043D532(C), :0043D55A(U), :0043D5BA(C), :0043D5D0(C) |:0043D5EF(C) Hehehe, voilà !! C'est ce call de merde qui appelle la routine de CD check ! On va le noper et il nous tanera plus !! Promis. Clickez sur ce call, en bas de la fenêtre de W32Dasm, vous devez voir offset : 3D5F1 Lancez votre éditeur hexa et allez à cet offset ! On remplace E83A4A0000 par 9090909090. Enregistrez le fichier et lancez le ;) Choisissez new game, et WOW !! Le jeu marche *grin* ! Piece of cake !! On vient de cracker King Pin ! Un jeux super récent mais avec une protection de merde :) (tant mieux hehe, vous allez voir CDilla, c'est autre choses) Voilà, c'est fini pour les CD checks de bases avec W32Dasm ! **** CD check avec Soft-ice ***** Voici un exemple Très simple de CD check ! Mais cette fois-ci on utilise Soft-ice (my love) Le but du crackme et de faire afficher le message de bon CD qd on a pas un seul CD dans le lecteur :) On le lance sans CD, on click sur le bouton et une messagebox de merde arrive !! mouahah Les BPX les plus utilisés dans le CD checks sont: GETDRIVETYPEA et GETVOLUMEINFORMATIONA !! Mettez un bpx sur GETDRIVETYPEA et clickez sur le bouton! Pressez F12 tant que l'on est pas à la bonne place !! Vous devriez voir qq chose comme ça: 025F:00401032 83F805 CMP EAX,05 <--- c'est un CD ? 025F:00401035 75DC JNZ 00401013 025F:00401037 6A00 PUSH 00 025F:00401039 6A00 PUSH 00 025F:0040103B 6A00 PUSH 00 025F:0040103D 6A00 PUSH 00 025F:0040103F 6A00 PUSH 00 025F:00401041 6A20 PUSH 20 025F:00401043 68F7214000 PUSH 004021F7 025F:00401048 685A224000 PUSH 0040225A 025F:0040104D E85E000000 CALL KERNEL32!GetVolumeInformationA 025F:00401052 0BC0 OR EAX,EAX 025F:00401054 74BD JZ 00401013 <-- JMP BAD CRACKER 025F:00401056 6A00 PUSH 00 025F:00401058 685F224000 PUSH 0040225F 025F:0040105D 6A00 PUSH 00 025F:0040105F 6A00 PUSH 00 025F:00401061 685A224000 PUSH 0040225A Ok, c'est trop simple, il compare la valeur d'EAX avec 5! Hmm pourquoi 5 ? Voici un petit tableau des différents type de lecteurs et leurs références: La valeur dans EAX veux dire: 0 Lecteur indéterminé 1 Répertoire sur la racine n'existe pas 2 Disque removable 3 Disque dur 4 Remote Drive(Network) 5 CD ROM 6 RamDisk Donc le crackme ici compare EAX avec 5 ! Donc il veut un CD ROM arff sinon il saute!! 025F:00401032 83F805 CMP EAX,05 025F:00401035 75DC JNZ 00401013 <-- on NOP ça On nop ça ! Et plus jamais de problèmes avec ça hehehe !! On ouvre le crackme avec un éditeur hexa, on cherche 83F80575DC et on remplace par 83F8059090. Après ce contrôle de type de disque, on voit un "CALL KERNEL32!GetVolumeInformationA" Hehe, une API souvent utilisée par les CD checks! Ca ressemblais à ça: 025F:0040104D E85E000000 CALL KERNEL32!GetVolumeInformationA 025F:00401052 0BC0 OR EAX,EAX 025F:00401054 74BD JZ 00401013 <-- Jump to bad boy Encore une fois ! On NOP le saut conditionnel et le CD is no more :) Ben voilà, c'est fini, je ne vais pas faire un roman non plus sur les CD checks ehehe ******************************************** ** CD CHECKS: PROTECTIONS COMMERCIALES: ** ** ** ** CD LOCK: TOMB RAIDER 3 FR ** ******************************************** Vous êtes sûrement beaucoup à vouloir Tomb Raider III mais ce jeu est protégé contre la copie ! Enfin, en théorie !!!! Tout d'abord nous allons voir la protection. Un CD Vierge ne peut contenir que 650 Mo de données et le CD original de Tomb Raider III contient 3 Go de données ?! Oui en fait il y a 4 fichiers qui font 600 Mo chacun : Awcs.afp ; Neir.afp ; Oket.afp et Vfaw.afp . Pour Pouvoir le graver il faut d'abord copier tous les fichiers du CD sur le disque dur, sauf les 4 cités plus haut. Ensuite créer 4 fichiers avec le même nom avec un caractère dedans pour que le fichier fasse 1 octet. Maintenant on grave le CD sans problème mais le jeu ne marchera pas car il est encore protégé !!! Et c'est là qu'intervient le cracking! Nous sommes en présence d'un CD Check (contrôle du CD) et le jeu nous affiche le message " Tomb Raider III CD ?" malgré la présence du CD Gravé. Si vous avez lu le premier cours, vous vous dites comme moi, on va le désassembler et chercher cette phrase dans String Data References. Le problème c'est que l'on ne trouve pas cette phrase, donc il suffit de réfléchir un tout petit peu. Il y a 4 fichiers qui ne servent à rien donc on va chercher le nom de l'un d'eux dans les String Data References. On voit d:\Awcs.afp , d:\Neir.afp , d:\Oket.afp et d:\Vfaw.afp. Donc on double-click dessus et on retourne dans W32Dasm, juste au code source de cette référence, on remonte avec les barres de défilement et on trouve: test edi, edi jne 0048D2CE * Possible string data reference from Obj ->"rb" Push 004C7AD4 * Possible string data reference from Obj ->"d:\AWCS.AFP" ....... Le Jne (Jump if not equal) fait le saut s'il ne trouve pas le fichier de 600 Mo donc on le change en je (jump if equal) et le programme ne saute que si il trouve le fichier. Il peut toujours chercher !!! Donc maintenant on ouvre le fichier Tomb3.exe avec un éditeur hexadécimal, on cherche la chaîne 85FF756568D4 et on la remplace par 85FF746568D4 . Et on enregistre le fichier. Le jne 0048D2CE est devenu Je 0048D2CE. Maintenant on refait la même chose avec les autres fichiers.(d:\Neir.afp , d:\Oket.afp et d:\Vfaw.afp) Les 2 premiers seront casi-identiques mais on ne trouvera pas la même chose au fichier "D:\Vfaw.afp" C'est normal il n'y a rien à changer. Donc vous avez changé : - pour "Neir.afp": 0F85F9000000 par 0F84F9000000 ===> le 85 (jne) devient 84 (je) - pour "Oket.afp": 0F85AD000000 par 0F84AD000000 ===> le 85 (jne) devient 84 (je) - rien pour "Vfaw.afp" Normalement, vous avez tout changé avec l'éditeur Hexadécimal et Sauvegardez. Une fois ceci fait vous pouvez lancer le jeu avec un CD gravé dans le lecteur !!! Tomb Raider III is Now Cracked !!! Voilà!! La Protection CD lock est assez stupide en fait !! Même très simple à cracker ! Vous la retrouverez dans Commandos par exemple aussi :) Pour le cours qui suit sur CDilla, il serait préférable d'aller jeter un oeuil à la partie unpacking qui suit ce cours si vous ne connaissez rien en unpacking et autres dumping !! Mais si vous êtes déjà à l'aise avec le PE, et que vous vous prenez pour un 133t Cr4x0R hehe, lisez !! Mais ne pleurez pas si vous ne comprenez rien !!! Voilà, let's go ************************************************************************ **** CDilla : Safe disc **** ************************************************************************ MidTown Madness version Française: Une autre approche sur CDilla Outils nécessaires: * CD Original de Midtown Madness * Soft-ice 3.23 * Soft-ice Tool pour patcher Soft-ice (pour dumper les sections) * HexWorkshop * Frogsice (pour cacher Soft-ice) * ProcDump (comme PE Editor) * Exescope Introduction: Salut à tous, je sais qu'il y a déjà un cours sur Midtown Madness par black check mais la méthode que j'utilise n'est pas la même que lui... Je vais expliquer le plus de choses possible et en plus c'est le 1er cours sur CDilla en français !!! Il serait préférable de lire le cours de black check avant, et d'avoir quelques connaissances sur le format PE... A Mort CDilla: Après avoir installé le jeu, éditez le PE du fichier ".icd" avec ProcDump. (lancez ProcDump, clickez sur PE Editor, allez où se trouve votre fichier ".icd") Le fichier est : Midtown.icd Maintenant, vous devez voir ceci: - Entry Point : 00166C10 - Image Base : 00400000 Ok, nous allons avoir besoin de l'OEP (Original Entry Point) plus tard donc nous allons le calculer dès maintenant. Pour cela on a besoin de l'Image base et de l'Entry point que l'on obtient avec ProcDump : 00400000 + 00166C10 = 566C10 (on les additionnes) Maintenant, clicker sur le bouton "sections" pour voir toutes les sections du fichier. On ne va avoir besoin que des valeurs Virtual Offset, Raw Size, et Raw Offset ! - pour la section ".text" : Virtual Offset: 00001000 Raw Size: 18D78F Raw Offset: 600 - pour la section ".Rdata" : Virtual Offset: 0018F000 Raw Size: 14C99 Raw Offset: 18DE00 - pour la section ".data" : Virtual Offset: 001A4000 Raw Size: 3D8A4 Raw Offset: 1A2C00 - pour la section ".data1" : Virtual Offset: 00314000 Raw Size: 20 Raw Offset: 1E0600 - pour la section ".rsrc" : Virtual Offset: 00315000 Raw Size: CB3 Raw Offset: 1E0800 Nous allons donc dumper toutes les sections du fichier ".icd" excepté la section ".Rdata" car, c'est plus compliqué pour celle-ci !! Il faut tout d'abord additionner l'Image base avec le Virtual Offset de toutes les sections: .text : 400000 + 00001000 = 00401000 .rdata : 400000 + 0018F000 = 0058F000 .data : 400000 + 001A4000 = 005A4000 .data1 : 400000 + 00314000 = 00714000 .rsrc : 400000 + 00315000 = 00715000 Ok, maintenant nous allons dumper les sections... Pour cela, mettez un breakpoint sur EOP (566C10 pour ce jeu). Vous avez sûrement remarqué, que si vous lancez le jeu avec Soft-ice chargé, il vous envois chier, car il y a de l'anti Soft-ice. CDilla utilise meltice (createfilea) et l'int68h pour détecter Soft-ice. Le mieux, c'est d'utiliser Frogsice, pour le cacher. J'utilise la version 0.20b, mais il faut la patcher pour qu'elle cache complètement Soft-ice de la détection par int68h. Dans le cours de black check on voit qui faut rechercher dans le fichier: FrogSice.vxd -60 80 7d 1d 43 et le remplacer par : -C3 80 7d 1d 43 Voilà, maintenant, plus aucun problème avec la détection de Soft-ice, on va pouvoir s'occuper des choses sérieuses !! Lancez votre Frogsice (version patchée) et lancez le jeu. Pendant la vidéo, faites apparaître Soft-ice (ctrl+D) et mettez votre bpx sur l'OEP: Bpx 56CC10 pour ce jeu... Pressez F5, le jeu continue de se lancer, et quittez-le. Maintenant relancez-le et Soft-ice breaks sur 56CC10. Si Soft-ice ne break pas, regardez si vous avez bien mis votre bpx au bon endroit! (tapez bl et vous devez obtenir qq chose comme ça #025F:56CC10) Donc, Soft-ice break sur l'OEP, vous n'avez plus qu'à dumper les sections :) Avant le dump, désactivez tous les bpx (bd *) car on veut pas de merdes dans nos sections dumpées ehe !! Grâce à Sice Tool, vous avez modifié la commande pagein qui vous permettra de dumper... La commande pagein fonctionne donc comme ceci pour dumper: pagein "l'adresse du début du dump" "longueur du dump" "nom du fichier" Donc dans Soft-ice, tapez: pagein 401000 18D78F c:\text.bin pagein 5A4000 3D8A4 c:\data.bin pagein 714000 20 c:\data1.bin pagein 715000 CB3 c:\rsrc.bin Voilà, nous avons donc nos sections sur le disque dur !!!! Passons aux choses sérieuses !!! : La Section Rdata : Bon, pour dumper cette section, c'est pas aussi simple =) Tout d'abord, nous devons trouver l'adresse réelle de la fonction de décryptage et pour cela nous allons tracer dans le call qui appelle dans la section rdata... Après que Soft-ice ai stoppé sur l'OEP, on arrive ici : 00566C10 PUSH EBP <-- on stoppe ici sur l'entry point 00566C11 MOV EBP,ESP 00566C13 PUSH FF 00566C15 PUSH 005968D0 00566C1A PUSH 00566724 00566C1F MOV EAX,FS:[00000000] 00566C25 PUSH EAX 00566C26 MOV FS:[00000000],ESP 00566C2D ADD ESP, -5C 00566C30 PUSH EBX 00566C31 PUSH ESI 00566C32 PUSH EDI 00566C33 MOV [EBP-18],ESP 00566C36 CALL [0058F14C] <-- voici notre call, on trace dedans (F8) Dans le call , on arrive ici : 009A6485 pushad 009A6486 push 00000031 009A6488 push 00000000 <-- 0 désigne les imports kernels, pour les users ça sera 1 009A6490 call [9A64A6] <-- l'adresse réelle de la fonction (9A64A6) 009A6496 add esp, 8 009A6499 popad ....... jmp [XXXXXXXX] Tracez dans le call et vous allez voir que le jmp [XXXXXXXX] devient jmp [KERNEL32!GetVersion] Ok, c'est normal, on est sur le bon chemin :o) Nous allons bientôt programmer le Call fixer... Mais avant tout, nous devons connaître le nombre d'import de Kernels et users qu'il y a dans le jeu que l'on crack. Pour cela, plusieurs méthodes, on peut désassembler le fichier ".icd" avec W32Dasm et les compter ou bien tracer avec Soft-ice, mais j'ai utilisé un programme nommé : EXESCOPE pour savoir le nombre d'imports... Donc dans le fichier midtown.icd , j'ai : - 127 imports pour kernel32 - 42 import pour user32 Ok, nous avons besoin des ses valeurs en hexadécimal, car dans Soft-ice on n'utilise pas de décimal: 127 = 7Fh 42 = 2Ah Ma partie préférée qd on crack CDilla: Programmer le call fixer. Nous n'avons pas l'accès en écriture dans la section Rdata, donc nous allons la déplacer dans la section rdata... Pour coder le call fixer, je commence sur l'entry point, donc il faut réactiver le bpx sur l'OEP, et relancer le jeu. Attendez que le jeu stoppe dans Soft-ice. Maintenant on va déplacer notre rdata section à la place de la data section en mémoire. Pour faire ça, taper : m "le virtual offset de la section RDATA + l'image base" l "la longueur de RDATA" "le virtual offset de la section DATA" NOTE: Pour le virtual offset de la section data, utiliser un nombre plus grand, c'est mieux... 5A4000 est notre virtual offset, j'ai utilisé 5B0000 (Plus grand comme je vous ai dit) Vous avez donc à taper: m 58F000 l 14C99 5B0000 Maintenant, nous allons programmer le call fixer !! Vous êtes donc à la ligne: 566C10 PUSH EBP Ce que nous allons taper va ressembler à cela: 00 pushad 01 push ebx 02 push 0 04 call [XXXXXXXX] 0A add esp,8 0D mov edx, XXXXXX 12 cmp eax,[edx] 14 je 20 16 inc edx 17 cmp edx, XXXXXX + XXXXX 1D jne 12 1F int 03 20 mov [edx],ecx 22 popad 23 inc ebx 24 cmp ebx, XX 2A jne 00 2C int 03 C'est partis !!! Tapez dans Soft-ice: A "et la touche entrée" et programmez : 566C10 pushad 566C11 push ebx 566C12 push 0 566C14 call [009A64A6] adresse de la fonction trouvé en traçant dans le call 566C1A add esp,8 566C1D mov edx, 5B0000 adresse où nous avons copié notre section .rdata 566C22 cmp eax,[edx] 566C24 je 566C40 566C26 inc edx 566C27 cmp edx, 5B0000 + 14C99 adresse où nous avons copié notre section .rdata + rdata size 566C3D jne 566C22 566C3F int 03 par sécurité, si il ne trouve rien, il stoppe ici 566C40 mov [edx],ecx 566C42 popad 566C43 inc ebx 566C44 cmp ebx, 7F Nombre d'API à réparer 566C4A jne 566C10 566C4C int 03 Mettez ebx à 0 (R ebx 0) , et votre eip à la ligne 0 (ligne 0 = 566C10 ici, donc: R EIP 566C10) tapez "i3here on" et pressez F5 pour exécuter le code, normalement on devrait stopper sur 566C4C . Remettez votre ebx à 0, changez la ligne 02 (56CC12 ici) en "push 1" et changez la ligne 24 en 'cmp ebx, user_import_number' (2A for us) et remettez votre eip à la ligne 0 (R EIP 566C10). Exécuter ça encore (F5). Normalement tout est ok, et on doit encore avoir stoppé sur 566C4C . Nous pouvons maintenant dumper la section rdata sans crainte car tout est décrypté :o) pagein 5B0000 14C99 c:\rdata.bin Hehe !! Maintenant on va reconstruire un fichier exécutable qui va être le fichier final. J'ai essayé ProcDump pour importer les sections, mais cette merde n'a rien changé GRR ! Donc, je l'ai fait à la main comme un grand ;) Voilà comment faire : En premier faites une copie du fichier ".icd" (Midtown.icd) et renommez-le en ce que vous voulez mais avec l'extension ".exe" (ex: fuckit.exe) Ok, lancez HexWorkshop, ouvrez "Damnit.exe", ainsi que le fichier de notre première section dumpé : C'était: c:\text.bin On va avoir besoin du Raw offset de chaque section, on les trouves au début du cours mais je vais vous les remettre pour une meilleure compréhension: for the ".text" section : Raw Offset: 600 size : 18D78F for the ".Rdata" section : Raw Offset: 18DE00 size : 14C99 for the ".data" section : Raw Offset: 1A2C00 size : 3D8A4 for the ".data1" section : Raw Offset: 1E0600 size : 20 for the ".rsrc" section : Raw Offset: 1E0800 size : CB3 Ok, you got all shits here !! We want to do the 1st section ".text" so : Dans HexWorkshop, pressez alt+f5, entrez le Raw offset de la section que vous voulez importer ici : 600 et cliquez sur ok. Allez dans le menu Edit, et cliquez sur "select block" Entrez la longueur (size) de la section, ici : 18D78F... Regardez le fichier ouvert (text.bin) et pressez 'ctrl+a' pour tout sélectionner.. copiez tout ça avec 'ctrl+c'. Retournez dans la fenêtre principale de l'exécutable dans HexWorkshop (damnit.exe), et coller ce que vous venez de copier dans le presse papier, faites: 'ctrl+v' ou menu Edit et paste. Enregistrez votre fichier, cool !! Voilà, c'est fini pour la section '.text', elle est maintenant décryptée!! Ok, je vais vous montrer l'import d'une autre section et vous ferez les autres de la même façon ! 2ème section : Rdata! Vous pouvez fermer la fenêtre 'text.bin', et ouvrez le fichier: 'rdata.bin' avec HexWorkshop. Retournez dans la fenêtre de l'exécutable et pressez 'alt+f5', entrez le Raw offset de la section rdata: 18DE00. Cliquer sur le menu Edit, et cliquer sur "select block" entrez la longueur (size) de la section, ici : 14C99 Regardez la fenêtre de rdata.bin , pressez 'ctrl+a' pour sélectionner tout et copiez les bytes avec 'ctrl+c'... Retournez dans la fenêtre de l'exécutable (damnit.exe) dans HexWorkshop et collez avec 'ctrl+v' ou avec le menu Edit.. Ok, je pense que vous avez compris maintenant, faites de même avec toutes les sections et enregistrez les modifications dans l'exécutable. Vous pouvez quitter Frogsice car l'anti Soft-ice n'est plus dans notre nouvel exécutable !! Virez le CD original de Midtown Madness et lancez 'damnit.exe'. WOW, le jeu marche, se lance très rapidement et sans cette merde de fenêtre qui nous dit d'attendre durant la vérification du CD. Le jeux marche superbement bien :o) Mais pour faire une exécutable parfait, il faut reconstruire le PE en utilisant ProcDump afin qu'il marche avec tous les OS. Si vous lancez le jeu sur une autre version de Windows ça va planter :( Allez, on va réparer ça !! - Lancez ProcDump (Merci G-RoM :) allez dans les Options et sélectionnez: [X]Recompute Object Size [X]Optmize PE Structure [X] Use actual import infos et cliquer sur OK Cliquez sur Rebuild PE, et cherchez notre nouveau fichier (Damnit.exe pour nous) ProcDump nous fais une valide import table et notre exécutable est PARFAIT :o) du moins, j'espère hehe !! Voilà, je pense que ça suffira pour les protections CD !! -¤)-[ tHE ANALYST ]-(¤- ^^^^^^^^^^^^^^^^^^^^^^^