juegoWeb.com/trucos.htm
2021-09-12 22:32:01 +02:00

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>&nbsp;</p>
<p>&nbsp;</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 &quot;Parte IV&quot;, 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
&quot;Parte III&quot;, 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 &quot;vidas, energía, cantidad de
disparo...&quot;. </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>
--&gt; 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 &quot;byte&quot;. 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 -&gt; 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>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</p>
<hr>
<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a name="JEasm"></a>Las herramientas necesarias, vuelven a
estar disponibles entre las aplicaciones de la &quot;Parte
IV&quot;. 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>&quot;Simon the sorcerer&quot;</em>, <em>&quot;PC
Futbol 3.0&quot;</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>&nbsp;</p>
<p>&nbsp;</p>
<hr>
<p><a name="Parte IV"></a><strong>Parte IV: </strong>Algunos
prog. de interes</p>
<p>&nbsp;</p>
<p>Siento que no estén disponibles los enlaces, pero tengo que
encontrar algun sitio, donde &quot;albergar&quot;, 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
&quot;Parte II&quot;, 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; &quot;<em>e-mail</em>&quot; al canto.)</p>
<p><a href="#Inicio"><img src="back4.gif" align="right"
border="0" hspace="0" width="20" height="22"></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr>
<p>.</p>
</body>
</html>