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. |