jrudiman's tutorial #02
Programa: Quake II
Descripción: Juego Shot 'em up 3D subjetivo.
URL: id Software: Quake II
Tipo de protección: CD-in
Bug: Tener que insertar el CD original en el lector de CDs para poder jugar.
Objetivo: Hacer que se pueda jugar sin tener el CD insertado.
Herramientas: W32Dasm 8.93, Hiew 6.10
Fecha: Junio de 1999

Introducción
Sip, otra vez el Quake II. Nop, no estoy loco. Lo que vamos a hacer esta vez, es saltarse la misma protección pero de un modo diferente, utilizando el mensaje de error que nos aparece.

Al ataque!
Ejecutamos el Quake II sin el CD insertado. Aparece el siguiente mensaje: "You must have the Quake II CD in the drive to play.".
Abrimos el QUAKE2.EXE con el W32Dasm y lo desensamblamos. Nos vamos a StrnRef (String References) y buscamos dicho mensaje de error. Hacemos doble click en él. Aparecerá el siguiente código:

...bla...bla...bla...
:0042B21C TEST EAX,EAX
:0042B21E JE 0042B235
//salta si bad-boy
:0042B220 PUSH EAX
...bla...bla...bla...
:0041B230 CMP EAX,05 //05==CD, 03==HD (usado en la función GetDriveTypeA)
:0042B233 JE 0042B256

*Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042B21E (C)
//llamada desde allá
...bla...bla...bla...
*Possible String Data Ref from Data Obj. -> "You must have the Quake II CD in the drive to play."
:0042B247 PUSH 00424764
//estás aquí
...bla...bla...bla...

Analicemos lo que pasa aquí. Para evitar que se muestre el mensaje de error, tenemos que forzar que el primer JE no salte y que el segundo sí lo haga. Miramos los offsets de los dos saltos condicionales, 2A61Eh y 2A633h respectivamente.
Abrimos el QUAKE2.EXE con el editor hexadecimal, vamos a la dirección 2A61E y cambiamos el 7415 (JE 0042B235 por 9090 (NOP NOP). Y en 2A633 cambiamos el 7421 (JE 00424764) por EB21 (JMP 0042B256).

EOF
Bien! Ya habeis visto otro método para quitar este bug al Quake II.