23/03/2003 - 13h59 ================================================================================================ Easy CDCHECK reversing Tomb Raider 3 et 4 - nivo 0 lunatic (_lunatic_@caramail.com) ================================================================================================ ============================= Au programme... ============================= -|- A. Introduction -|- B. Tomb Raider 3 | Analyse du shema de protection -|- C. Tomb Raider 3 | Cracking -|- D. Tomb Raider 4 | Analyse du shema de protection -|- E. Tomb Raider 4 | Cracking -|- F. Greetings ================================================================================================ -|- A. Introduction ================================================================================================ En rangeant le sombre merdier present sur mon bureau, je suis tombé sur deux CDs originaux de jeux, oui vous avez bien lu 'originaux'. A l'epoque je claquais allegrement mes deniers dans quelques bons jeux, histoire de faire tourner l'industrie du jeux videos.... Les choses ont bien changé depuis :-) Tout ça m'amene a penser qu'il serait peut etre judicieux de regarder un peu le shema de protection qui etait employé a l'époque, avant de commencer par un cracking pure de CDILLA. On va donc essayer d'étudier a travers cet articles les shemas de protections adopté par la societe 'core design' pour les deux jeux Tomb Raider 3 et Tomb Raider 4. Let's go ================================================================================================ -|- B. Tomb Raider 3 | Analyse du shema de protection ================================================================================================ Le reflex quee j'ai eu c'est d'explorer le cd. Je me suis vite apperçu d'un truc tout bizare : 4 fichiers cachés de 680 mo chacun ! arf, sur un cd de 650 ça fait bocoup. (AWCS.AFP - NEIR.AFP - OKET.AFP - VFAW.AFP). ================================================================================================ -|- C. Tomb Raider 3 | Cracking ================================================================================================ Bon.. je pense que le mieux est de copier tous les fichiers du CD exepté les 4 de 680 mo sur notre disque dur, et de les remplacer par des fichiers txt renommés au nom des 4 fichiers manquant. Il semble evident de ne pas graver le tout. Les programmeurs ne sont pas des quiches a ce point, ils ont due etre assez futé pour demander au prog de vérifier que les fichiers de 680 mo chacun etaient bien présent sur le cd. Pour le tutorial j'ai due ruiner un CD pour voir ce que ça donné. J'install le jeu et je m'appercoit, comme prevu que j'ai burner un CD dans le vent, le JEU demande en effet, le cd : " Tomb Raider III CD ?"..bref.. Je desassemble donc tomb3.exe, et je cherche cette phrase dans les string data references. Mais evidement il n'y a que dalle. OK, ben on fait comment alors ?? Essayons de rechercher les 4 fichiers de 680 c'est à dire AWCS.AFP - NEIR.AFP - OKET.AFP - VFAW.AFP.. pour AWCS.AFP nous avons ça : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048D237(C) | :0048D265 85FF test edi, edi :0048D267 7565 jne 0048D2CE * Possible StringData Ref from Data Obj ->"rb" | :0048D269 68D47A4C00 push 004C7AD4 * Possible StringData Ref from Data Obj ->"d:\AWCS.AFP" | :0048D26E 68F0EF4C00 push 004CEFF0 :0048D273 E8A88C0200 call 004B5F20 :0048D278 8BF0 mov esi, eax :0048D27A 83C408 add esp, 00000008 :0048D27D 85F6 test esi, esi :0048D27F 742C je 0048D2AD arf ..changeons dans Ultra edit le JNE par un JE (75 > 74) pour NEIR.AFP nous avons ça : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048D19F(U) | :0048D1CD 85FF test edi, edi :0048D1CF 0F85F9000000 jne 0048D2CE * Possible StringData Ref from Data Obj ->"rb" | :0048D1D5 68D47A4C00 push 004C7AD4 * Possible StringData Ref from Data Obj ->"d:\NEIR.AFP" | :0048D1DA 68D0EF4C00 push 004CEFD0 :0048D1DF E83C8D0200 call 004B5F20 :0048D1E4 8BF0 mov esi, eax :0048D1E6 83C408 add esp, 00000008 :0048D1E9 85F6 test esi, esi :0048D1EB 742C je 0048D219 bon, la encore ..on va pas se casser trop la tete en 0048D1CF je change 0F85F9000000 > 0F84F9000000 Vous allez me dire, pourkoi mettre 0f85/0f84 ben tout simplement car 0f84/0f85 c'est en code 16bits, 75/74 = 32bits pour OKET.AFP nous avons ça : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048D1EB(C) | :0048D219 85FF test edi, edi :0048D21B 0F85AD000000 jne 0048D2CE * Possible StringData Ref from Data Obj ->"rb" | :0048D221 68D47A4C00 push 004C7AD4 * Possible StringData Ref from Data Obj ->"d:\OKET.AFP" | :0048D226 68E0EF4C00 push 004CEFE0 :0048D22B E8F08C0200 call 004B5F20 :0048D230 8BF0 mov esi, eax :0048D232 83C408 add esp, 00000008 :0048D235 85F6 test esi, esi :0048D237 742C je 0048D265 idem ke precedement en 0048D21B je met 0F84AD000000 pour VFAW.AFP nous avons ça : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048D2C3(C) | * Possible StringData Ref from Data Obj ->"rb" | :0048D185 68D47A4C00 push 004C7AD4 * Possible StringData Ref from Data Obj ->"d:\VFAW.AFP" | :0048D18A 68C0EF4C00 push 004CEFC0 :0048D18F E88C8D0200 call 004B5F20 :0048D194 8BF0 mov esi, eax :0048D196 83C408 add esp, 00000008 :0048D199 85F6 test esi, esi :0048D19B 7504 jne 0048D1A1 :0048D19D 33FF xor edi, edi :0048D19F EB2C jmp 0048D1CD Par contre pour là, ben, je met rien car franchement je ne trouve pas. A croire quee c'est juste un fake, bizare qd meme. Une fois les modfis faites je met mon cd de merde dans le lecteur. Je lance le JEU ..et hop ..bingo :=) cRaCkEd ! ================================================================================================ -|- D. Tomb Raider 4 | Analyse du shema de protection ================================================================================================ Comme pour la version precedente, je vais direct dans l'explorer pour mater le cd au cas ou core design nous aurais remis ces fichiers gonflant. A premiere vu, rien ne semble indiquer une telle protection... Le but etant qd meme de jouer sans CD, nous allons copier la totalité du cd sur le HD. J'installe le tout ..et la.. une fenetre nous informe 'Tomb Raider - The Last Revelation CD' ..héhé ..cool ..allez..gogogo cracking.... ================================================================================================ -|- E. Tomb Raider 4 | Cracking ================================================================================================ Pour changer nous allons utiliser Soft Ice et l'api GETDRIVETYPEA. Je pose donc un bpx getdrivetypea et hop j'arrive là : :00473A23 83F805 cmp eax, 05 J'en vois deja qui se dise : mais pourquoi compare t il au 05 ? hum..explication : 0 = lecteur indeterminé 1 = Répertoire sur la racine n'existe pas 2 = Disque removable 3 = Disue dur 4 = Remote Drive 5 = CD ROM 6 = Ramdisk Je suis sur que maintenant, vous comprenez mieux..non ?maintenant n'essayez pas de NOpé ou modifier les jne juste apres le CMP ça ne marchera pas, du moins moi j'ai pas reussi. Du coup j'ai pris w32dasm et j'ai recherché le : 'Tomb Raider - The Last Revelation CD' * Possible StringData Ref from Data Obj ->"Tomb Raider - The Last Revelation" | :0048D88F 6844354B00 push 004B3544 :0048D894 881D84EE4B00 mov byte ptr [004BEE84], bl :0048D89A A2AF287500 mov byte ptr [007528AF], al :0048D89F 881DA5287500 mov byte ptr [007528A5], bl :0048D8A5 891DBC287500 mov dword ptr [007528BC], ebx :0048D8AB E8A00B0000 call 0048E450 :0048D8B0 83C40C add esp, 0000000C :0048D8B3 84C0 test al, al :0048D8B5 0F8500040000 jne 0048DCBB :0048D8BB E8F060FEFF call 004739B0 :0048D8C0 84C0 test al, al :0048D8C2 7525 jne 0048D8E9 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048D8E7(C) | :0048D8C4 6A25 push 00000025 * Possible StringData Ref from Data Obj ->"Tomb Raider" | :0048D8C6 6838354B00 push 004B3538 * Possible StringData Ref from Data Obj ->"Tomb Raider - The Last Revelation " ->"CD" | :0048D8CB 6810354B00 push 004B3510 :0048D8D0 53 push ebx * Reference To: USER32.MessageBoxA, Ord:01BEh | :0048D8D1 FF15CC814A00 Call dword ptr [004A81CC] :0048D8D7 83F802 cmp eax, 00000002 :0048D8DA 0F84DB030000 je 0048DCBB :0048D8E0 E8CB60FEFF call 004739B0 :0048D8E5 84C0 test al, al :0048D8E7 74DB je 0048D8C4 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048D8C2(C) | :0048D8E9 E8123BFCFF call 00451400 :0048D8EE 8B4D10 mov ecx, dword ptr [ebp+10] :0048D8F1 51 push ecx :0048D8F2 E8B90B0000 call 0048E4B0 :0048D8F7 8B7508 mov esi, dword ptr [ebp+08] :0048D8FA 83C404 add esp, 00000004 En 0048D8C0, puis en 0048D8C2 il test et si le registre est à zero le prog continu de s'executer et tombe sur la messagebox, on Nop le call 4739BO, le AL puis on modifie le JNE en JMP, je vous passe les details, maintenant vous savez comment faire... on teste le tou ..et HoP biNgO ..cracked... voila :) ciao _lunatic_ ================================================================================================ -|- F. Greetings ================================================================================================ #old-school. Special thx to KOR