Tutorial de cracking par TeeJi  - numéro 7 -
 
Objet : C4N Project 2 : Security Administrator 1.3
Date : 22 Aout 1999
Heure : 11h55
Protection type : Serial

    Hehe, je crois que j'aime bien les projects de T0RNAD0 ;), après FTP Navigator : Security Administrator. Ne me demandé pas à quoi sert ce programme, je n'en ai aucune idée.. ;) ca doit surement parlé de sécutité ( .. ouais.. ok, je me mouille pas la, j'avoue ;) Bon, passons au crack !

    Je me suis promené un peu hier sur #cracking4newbies et j'entendais tout le monde parlé de Serial ! et moi, je DETESTE les serials !!! donc, je me suis mis dans l'idée de faire le patch, ca changera des autres tuts he !

    Tout d'abord on lance le programme pour voir la(es) protection(s) et on aperçois .. heu 3 choses. :

    A chque fois, si vous rentrez un code bidon, vous voyez ceci : Sorry, this registration code is invalid! Ben à partir de là, je crois qu'on peut commencer le crack, heh ;)



1 ) Trouver le call de vérification du serial

    Cette fois ci, je vais utilisé uniquement W32dasm. Lancé le donc, ouvrez dans wdasm secagent.exe. Après le désassemblage clickez sur String Reference et recherchez après Sorry, this registration... et, vous le trouvez ! Double-clickez donc dessus et vous arrivez dans le DeadListing ici :

:00471CA8 EB18                    jmp 00471CC2
Fin de la procédure Serial-Valid et donc, jump après la proc Serial-Invalid

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

Début de la proc Serial-Invalid. Son exécution dépent uniquement du jump en :00471C70
:00471CAA 6A10                    push 00000010

* Possible StringData Ref from Code Obj ->"Error"
                                  |
:00471CAC B9281D4700              mov ecx, 00471D28

* Possible StringData Ref from Code Obj ->"Sorry, this registration code "
                                        ->"is invalid!"
                                  |
:00471CB1 BA301D4700              mov edx, 00471D30
:00471CB6 A1C0404700              mov eax, dword ptr [004740C0]
:00471CBB 8B00                    mov eax, dword ptr [eax]
:00471CBD E84250FDFF              call 00446D04
Fin de la procédure Serial-Invalide

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00471CA8(U)
|
:00471CC2 33C0                    xor eax, eax

    Allons voir maintenant ce qui conditionne le jump en :00471C70 :

:00471C69 E842B0FFFF              call 0046CCB0 Le call de vérification du serial
:00471C6E 84C0                    test al, al   al = 0 ?
:00471C70 7438                    je 00471CAA   Si oui, Jump à la proc Serial-Invalid

    Call de vérification trouvé !



2 ) Analyse du call de vérification

    Reguardons maintenant ce qu'il se passe dans ce call :

* Referenced by a CALL at Addresses:
|:0046D040   , :00471C69
|

    Nous voyons deja que ce call est appelé à 2 endroits : Une par la grande box et la petite et l'autre au démarage !
    La première chose à faire, pour faire vite et simple, serait de remplacer le call par

