Quake 3 Arena toutes versions *

* en tous cas jusqu'à la 1.17



Présentation:

Quake 3 Arena est un exellent jeux mais il saoul un peut quand il demande à chaque fois d'insserrer le CD dans le lecteur pour y jouer. Dans ce tutorial nous allons voir comment faire en sorte qu'il ne demande plus le CD en question. Attention! ce tutorial ne vous permettra pas de jouer sur des serveurs officiels car ici la protection de fait par clef CD indéxée sur le serveur maître de Quakexpert.

Outils requis:

WinDasm v8.9x, Softice v3.x ou 4.x et votre éditeur héxadecimale préferé.

Analyse:

Bon, on demarre Quake3, on créer une partie et là il me demande le CD, pas cool. Mon premier reflex est de quiter Q3, de faire une copie de quake3.exe et de l'ouvrir avec WinDasm pour voir si ce fichier n'est pas proteger contre. Cool, ce n'est pas le cas car Quake3.exe se désassemble dans sa totalitée et sans problèmes, ca va me faciliter les choses.

Donc Q3 fait apparaitre un message comme quoi le CD est absent, il doit peut être faire appel au kernel de windows pour executer cette procedure. Cette appel de fonction se nome GetDriveTypeA et là au grand bonheur on peut voir ce passage dans le listing que nous a donner WinDasm :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445310(U)
|
:00445210 81EC84000000		sub esp, 00000084
:00445216 56			push esi

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
|
:00445217 8B359CF04A00		mov esi, dword ptr [004AF09C]
:0044521D C64424053A		mov [esp+05], 3A
:00445222 C64424065C		mov [esp+06], 5C
:00445227 C644240700		mov [esp+07], 00
:0044522C C644240463		mov [esp+04], 63

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004452DD(C)
|
:00445231 8D442404			lea eax, dword ptr [esp+04]
:00445235 50			push eax
:00445236 FFD6			call esi
:00445238 83F805			cmp eax, 00000005
:0044523B 0F8590000000		jne 004452D1

* Possible StringData Ref from Data Obj ->"quake3"
|
:00445241 680CF94B00		push 004BF90C
:00445246 8D4C2408			lea ecx, dword ptr [esp+08]
:0044524A 1			push ecx

* Possible StringData Ref from Data Obj ->"%s%s"
|
:0044524B 6834624B00		push 004B6234
:00445250 68F0915A00		push 005A91F0
:00445255 E863C60500		call 004A18BD

* Possible StringData Ref from Data Obj ->"quake3.exe"
|
:0044525A 6800F94B00		push 004BF900
:0044525F 68F0915A00		push 005A91F0
:00445264 8D542420			lea edx, dword ptr [esp+20]

En voyant ce passage et tout ce qui viens après j'ai été très intriguer. Apparement Quake fait appel au CD pour voir si le fichier quake3.exe est présent et si le CD est bien l'original via une signature variable.

Softice est installer sur mon pc et chargé en mémoire, je pose un point d'arrêt sur GetDriveTypeA. Mais comme Quake3 est un jeux (on en apprend tous les jours) ca va être un peut bancale pour certaines machines, donc pour ce faire je lance Quake et je fait Crtl+D pour normalement faire apparaître l'interface de Softice ( ce qui n'est pas tout le temps le cas mais elle est bien là vu que l'interface se bloques même si on ne le voit pas ). Je tape (en aveugle des fois car le tableau n'apparait pas) " bpx getdrivetypea " dans la ligne de commande puis valide. Si j'ai été obliger de faire ca en naveugle, je quitte Quake et dans windows de refais la même opperation histore d'être sur que j'ai bien tout fait, apparement oui puisque Softice me dis " Duplicate breakpoint ". Tout de suite après je relance Quake et démarre un partie au hazard.

Et là paf! Un gros message sur le point d 'arret deGetDriveTypeA apparait. Je fais plusieurs fois F5 pour continuer et là le message d'erreur comme quoi il n'y à pas de CD s'affiche. Donc Quake 3 fait bien appel à cette verification grâce kernel.

C'est bon, t'es griller maintenant on va te faire sauter tout ca.

J'attaque:

Là on retourne dans WinDasm et on retourne à la première occurande trouvée quand on à chercheGetDriveTypeA, donc à cet endroit :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00445310(U)
|
:00445210 81EC84000000 		sub esp, 00000084
:00445216 56                     push esi

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
|
:00445217 8B359CF04A00																																																																																									mov esi, dword ptr [004AF09C]
:0044521D C64424053A		mov [esp+05], 3A
:00445222 C64424065C		mov [esp+06], 5C
:00445227 C644240700		mov [esp+07], 00
:0044522C C644240463		mov [esp+04], 63

Là il ne me reste plus qu'à remonter à la source. Je retourne au début du listing et lance une recherche sur 445310 car c'est sur cette ligne que se trouve le saut qui va dans la zone de vérification. Là on tombe ici de cette façon là:

* Possible StringData Ref from Data Obj ->"fs_restrict"
|
:00432433 6834364B00		push 004B3634
:00432438 E833CEFEFF		call 0041F270
:0043243D D81DF0F34A00		fcomp dword ptr [004AF3F0]
:00432443 83C404			add esp, 00000004
:00432446 DFE0			fstsw ax
:00432448 F6C440			test ah, 40
:0043244B 7418			je 00432465
:0043244D E8BE2E0100		call 00445310
:00432452 85C0			test eax, eax
:00432454 750F			jne 00432465

* Possible StringData Ref from Data Obj ->"Game CD not in drive"
|
:00432456 68A4BE4B00		push 004BBEA4
:0043245B 6A03			push 00000003
:0043245D E82E9FFEFF		call 0041C390
:00432462 83C408			add esp, 00000008

Ca tombe sur un Call, on entre dedans pour voir ce qu'il s'y passe. Là je tombe sur un jump, je regarde où il saute... et comme par hazard je retombe sur :

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
|
:00445217 8B359CF04A00		mov esi, dword ptr [004AF09C]
:0044521D C64424053A		mov [esp+05], 3A
:00445222 C64424065C		mov [esp+06], 5C
:00445227 C644240700 		mov [esp+07], 00
:0044522C C644240463		mov [esp+04], 63

Conclusion :

Là c'est claire, Quake 3 est grillé jusqu'à la moëlle. En revenant au call 00445310 j'ai deux solutions, soit le virer pour que le prog ne fasse plus appel à une vérification grâce à GetDriveTypeA, soit je transforme le je 00432465 qui saute par dessus "Game CD not in drive" en saut inconditionnel qui dans tout les cas va s'effectuer et sauter par dessus tout ca.

Pour virrer c'est tout bête, j'ouvre Quake3.exe avec mon éditeur héxa (bon, il faut que je le dise, HexWorks Shop est sans aucain doute l'un des meilleurs), je cherche E8BE2E0100 qui est la valeur héxa du Call 00445310 et je remplace tout ca par des nop ce qui donne au final 9090909090. Ou si je veux me faire le jne 00432465, je look une ligne en dessous, je vois 750F que je transforme en EB0F.

Voilà c'est tout! Mais perso je préfere virer le call comme ca j'ai plus l'impression de lui avoir mis une grosse banane dans la tronche à ce GetDriveTypeA :)