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.