479 lines
19 KiB
HTML
479 lines
19 KiB
HTML
<html>
|
|
|
|
<head>
|
|
<meta http-equiv="Content-Type"
|
|
content="text/html; charset=iso-8859-1">
|
|
<meta name="Autor"
|
|
content="Jose-David.Guillen@.cs.us.es || 1998 (c) || ">
|
|
<meta name="AvisoLegal"
|
|
content="No me hago responsable de las aplicaciones delictivas, derivadas de mis tutoriales. Y me remito al ejemplo del Zapato">
|
|
<meta name="Trabajo"
|
|
content="Diseño páginas Web para empresas, Calidad y Profecionalidad garantizadas, implementación de las últimas técnicas de desarrollo.">
|
|
<meta name="Zapato"
|
|
content="No es ilegal llevar un zapato en la mano, pero seguro que te detienen si vas dando zapataZos a la gente.">
|
|
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
|
|
<title>Trucos, sobre como crackear un juego</title>
|
|
</head>
|
|
|
|
<body background="Webj-f0.gif" bgcolor="#FFDE00" topmargin="10"
|
|
leftmargin="20">
|
|
|
|
<p><a name="Inicio"></a><font size="2">Todo lo que siempre
|
|
quisiste saber, y nunca nadie supo decirte: <strong>¿Como
|
|
crackear un Juego?</strong></font></p>
|
|
|
|
<p><font size="2">Aqui aprenderas, con el tiempo, desde como
|
|
llegar al final de cualquier juego, sin dificultades, hasta como
|
|
eliminar las claves de los mismos, con ejemplos e ilustraciones,
|
|
para que hasta tu, puedas hacerlo, no te ofendas.</font></p>
|
|
|
|
<p><font size="2">-- Antes de empezar, quiero decir que nada de
|
|
los que hay aqui infringe la ley, salvo la utilización que tu
|
|
hagas de la información, es como los zapatos, no es ilegal
|
|
llevarlos ni que te los vean, pero seguro que te detienen si vas
|
|
por hay usandolos para tirarselos a la cabeza a la gente.--</font></p>
|
|
<div align="center"><center>
|
|
|
|
<table border="2" cellpadding="4" width="90%"
|
|
bordercolor="#FF7331" bordercolordark="#808000"
|
|
bordercolorlight="#FFFFFF">
|
|
<tr>
|
|
<td width="50%"><strong>Parte I</strong>: <a
|
|
href="#Parte I">Las partidas salvadas son faciles</a></td>
|
|
<td width="50%"><strong>Parte II:</strong> <a
|
|
href="#Parte II">La memoria es incierta</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td width="50%"><strong>Parte III: </strong><a
|
|
href="#Parte III">Que molestas son las claves</a></td>
|
|
<td width="50%"><strong>Parte IV: </strong><a
|
|
href="#Parte IV">Algunos prog. de interes</a></td>
|
|
</tr>
|
|
</table>
|
|
</center></div>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<hr>
|
|
|
|
<p><a name="Parte I"></a><strong>Parte I</strong>: Las partidas
|
|
salvadas son faciles</p>
|
|
|
|
<p>Antes de empezar, aviso que será necesaria alguna utilizadad
|
|
capaz de abrir un archivo binario y mostrarlo de forma
|
|
hexadecimal. Visita la "Parte IV", para y consiguete
|
|
alguno. Si te sirve de algo, yo utilizo el TurboDebuger de
|
|
Borland Inc. a parte, es el que necesitaras utilizar en la
|
|
"Parte III", o almenos otro parecido.</p>
|
|
|
|
<p>¿Tienes ya las herramientas? </p>
|
|
|
|
<p>Vale, empecemos con un poco de teoría:</p>
|
|
|
|
<blockquote>
|
|
<p><em>Cuando un juego graba una partida, normalmente lo hace
|
|
de forma ordenada, siempre coloca en las mismas posiciones
|
|
cosas similares. Estos datos no son mas que la posición y
|
|
estado en que se encontraba el juego, justo en el momento de
|
|
salvar la partida. Algunos de estos datos son fáciles de
|
|
localizar como "vidas, energía, cantidad de
|
|
disparo...". </em></p>
|
|
<p><em>¿Cómo buscar?, Bien, lo que debemos hacer es </em><em><u>grabar</u></em><em>
|
|
un mínimo de </em><em><u>tres partidas</u></em><em>, con
|
|
tres </em><em><u>estados diferentes</u></em><em> del valor
|
|
que nos interesa mantener, (por ejemplo la cantidad de
|
|
dinero). Acto seguido </em><em><u>buscaremos las
|
|
coincidencias</u></em><em> de esos valores, en los tres o
|
|
más archivos, hasta encontrar una coincidencia en todos y
|
|
que se encuentra </em><em><u>en la misma posición</u></em><em>,
|
|
esa será la posición de lo que buscamos, no tenemos mas que
|
|
camibiar el valor, (cambiando asi la cantidad de dinero,
|
|
ejem.).</em></p>
|
|
<p><em>No te apresures, debes saber que los números no se
|
|
almacenan como piensas, sino que depende de tu máquina:
|
|
existen del tipo LittelEndian (parte baja del nº primero) o
|
|
BigEndian (parte alta del nº primero) caso del PC.</em></p>
|
|
<p align="right"><em>(</em><em><strong>d</strong></em><em>)ecimal
|
|
/ (</em><em><strong>h</strong></em><em>)exadecimal</em></p>
|
|
<p><em>Ejemplo: </em></p>
|
|
<blockquote>
|
|
<p><em>Si buscas el número 34.500</em><em><strong>d</strong></em><em>
|
|
--> 86C4</em><em><strong>h</strong></em></p>
|
|
<p><em>Se guardará la parte alta (8 bits) primero y la
|
|
parte baja (8 bits) despues: C486</em><em><strong>h</strong></em><em>.</em></p>
|
|
</blockquote>
|
|
<p><em>Eso no es todo, ¿Cómo es de grande el número que
|
|
buscas?. Debes pensar como un programador, o almenos con un
|
|
poco de intuición. En el ordenador, los números, vienen
|
|
representados, como norma general, en bloques de 8 bits, o lo
|
|
que es lo mismo 1 byte.</em></p>
|
|
<p><em>Si lo que buscamos es el lugar de almacenamiento de
|
|
las vidas, es lógico pensar que para ello han utilizado un
|
|
simple "byte". A continuación os enseño cuantos
|
|
bits, ocupan los ditintos tipos de números que existen, y
|
|
cual es la cantidad máxima que pueden contener, (con o sin
|
|
signo).</em></p>
|
|
<div align="center"><center><table border="1" width="80%"
|
|
bordercolordark="#808000" bordercolorlight="#FFFFFF">
|
|
<tr>
|
|
<td><div align="center"><center><table border="1"
|
|
cellpadding="2" cellspacing="0" width="100%">
|
|
<tr>
|
|
<td bgcolor="#000000"><font color="#FFC832"><strong>Tipo</strong></font></td>
|
|
<td align="center" bgcolor="#000000"><font
|
|
color="#FFC832"><strong>Longitud</strong></font></td>
|
|
<td align="center" bgcolor="#000000"><font
|
|
color="#FFC832"><strong>Rango</strong></font></td>
|
|
</tr>
|
|
<tr>
|
|
<td>unsigned char</td>
|
|
<td align="right">8 bits</td>
|
|
<td align="center"><em>0 to 255</em></td>
|
|
</tr>
|
|
<tr>
|
|
<td>char</td>
|
|
<td align="right">8 bits</td>
|
|
<td align="center"><em>-128 to 127</em></td>
|
|
</tr>
|
|
<tr>
|
|
<td>unsigned int</td>
|
|
<td align="right">16 bits</td>
|
|
<td align="center"><em>0 to 65,535</em></td>
|
|
</tr>
|
|
<tr>
|
|
<td>int</td>
|
|
<td align="right">16 bits</td>
|
|
<td align="center"><em>-32,768 to 32,767</em></td>
|
|
</tr>
|
|
<tr>
|
|
<td>unsigned long</td>
|
|
<td align="right">32 bits</td>
|
|
<td align="center"><em>0 to 4,294,967,295</em></td>
|
|
</tr>
|
|
<tr>
|
|
<td>long</td>
|
|
<td align="right">32 bits</td>
|
|
<td align="center"><em>-2,147,483,648 to
|
|
2,147,483,647</em></td>
|
|
</tr>
|
|
</table>
|
|
</center></div></td>
|
|
</tr>
|
|
</table>
|
|
</center></div><p><em><strong>Nota:</strong></em><em> Si el
|
|
número que buscas esta dentro del rango de arriba, aunque no
|
|
esté completo debes rellenar lo que falta al buscar.</em></p>
|
|
<p><em>Ejemplo:</em></p>
|
|
<blockquote>
|
|
<p><em>Buscamos el dinero, y en este momento tenemos 10
|
|
creditos, pero sabemos que podemos tener hasta 20.000
|
|
creditos como máximo -> el número estará en el
|
|
rango de los enteros (int 16bits).</em></p>
|
|
<p><em>Al buscar 10</em><em><strong>d</strong></em><em>
|
|
hemos de escribir A000</em><em><strong>h</strong></em><em>,
|
|
¿no?, Pues no, recuerda que tu máquina es BigEndian por
|
|
lo que tendras que escribir 00A0</em><em><strong>h</strong></em><em>.</em></p>
|
|
</blockquote>
|
|
</blockquote>
|
|
|
|
<p>Si te has empapado bien de la teoría, podemos pasar a un
|
|
ejemplo práctico, que aplicaremos al juego <em>Civilization 2</em>:</p>
|
|
|
|
<p>Buscamos la posición física del dinero, dentro de la partida
|
|
salvada.</p>
|
|
|
|
<p>1º ¿Qué sabemos? Sabemos que el dinero puede sobrepasar los
|
|
256 creditos asi que el dinero ocupo, por lo menos 16 bits.</p>
|
|
|
|
<p>2º Hemos salvado tres partidas; ( a1.sav | a2.sav | a3.sav ),
|
|
con ( 300 | 75 | 250 ) creditos respectivamente.</p>
|
|
|
|
<p>3º Pasamos las cantidades a hexadecimal y agrupamos las
|
|
partes altas y bajas: ( 300<strong>d</strong> = 12C<strong>h</strong>
|
|
| 75<strong>d</strong> = 4B<strong>h</strong> | 250<strong>d</strong>
|
|
= FA<strong>h</strong> )</p>
|
|
|
|
<p>4º Buscamos las primeras coincidencias en cada archivo de las
|
|
cadenas ( C012<strong>h</strong> | 004B<strong>h</strong> | 00FA<strong>h</strong>
|
|
).</p>
|
|
|
|
<p>¿Coinciden las posiciones física? No = continua en el paso
|
|
4º.</p>
|
|
|
|
<p>5º Hemos encontrado la posición física, cuanto queriamos ¿
|
|
20.000 creditos ?. Pues 20.000<strong>d</strong> = 4E20<strong>h</strong>,
|
|
por lo que sustituimos el valor a partir de la posición
|
|
encontrada por 20E4<strong>h</strong>, recuerda: BigEndian.</p>
|
|
|
|
<p> </p>
|
|
|
|
<p>Fin del Capitulo, si te queda alguna duda dimelo, de ese modo,
|
|
sabré los puntos debiles de este tutorial, y los elimaré para
|
|
de ese modo ir perfeccionandolo.</p>
|
|
|
|
<p><a href="#Inicio"><img src="back4.gif" align="right"
|
|
border="0" hspace="0" width="20" height="22"></a></p>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<hr>
|
|
|
|
<p><a name="Parte II"></a><strong>Parte II:</strong> La memoria
|
|
es incierta</p>
|
|
|
|
<p>Lo que quiero decir, es que la memoria es incostante, todo en
|
|
ella cambia, lo que ahora esta en una posición, dentro de cinco
|
|
minutos, estará en otra. </p>
|
|
|
|
<p>Todo lo dicho en el capitulo anterior, sería aplicable a
|
|
este, de hecho, para juegos antiguos de MS-DOS, es totalmente
|
|
valido, incluso existen aplicaciones (ver. Parte IV) para ello.
|
|
El problema de ahora, es que todo es dinámico, todo cambia, y es
|
|
mas dificil localizar, lo que buscamos. Pero a pesar de esto,
|
|
siempre existe el orden dentro del caos, y para aplicar las
|
|
lecciones anteriores, se requieren cierta modificaciones a
|
|
nuestra forma de pensar.</p>
|
|
|
|
<p>Ahora, lo constante, no son las posiciones físicas que
|
|
contienen los valores, sino punteros, dirigidos a esos valores.
|
|
La busqueda, a partir de ahora es tediosa y complicada, pero el
|
|
fruto de esta busqueda es el conocimiento del orden, mediante el
|
|
cual podemos construir un pequeño programa que se ejecute en
|
|
segundo plano, bloqueando el contenido, apuntado por el puntero,
|
|
del cual siempre conoceremos su posición física.</p>
|
|
|
|
<p>Para la localización del puntero, debemos realizar los pasos
|
|
de la Parte I, pero aplicados a memoria, una vez conocida la
|
|
dirección, buscaremos por todo el rango de memoria destinado al
|
|
programa, valores que concuerden con la dirección física
|
|
(segmento:desplazamiento), del valor. DirecciónP = dirección
|
|
física - dirección de carga del programa.</p>
|
|
|
|
<p>Una vez conocida estas direcciones, el programa de segundo
|
|
plano, estará continuamente o cuando se requiera, escribiendo en
|
|
la direccion apuntada por el puntero. La dirección del puntero,
|
|
será la dirección de carga del programa + DirecciónP.</p>
|
|
|
|
<p>Podemos ver ejemplos de esta parte, por ejemplo, en los
|
|
programas residentes que te permiten cambiar los niveles de oro,
|
|
petroleo, y leña en Warcraft 2, yo poseo esos programas si os
|
|
interesan... </p>
|
|
|
|
<p>Si no incluyo ejemplos de esta sección es poque requeririan
|
|
conocimientos de programacion Muy Altos, y aquel que los tenga,
|
|
seguro que con solo leer esto, sabe como encaminar mas o menos
|
|
sus pasos, si no, siempre puede preguntarme las dudas que tenga.</p>
|
|
|
|
<p><a href="#Inicio"><img src="back4.gif" align="right"
|
|
border="0" hspace="0" width="20" height="22"></a></p>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<hr>
|
|
|
|
<p> </p>
|
|
|
|
<p><a name="Parte III"></a><strong>Parte III: </strong>Que
|
|
molestas son las claves</p>
|
|
|
|
<p>Este capitulo es algo más complicado, y en él aprenderemos a
|
|
eliminar la ya casi obsoleta protección o claves de los juegos.
|
|
Debo decir que aunque trataré de simplificar el tutorial, lo mas
|
|
que pueda, serán<u> imprescindibles</u> conocimientos
|
|
medios/altos de programación, así como algunas nociones de
|
|
ensamblador.</p>
|
|
<div align="center"><center>
|
|
|
|
<table border="1" cellpadding="5" bordercolordark="#FFC832"
|
|
bordercolorlight="#FFFFFF">
|
|
<tr>
|
|
<td align="center" width="50%"><a href="#JNEasm">No se
|
|
programar</a> <font color="#FF0000"><strong>:-(</strong></font></td>
|
|
<td align="center" width="50%"><a href="#JEasm">!Quiero
|
|
ser un Hacker¡</a> <font color="#FF0000"><strong>P-)</strong></font></td>
|
|
</tr>
|
|
</table>
|
|
</center></div>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<p><a name="JEasm"></a>Las herramientas necesarias, vuelven a
|
|
estar disponibles entre las aplicaciones de la "Parte
|
|
IV". Necesitaremos un desensamblador, (hasta el <em>debug</em>
|
|
de MS-DOS puede servirte).</p>
|
|
|
|
<p>La Teoría:</p>
|
|
|
|
<blockquote>
|
|
<p><em>Cualquier aplicación no es mas que una serie de
|
|
instrucciones una detras de otras, cada una de ellas con una
|
|
función especifica. Si intentamos profundizar cada vez mas,
|
|
(espera, retrocede, vale hay esta bien), hasta llegar a las
|
|
instrucciones antes de ser decodificadas nos encontramos con
|
|
ordenes simples del tipo </em>Mov AX, BX<em> ó </em>JNZ ###<em>.
|
|
</em></p>
|
|
<p><em>Si realizamos un seguimiento del programa en cuestion,
|
|
llegaremos al momento de las claves, tras introducir una,
|
|
(cualquiera </em><em><u>no valida</u></em><em>), seguro que
|
|
unas cuantas instrucciones mas tarde se realiza una
|
|
comparacion </em>CMP<em>, y un salto </em>J**<em>, es aquí
|
|
donde intervenimos nosotros, los opcode de los saltos son de
|
|
la misma longitud, por lo que no tendremos problemas. </em></p>
|
|
<p><em>Pregunta: Si el salto es tal que </em>JE<em>, ¿qué
|
|
pasaría si lo cambiasemos, digamos por </em>JNE<em>?.</em></p>
|
|
<p><em>Respuesta: Cualquier código introducido al azar
|
|
provocará que la aplicación crea que es correcto (de hecho,
|
|
ahora lo es), y solo cuando tengamos la mala suerte de
|
|
introducir un código correcto, nos expulsará la
|
|
aplicación, diciendo: CODIGO NO VALIDO.</em></p>
|
|
</blockquote>
|
|
|
|
<p>Para el ejemplo práctico usaremos debuger de MS-DOS,
|
|
intentaré ser lo más descriptivo posible. Nuestra victima
|
|
será, será <a href="ftp:juego.exe">Juego.exe</a>, dado que
|
|
sería ilegal incluir un programa real para eliminar su
|
|
protección, eliminaremos el de este programa ejemplo, que puedes
|
|
bajarte de aquí mismo.</p>
|
|
|
|
<p>write.textfile('dbug.txt')</p>
|
|
|
|
<p><a name="JNEasm"></a><strong><u>No se programar</u></strong></p>
|
|
|
|
<p>No te preocupes, seguro que muchos de los que intenten seguir
|
|
el documento anterior no llegarán a nada. Reconozco que es
|
|
bastante complicado.</p>
|
|
|
|
<p>Esta es, como se suele decir, la puerta trasera. Las claves
|
|
estan siempre en el mismo orden, ¿cómo? ¿qué cada vez que te
|
|
pide una clave tu juego, es una clave distinta?. Bueno, eso es
|
|
por que no sabes que lo único que pasa es que la aplicación
|
|
busca una clave al <em>azar</em>, pero el azar no existe, (ver mi
|
|
pág. de pensamientos filosóficos). Para extraer una clave al
|
|
azar, por lo general, las aplicaciones se basan en el reloj del
|
|
sistema, por lo que:</p>
|
|
|
|
<p><strong>Hipotesis:</strong> si cambiamos la fecha y hora, a
|
|
momentos constantes, y cargamos una vez, tras otra el juego
|
|
(previo arranque al juego, cambiamos siempre fecha y hora), la
|
|
clave que se extrae es siempre la misma (por lo que si la clave
|
|
es simplemente escribir un nº entre 1 y 100, de entre 1.000.000
|
|
de posibilidades, como mucho solo tendremos que ejecutar el juego
|
|
100 veces para conseguir obtener la clave, que <u>siempre será
|
|
la misma</u>).</p>
|
|
|
|
<p><strong>Teorema:</strong> siempre y cuando el tiempo
|
|
transcurrido entre el cambio de fecha, hora y la carga de la
|
|
aplicación sea constante, conseguimos que siempre nos pida la
|
|
misma clave.</p>
|
|
|
|
<p>Bueno, os diré que esto da resultados muy buenos por lo
|
|
general, y para poneros algunos ejemplos, os diré que lo he
|
|
probado en <em>"Simon the sorcerer"</em>, <em>"PC
|
|
Futbol 3.0"</em>, y otros más...</p>
|
|
|
|
<p>Seguro que ya, os estaís preguntado: ¿es imposible, como
|
|
mantenemos el tiempo constante desde que ponemos el reloj
|
|
constante hasta que ejecutamos el juego?. Pues yo os digo
|
|
hermanos, je je, no es imposible de hecho, mas abajo se describe
|
|
el pequeño archivo de proceso por lotes, que consigue, que el
|
|
tiempo transcurrido en las cargas, sea cte. (Siempre y cuando no
|
|
estemos bajo MS-DOS, no en una sesión)</p>
|
|
|
|
<table border="0">
|
|
<tr>
|
|
<td>MClave.BAT </td>
|
|
</tr>
|
|
<tr>
|
|
<td>......date 01/01/01</td>
|
|
</tr>
|
|
<tr>
|
|
<td>......time 00:00:00</td>
|
|
</tr>
|
|
<tr>
|
|
<td>......<em>JUEGO</em>.EXE</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p><a href="#Inicio"><img src="back4.gif" align="right"
|
|
border="0" hspace="0" width="20" height="22"></a></p>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<hr>
|
|
|
|
<p><a name="Parte IV"></a><strong>Parte IV: </strong>Algunos
|
|
prog. de interes</p>
|
|
|
|
<p> </p>
|
|
|
|
<p>Siento que no estén disponibles los enlaces, pero tengo que
|
|
encontrar algun sitio, donde "albergar", dichos
|
|
programas, o almenos, otro lugar donde ya esten. Pasaros por
|
|
aquí, de vez en cuando, para ver si van apareciendo los enlaces.</p>
|
|
|
|
<table border="1" bordercolordark="#FFC832"
|
|
bordercolorlight="#FFFFFF">
|
|
<tr>
|
|
<td valign="top" width="50%"><strong>Editores hexadecimal</strong><p>Te
|
|
permitirán editar un fichero binario, y escribir dentro
|
|
de él.</p>
|
|
<p align="left">TurboDebuger</p>
|
|
<p align="left">PcToolsHex</p>
|
|
<p align="left"><a href="http://www.yurisw.com">HEdit</a></p>
|
|
</td>
|
|
<td valign="top" width="50%"><strong>Desassembler</strong><p>Tecnología
|
|
inversa, convierte el .EXE a .ASM para tocarlo como te de
|
|
la gana.</p>
|
|
<p><a href="http://www.numega.com">SoftIce 3.x</a></p>
|
|
<p><a href="http://www/expage.com/page/w32dasm">DAsm 8.9</a></p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td valign="top" width="50%"><strong>Desprotectores de
|
|
Juegos</strong><p>Igual que el capitulo III, pero de
|
|
forma automática, están muy bien, para los juegos
|
|
prehistoricos, que todos tenemos ya llenos de polvo.</p>
|
|
<p>RawCopy</p>
|
|
<p>DeCripter</p>
|
|
<p>LockStmith </p>
|
|
<p>RawCopy</p>
|
|
</td>
|
|
<td valign="top" width="50%"><strong>Utilidades</strong><p>Ver
|
|
"Parte II", programas que realizan eso mismo,
|
|
genial para los juegos antiguos, pero casi todos fallan
|
|
con los modernos, y son solo para MS-DOS.</p>
|
|
<p>GameWizard Pro </p>
|
|
<p><a href="savecrack.htm">SaveCrack (W95)</a></p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p>(Por falta de espacio, y no haberlos encontrado en la red,
|
|
puede que algunos de los prog. anteriores, no esten, si realmente
|
|
te interesan; "<em>e-mail</em>" al canto.)</p>
|
|
|
|
<p><a href="#Inicio"><img src="back4.gif" align="right"
|
|
border="0" hspace="0" width="20" height="22"></a></p>
|
|
|
|
<p> </p>
|
|
|
|
<p> </p>
|
|
|
|
<hr>
|
|
|
|
<p>.</p>
|
|
</body>
|
|
</html>
|