Nom : Fifa 99 Version : Update 1.11 Française Disponibilité : http://www.easports.com Protection : Cd-check sans utilisation de 'GETDRIVETYPEA' Outils : SoFTiCe 4.0 WindAsM 8.93 HexWorkShop Cerveau (si disponible) Je ne présente pas Fifa 99 : c'est la meilleure simulation de sport en matière de foot,en attendant Fifa 2000... C'est aussi un des rares jeux (le seul en fait) auquel je joue seul... La proctection n'est pas évidente, quoique si, mais pas conventionnel car le cd-check n'utilise pas l'API 'GetDriveTypeA' .Mais vous allez voir que le moyen employé pour cracker ce soft est très simple... Step 1: Installez Fifa 99 . Installez l'update 1.11 .Enlevez le CD original et lancez fifa 99. Bien sur un beau nagscreen apparaît : 'Veuillez insérer le CD' . On prend symbol loader (livré avec softice) ,on ouvre Fifa on met un breakpoint sur l'API 'GetDriveTypeA' qui, je le rappelle, sert à tester la présence d'un CD (voir intro pour + d'infos) .Sous softice on tape : BPX GetDriveTypeA. On relance le tout avec la touche F5. Normalement softice aurait du se déclencher au moment où le jeu teste la présence du CD.Oui,mais apparement, le jeu n'utilise pas l'api GetDriveTypeA pour tester la présence du CD.Ou le programmeur a codé une routine de détection de Breakpoint sur l'api GetDriveTypeA, ce qui expliquerait aussi pourquoi softice ne se bloque pas . A mon avis, le programmeur s'est plutôt pris la tête à réécrire une routine pour tester la présence ou si c'est le bon cd , ce qui rend inutilisable le bpx GetDriveTypeA... Step 2: Là,on est quand même un peu embêté car le soft n'utilise pas une api standart dans sa protection .On va le cracker par un autre endroit : vous vous souvenez du message 'Veuillez insérer le CD' ? Il y a de fortes chances que ce message soit envoyé par le biais de l'API 'MessageBoxA' (ça s'appelle le flair...) ... On va donc mettre un breakpoint sur l'API 'MessageBoxA' . On reprend softice ,on rouvre fifa 99 et on tape sous softice : BPX MessageBoxA. Ce coup-ci softice se déclenche, ce qui est tout bon pour nous... Au moment où vous allez vous retrouver dans softice, vous n'êtes pas dans le code du jeu : vous vous trouvez au début de l'API windows 'MessageBoxA' .Pour vous retrouver dans le code principal du jeu, il faut 'remonter' dans le code . Pour cela on utilise la touche F12 . Appuyez 1 Fois sur F12 et on clique sur 'ok' à l'apparition du nag et se retrouve là: 15f:42d109 Call CS:[user32!MessageBoxA] ----------notre api... 15f:42d110 Cmp eax,01 Donc notre MessageBoxA est appelé à l'addresse 42d109. On prend maintenant Windasm 8.93 et on désassemble fifa99. On se rend à l'adresse 42d109 et on tombe sur ça : * Referenced by a CALL at Addresses: |:0042CBB7 , :0042E772 , :0042E9B2 , :0042EB7E , :0043E882 -------- interressant .... :0042D0A0 push ebx :0042D0A1 push ecx :0042D0A2 push edx :0042D0A3 push esi :0042D0A4 mov ebx, eax :0042D0A6 mov edx, dword ptr [0057DA24] :0042D0AC xor esi, esi :0042D0AE test edx, edx :0042D0B0 je 0042D0B7-------- on saute vers le nag :0042D0B2 pop esi :0042D0B3 pop edx :0042D0B4 pop ecx :0042D0B5 pop ebx :0042D0B6 ret * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042D0B0(C) :0042D0B7 mov dword ptr [0057DA24], 00000001 :0042D0C1 call 00497284 :0042D0C6 cmp dword ptr [0057F420], 00000000 :0042D0CD jne 0042D15D * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042D167(C) :0042D0D3 cmp dword ptr [0057F424], 00000000 :0042D0DA je 0042D0E4 :0042D0DC call dword ptr [0057F424] :0042D0E2 mov esi, eax * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042D0DA(C) :0042D0E4 cmp dword ptr [0057F428], 00000000 :0042D0EB je 0042D0F3 :0042D0ED call dword ptr [0057F428] * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042D0EB(C) :0042D0F3 push 00000001 * Reference To: USER32.ShowCursor, Ord:0023h :0042D0F5 Call dword ptr cs:[0056A3F0] :0042D0FC push 00011040 * Possible StringData Ref from Data Obj ->'FIFA 99' :0042D101 push 0056D230 :0042D106 push ebx :0042D107 push 00000000 * Reference To: USER32.MessageBoxA, Ord:0017h :0042D109 Call dword ptr cs:[0056A3C0]------ 42d109 = notre MessageBoxA.... :0042D110 cmp eax, 00000001 :0042D113 jne 0042D13B :0042D115 cmp dword ptr [0057F40C], 00000000 :0042D11C je 0042D13B :0042D11E cmp dword ptr [0057F410], 00000000 :0042D125 je 0042D13B :0042D127 push ebx * Possible StringData Ref from Data Obj ->'%s' :0042D128 push 0056D238 :0042D12D call 0043ED6E :0042D132 add esp, 00000008 :0042D135 call dword ptr [0057F410] * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0042D113(C), :0042D11C(C), :0042D125(C) :0042D13B test esi, esi :0042D13D je 0042D146 :0042D13F push esi On trouve bien l'appel à notre messageboxa en 42d109 . En remontant plus haut dans le code on remarque un saut conditionnel très interressant , à l'addresse 42d0b0 . En effet ce saut conditionnel nous fait sauter vers le nag en 42d109... Mon premier premier réflexe a donc été de virer ce saut conditionnel, de façon à ne plus aller vers le nag . Pas de pot ça ne marche pas : le jeu plante . J'ai donc repris windasm et je suis remonté encore avant le saut conditionnel que je viens de virer .On voit que cette portion du code est rérérencé par 5 calls: Voir début désassemblage. J'ai donc repris mon symbol loader et j'ai mis 5 breakpoints aux adresses que m'indiquait Windasm : sous softice tapez BPX 0042CBB7,BPX 0042E772,BPX 0042E9B2,BPX 0042EB7E,BPX 0043E882. Step 3 : Mes breakpoints placés, je relance le jeu avec F5 . Ce dernier se bloque à l'addresse 42E772, addresse correspondant au deuxième breakpoints que je viens de mettre . J'appuie sur F5 de nouveau pour voir si le soft ne bloque pas à un autre endroit.non, donc j'en déduis que mon messagebox me demandant le CD n'est appellé qu'à l'addresse 42E772. On reprend windasm et on se rend à l'addresse 42E772.On tombe sur ça : * Referenced by a CALL at Addresses: |:0042E712 , :0043D973 :0042E71C push ecx :0042E71D push esi :0042E71E sub esp, 00000200 :0042E724 mov esi, eax :0042E726 mov eax, 0062BBE4 :0042E72B call 0042E7E0--------------- CD-CHECK ! :0042E730 xor ecx, ecx :0042E732 test eax, eax :0042E734 jne 0042E777---------------- saut effectué si bon CD :0042E736 test esi, esi :0042E738 je 0042E780 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042E7D9(U) :0042E73A mov eax, 000006FB :0042E73F call 0045C374 :0042E744 push eax * Possible StringData Ref from Data Obj ->'%s' :0042E745 push 0056D614 :0042E74A lea eax, dword ptr [esp+08] :0042E74E push eax :0042E74F call 0043E8BE :0042E754 add esp, 0000000C :0042E757 test esi, esi :0042E759 jne 0042E76B :0042E75B test ecx, ecx :0042E75D je 0042E766 :0042E75F mov eax, ecx :0042E761 call 0042CCA0 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042E75D(C) :0042E766 call 0045C334 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042E759(C) :0042E76B call 00435BCC :0042E770 mov eax, esp :0042E772 call 0042D0A0------------------ le call qui appelle le nag * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042E734(C) :0042E777 add esp, 00000200 :0042E77D pop esi :0042E77E pop ecx :0042E77F ret En 42e772 on repère bien notre call et en remontant un peu plus haut, on remarque quelque de très bon pour nous : à l'addresse 42E72B il y a un call suivit d'un saut conditionnel en 42E734 qui s'il est effectué ,nous fait sauter au dessus du call qui appelle le nag ... On reprends symbol loader ,on ouvre fifa99,on efface les breakpoints précédent (BC *) et on remet un breakpoint à l'addresse du saut conditionnel qui nous interresse : BPX 42E734 .On relance le tout avec F5 . Softice se bloque bien en 42e734.On tape E 42E734 sous softice pour se retrouver dans l'éditeur hexadécimale de ce dernier . On remplace le 75 par un EB (jump enhexa) . On relance avec F5 et ce coup-ci,ça marche....Vous voyez quand vous voulez... Pour ce crack, prendre son éditeur hexa et se rendre à l'offset 2DB34 et mettre EB . TaMaMBoLo