******************************************************************************
{{{{{{{{{{{{{{{{{{{{{{{{{{{{  Crack de Half-Life  }}}}}}}}}}}}}}}}}}}}}}}}}}}}
******************************************************************************

Petit crack en passant. Je veux installer les bots pour counter strike. Malheureusement, il faut passer par "nouvelle partie" dans half-life. En faisant cela : "Veuillez insérer le CD-ROM...", fait 3 fois d'affilé.

Classique quoi.
Nous ne nous embêtons pas, nous prenons direct SOFTICE et nous plaçons un:
bpx GetDiskFreeSpaceA
C'est une api utilisée dans la détection des CD originaux. Puis nous lançons une partie. SI apparait. Nous traçons avec F10 jusqu'à l'apparition du message. Lorsque le message apparaît, nous faisons Ok et nous nous retrouvons de nouveau sous softice. Nous sommes sur un call en 0040EF69 :
------------------------------------------------------------------------------------
:0040EF69   E8F2D4FFFF             call 0040C460
------------------------------------------------------------------------------------
Cela peut nous servir et nous permet de nous situer dans le proggy. En tracant un peu par des F12 et des F10, nous tombons la dessus:
------------------------------------------------------------------------------------
:0040F05B   46                     inc esi
:0040F05C   83FE03                 cmp esi, 00000003
:0040F05F   0F8CC9FEFFFF           jl 0040EF2E
------------------------------------------------------------------------------------
Ces quelques lignes de codes permettent de faire boucler le prog 3 fois. Comme pour vérifier s'il y a le CD. Voila le listing complet:
------------------------------------------------------------------------------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040F05F(C)
|
:0040EF2E   8B442414               mov eax, dword ptr [esp+14]
:0040EF32   50                     push eax
:0040EF33   FFD7                   call edi
:0040EF35   6A00                   push 00000000
:0040EF37   6A02                   push 00000002
:0040EF39   8D4C2424               lea ecx, dword ptr [esp+24]
:0040EF3D   E84E8F0400             call 00457E90
:0040EF42   6854010000             push 00000154
:0040EF47   C784246806000000000000 mov dword ptr [esp+00000668], 00000000
:0040EF52   E809520500             call 00464160
:0040EF57   8D4C2420               lea ecx, dword ptr [esp+20]
:0040EF5B   50                     push eax
:0040EF5C   51                     push ecx
:0040EF5D   E8BE940400             call 00458420
:0040EF62   83C40C                 add esp, 0000000C
:0040EF65   8D4C241C               lea ecx, dword ptr [esp+1C]
:0040EF69   E8F2D4FFFF             call 0040C460
:0040EF6E   83F801                 cmp eax, 00000001
:0040EF71   0F85FA000000           jne 0040F071
:0040EF77   E8847DFFFF             call 00406D00      !!! test la présence du cd !!!
:0040EF7C   85C0                   test eax, eax
:0040EF7E   0F85AF010000           jne 0040F133       !!! saut en cas de non égalité !!!
:0040EF84   A148CC4D00             mov eax, dword ptr [004DCC48]
:0040EF89   85C0                   test eax, eax
:0040EF8B   7405                   je 0040EF92
:0040EF8D   E87E52FFFF             call 00404210

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040EF8B(C)
|
:0040EF92   8B542418               mov edx, dword ptr [esp+18]
:0040EF96   52                     push edx
:0040EF97   FFD7                   call edi
:0040EF99   68D0070000             push 000007D0
:0040EF9E   FFD3                   call ebx
:0040EFA0   C784246406000011000000 mov dword ptr [esp+00000664], 00000011
:0040EFAB   8D8424B8030000         lea eax, dword ptr [esp+000003B8]
:0040EFB2   89AC24B8030000         mov dword ptr [esp+000003B8], ebp
:0040EFB9   89442410               mov dword ptr [esp+10], eax
:0040EFBD   8D8C24B8030000         lea ecx, dword ptr [esp+000003B8]
:0040EFC4   C684246406000017       mov byte ptr [esp+00000664], 17
:0040EFCC   E8B6A30800             call 00499387
:0040EFD1   8D8C24AC030000         lea ecx, dword ptr [esp+000003AC]
:0040EFD8   89AC24AC030000         mov dword ptr [esp+000003AC], ebp
:0040EFDF   894C2410               mov dword ptr [esp+10], ecx
:0040EFE3   8D8C24AC030000         lea ecx, dword ptr [esp+000003AC]
:0040EFEA   C684246406000018       mov byte ptr [esp+00000664], 18
:0040EFF2   E890A30800             call 00499387
:0040EFF7   8D8C24A4030000         lea ecx, dword ptr [esp+000003A4]
:0040EFFE   C684246406000014       mov byte ptr [esp+00000664], 14
:0040F006   E8076A0800             call 00495A12
:0040F00B   8D8C24A4020000         lea ecx, dword ptr [esp+000002A4]
:0040F012   C684246406000013       mov byte ptr [esp+00000664], 13
:0040F01A   E801E60200             call 0043D620
:0040F01F   8D8C24B4010000         lea ecx, dword ptr [esp+000001B4]
:0040F026   C684246406000012       mov byte ptr [esp+00000664], 12
:0040F02E   E8EDE50200             call 0043D620
:0040F033   8D8C2484000000         lea ecx, dword ptr [esp+00000084]
:0040F03A   C684246406000011       mov byte ptr [esp+00000664], 11
:0040F042   E8A9150300             call 004405F0
:0040F047   8D4C241C               lea ecx, dword ptr [esp+1C]
:0040F04B   C7842464060000FFFFFFFF mov dword ptr [esp+00000664], FFFFFFFF
:0040F056   E805D6FFFF             call 0040C660
:0040F05B   46                     inc esi               !!!
:0040F05C   83FE03                 cmp esi, 00000003     !!! boucle 3 fois
:0040F05F   0F8CC9FEFFFF           jl 0040EF2E           !!!
------------------------------------------------------------------------------------
Mais même avant cela il y a un premier test :
------------------------------------------------------------------------------------
* Referenced by a CALL at Address:
|:0040F717   
|
:0040EED0   64A100000000           mov eax, dword ptr fs:[00000000]
:0040EED6   6AFF                   push FFFFFFFF
:0040EED8   6853024A00             push 004A0253
:0040EEDD   50                     push eax
:0040EEDE   64892500000000         mov dword ptr fs:[00000000], esp
:0040EEE5   81EC4C060000           sub esp, 0000064C
:0040EEEB   53                     push ebx
:0040EEEC   55                     push ebp
:0040EEED   56                     push esi
:0040EEEE   57                     push edi
:0040EEEF   E80C7EFFFF             call 00406D00    !!! appel du test !!!
:0040EEF4   85C0                   test eax, eax
:0040EEF6   0F85FB020000           jne 0040F1F7     !!! saute si CD valide !!!
------------------------------------------------------------------------------------
Nous trouvons cette partie de code grâce a la routine de vérification trouvée avant. En effet W32dasm donne l'endroit où ces routines sont appelées. Pour notre patch, c'est très facile. Nous transformons :
jne 0040F1F7     saute si OK         en:
je 0040F1F7      saute pour la condition inverse
pour que ce saut ait lieu et que le CD soit considéré valide.