mov eax,1
ret

    mais cela ne fonctionne pas :( donc on doit reguarder la procédure d'un peu plus près :

:0046CCB0 55                      push ebp
:0046CCB1 8BEC                    mov ebp, esp
:0046CCB3 51                      push ecx
:0046CCB4 53                      push ebx
:0046CCB5 56                      push esi
:0046CCB6 8955FC                  mov dword ptr [ebp-04], edx
:0046CCB9 8BF0                    mov esi, eax
:0046CCBB 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CCBE E81171F9FF              call 00403DD4
:0046CCC3 33C0                    xor eax, eax
:0046CCC5 55                      push ebp
:0046CCC6 68A4CD4600              push 0046CDA4
:0046CCCB 64FF30                  push dword ptr fs:[eax]
:0046CCCE 648920                  mov dword ptr fs:[eax], esp
:0046CCD1 33DB                    xor ebx, ebx
:0046CCD3 C605B858470000          mov byte ptr [004758B8], 00
:0046CCDA B8BC584700              mov eax, 004758BC
:0046CCDF E8C06CF9FF              call 004039A4
:0046CCE4 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CCE7 E8346FF9FF              call 00403C20

Le call ci-dessus renvoit dans eax la longueur de mon sérial surement.

:0046CCEC 83F80C                  cmp eax, 0000000C

Qui est suivit par une comparaison avec 14 ( 0Ch ). Donc, notre serial doit être long de 14 chars.

:0046CCEF 0F8599000000            jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CCF5 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CCF8 803838                  cmp byte ptr [eax], 38
:0046CCFB 0F858D000000            jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD01 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD04 80780233                cmp byte ptr [eax+02], 33
:0046CD08 0F8580000000            jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD0E 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD11 80780331                cmp byte ptr [eax+03], 31
:0046CD15 7577                    jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD17 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD1A 80780439                cmp byte ptr [eax+04], 39
:0046CD1E 756E                    jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD20 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD23 80780830                cmp byte ptr [eax+08], 30
:0046CD27 7565                    jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD29 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD2C 80780935                cmp byte ptr [eax+09], 35
:0046CD30 755C                    jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD32 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD35 80780A53                cmp byte ptr [eax+0A], 53
:0046CD39 7553                    jne 0046CD8E                  Sinon, jump Serial-Invalid
:0046CD3B 8B45FC                  mov eax, dword ptr [ebp-04]
:0046CD3E 80780B45                cmp byte ptr [eax+0B], 45
:0046CD42 754A                    jne 0046CD8E                  Sinon, jump Serial-Invalid

    Ci-dessus, il y a plusieur verification qui renvoit en :0046CD8E.
    Si vous y jeter un oeil, vous verez que si on jump là, il y a un xor eax,eax ( eax = 0 ) suivit d'un Ret et vu qu'on sait que si cette procédureal renvoit 0 dans al alors le serial est incorrect, on va donc tout faire pour ne pas y jumper !

Si on arrive ici, c'est que le serial est correct !!
:0046CD44 B8BC584700              mov eax, 004758BC
:0046CD49 8B55FC                  mov edx, dword ptr [ebp-04]
:0046CD4C E8A76CF9FF              call 004039F8
:0046CD51 C605B858470001          mov byte ptr [004758B8], 01
:0046CD58 B301                    mov bl, 01
:0046CD5A 33D2                    xor edx, edx
:0046CD5C 8B8600050000            mov eax, dword ptr [esi+00000500]
:0046CD62 E86DCEFCFF              call 00439BD4
:0046CD67 33D2                    xor edx, edx
:0046CD69 8B8614050000            mov eax, dword ptr [esi+00000514]
:0046CD6F E8B8D9FBFF              call 0042A72C
:0046CD74 33D2                    xor edx, edx
:0046CD76 8B8610030000            mov eax, dword ptr [esi+00000310]
:0046CD7C E853CEFCFF              call 00439BD4
:0046CD81 33D2                    xor edx, edx
:0046CD83 8B860C030000            mov eax, dword ptr [esi+0000030C]
:0046CD89 E846CEFCFF              call 00439BD4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0046CCEF(C), :0046CCFB(C), :0046CD08(C), :0046CD15(C), :0046CD1E(C)
|:0046CD27(C), :0046CD30(C), :0046CD39(C), :0046CD42(C)
|
Serial-Invalid
:0046CD8E 33C0                    xor eax, eax  eax = 0
:0046CD90 5A                      pop edx
:0046CD91 59                      pop ecx
:0046CD92 59                      pop ecx
:0046CD93 648910                  mov dword ptr fs:[eax], edx
:0046CD96 68ABCD4600              push 0046CDAB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046CDA9(U)
|
:0046CD9B 8D45FC                  lea eax, dword ptr [ebp-04]
:0046CD9E E8016CF9FF              call 004039A4
:0046CDA3 C3                      ret

    Maintenant qu'on a tout les ingrédiant, place à la cuisine ! .. heu.. au Patch je voulais dire ;) heh



3 ) Le Patch

    Bon, a présent, il y a plusieurs moyen de patcher se prog pour lui faire croire que notre serial est correct :

    Ok, je vous le dis tout de suite que moi je n'hésite pas entre 18 et 5 octets je prend 18 ! .. nan, je déconne je prend 5 évidemment.
    Mais maintenant il va falloir trouvé où placer ce jump pour qu'il n'y ai pas d'erreur. Après une demi-milliseconde, j'ai pensé à le mettre juste après la première vérification ( Longueur = 14 ? ) pour rappel, elle était ici :

:0046CCE7 E8346FF9FF              call 00403C20                Renvoie la longueur dans eax
:0046CCEC 83F80C                  cmp eax, 0000000C            eax = 14 ?
:0046CCEF 0F8599000000            jne 0046CD8E                  Sinon, jump Serial-Invalid

    Vous modifié donc le jne 0046CD8E en un jmp 0046CD44. Mais, vu que sous HView, on doit rentrer Jump Offset Disque, on va d'abord reguardé à quel odffset disque ce trouve 0046CD44. Pour cela, positionné vous sous WDasm sur 0046CD44 et reguardé dans la barre de Status en bas de la fenêtre, vous devriez voire :

@Offset 0006C144h in File:secagent.exe

    Maintenant vous fermez WDasm, vous ouvrez secagent.exe dans HView, vous faite F5 et mettez .0046CCEF. Vous devez voir ceci :

.0046CCEF: 0F8599000000                 jne      .00046CD8E   -------- (1)
.0046CCF5: 8B45FC                       mov       eax,[ebp][-0004]
.0046CCF8: 803838                       cmp       b,[eax],038 ;"8"

    Et vous pressé [F3] pour passer en mode Edition puis [F2] pour passer en mode ASM et vous entrez JMP 6C144 [ENTER] puis [ESC] et [F9] pour appliquer les modification suivit d'un [F10] pour quitter HView.
    C'est maintenant le temps de vérité, lancez secagent.exe et si tout c'est bien déroulé, vous étes enregistré ( vu que le call de vérif est exécuté au démarrage du programme ;) !!




    Ok, je crois que tout le monde à compris hein !? ;) En attendant le prochain projects, je vais mettre mon site à jours.. sur ce A+

   #Crack.FR Official Site : http://crackfr.cjb.net ou http://w3.to/crack.fr

    Join me on  #crack.fr / #eBu / #xplosif ( on UnderNet )
                        or  #Cracking4Newbies / #digital.Factory  ( on EF-net )

   Greetz :  SaTaNiK, TdvFR, JB007, ACiD_BURN, .BAT, T0RNAD0 and every Tutorial Maker ;) !

                                                                                    TeeJi [ just for cracking pleasure ]