(ps: vous auriez sans doute voulu mettre un jmp, mais cela implique d'écraser 0F par un nop (90) puis de mettre E9. Car il n'y a pas de jmp de la forme 0F .)

soit en hexa:
0F85FB020000 en 0F84FB020000    a l'offset EEF6h (cf barre des taches de W32dasm)
Tout pourrait aller pour le mieux mais non. Il y a une protection de forme checksum :
"Half-Life"
"l'éxecutable d'half-life a subit une modification..."
Voila comment il nous accueile!

Nous reprennons softice et nous plaçons ceci:
bpx MessageBoxA
Nous relançons et il break. Un petit F12 et nous revoila dans HL.EXE en 0049A9E6 :
------------------------------------------------------------------------------------
:0049A9D8   53                 push ebx
:0049A9D9   57                 push edi
:0049A9DA   FF7508             push [ebp+08]
:0049A9DD   FF75F4             push [ebp-0C]

* Reference To: USER32.MessageBoxA, Ord:01BEh
------------------------------------------------------------------------------------
Deux autres petits F12 sous Softice pour remonter et voila ce que nous avons:
------------------------------------------------------------------------------------
:0042258B   7420               je 004225AD    *** lorsque tout est OK, il  ***
:0042258D   6A00               push 00000000  *** fait un saut et continue ***
:0042258F   6A30               push 00000030
:00422591   68D9010000         push 000001D9
:00422596   E8C51B0400         call 00464160
:0042259B   83C404             add esp, 00000004
:0042259E   50                 push eax
:0042259F   E871840700         call 0049AA15
:004225A4   E8C7160000         call 00423C70   !!! là il affiche l'erreur !!!
:004225A9   33C0               xor eax, eax
:004225AB   EB05               jmp 004225B2
------------------------------------------------------------------------------------
Il suffit donc de modifier :
je  004225AD       en:
Jmp 004225AD
Soit en Hexa a l'offset 2258Bh :
7420 en EB20
Pour résumer : première solution:
offset EEF7h : 84            (décimal: 61175 - 132)
offset 2258Bh : EB           (décimal: 140683 - 235)
deuxième solution plus convenable: (avec jmp, voir plus haut)
offset EEF6h : 90            (décimal: 61174 - 144)
offset EEF7h : E9            (décimal: 61175 - 233)
offset 2258Bh : EB           (décimal: 140683 - 235)
Vraiment c'est pas très difficile. Je l'ai d'ailleurs cracké pour un pote qui ne m'en croyait pas capable ! héhé. Half-Life RuLeZ.

ps: n'ayez pas peur de cracker des jeux, ce n'est pas plus compliqué :)
ps2: Half-Life est le meilleur jeu ! je vous le dis.



TiPiaX/VDS