First commit ~0,10

This commit is contained in:
2021-09-12 22:32:01 +02:00
commit 19857bd20b
69 changed files with 13348 additions and 0 deletions

478
trucos.htm Normal file
View File

@ -0,0 +1,478 @@
<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<73>o p<>ginas Web para empresas, Calidad y Profecionalidad garantizadas, implementaci<63>n de las <20>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><EFBFBD>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<63>n que tu
hagas de la informaci<63>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<65> 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><EFBFBD>Tienes ya las herramientas? </p>
<p>Vale, empecemos con un poco de teor<6F>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<63>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<72>a, cantidad de
disparo...&quot;. </em></p>
<p><em><EFBFBD>C<EFBFBD>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<63>n</u></em><em>,
esa ser<65> la posici<63>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<61> 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, <20>C<EFBFBD>mo es de grande el n<>mero que
buscas?. Debes pensar como un programador, o almenos con un
poco de intuici<63>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<63>n os ense<73>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<73> 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<61> 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>,
<20>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<6F>a, podemos pasar a un
ejemplo pr<70>ctico, que aplicaremos al juego <em>Civilization 2</em>:</p>
<p>Buscamos la posici<63>n f<>sica del dinero, dentro de la partida
salvada.</p>
<p>1<EFBFBD> <20>Qu<51> sabemos? Sabemos que el dinero puede sobrepasar los
256 creditos asi que el dinero ocupo, por lo menos 16 bits.</p>
<p>2<EFBFBD> Hemos salvado tres partidas; ( a1.sav | a2.sav | a3.sav ),
con ( 300 | 75 | 250 ) creditos respectivamente.</p>
<p>3<EFBFBD> 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<EFBFBD> Buscamos las primeras coincidencias en cada archivo de las
cadenas ( C012<strong>h</strong> | 004B<strong>h</strong> | 00FA<strong>h</strong>
).</p>
<p><EFBFBD>Coinciden las posiciones f<>sica? No = continua en el paso
4<EFBFBD>.</p>
<p>5<EFBFBD> Hemos encontrado la posici<63>n f<>sica, cuanto queriamos <20>
20.000 creditos ?. Pues 20.000<strong>d</strong> = 4E20<strong>h</strong>,
por lo que sustituimos el valor a partir de la posici<63>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<EFBFBD> los puntos debiles de este tutorial, y los elimar<61> 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<63>n, dentro de cinco
minutos, estar<61> en otra. </p>
<p>Todo lo dicho en el capitulo anterior, ser<65>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<69>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<75>o programa que se ejecute en
segundo plano, bloqueando el contenido, apuntado por el puntero,
del cual siempre conoceremos su posici<63>n f<>sica.</p>
<p>Para la localizaci<63>n del puntero, debemos realizar los pasos
de la Parte I, pero aplicados a memoria, una vez conocida la
direcci<EFBFBD>n, buscaremos por todo el rango de memoria destinado al
programa, valores que concuerden con la direcci<63>n f<>sica
(segmento:desplazamiento), del valor. Direcci<63>nP = direcci<63>n
f<EFBFBD>sica - direcci<63>n de carga del programa.</p>
<p>Una vez conocida estas direcciones, el programa de segundo
plano, estar<61> continuamente o cuando se requiera, escribiendo en
la direccion apuntada por el puntero. La direcci<63>n del puntero,
ser<EFBFBD> la direcci<63>n de carga del programa + Direcci<63>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<6C>a en Warcraft 2, yo poseo esos programas si os
interesan... </p>
<p>Si no incluyo ejemplos de esta secci<63>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 <20>l aprenderemos a
eliminar la ya casi obsoleta protecci<63>n o claves de los juegos.
Debo decir que aunque tratar<61> de simplificar el tutorial, lo mas
que pueda, ser<65>n<u> imprescindibles</u> conocimientos
medios/altos de programaci<63>n, as<61> 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<65></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<6F>a:</p>
<blockquote>
<p><em>Cualquier aplicaci<63>n no es mas que una serie de
instrucciones una detras de otras, cada una de ellas con una
funci<63>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> <20> </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<71>
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>, <20>qu<71>
pasar<61>a si lo cambiasemos, digamos por </em>JNE<em>?.</em></p>
<p><em>Respuesta: Cualquier c<>digo introducido al azar
provocar<61> que la aplicaci<63>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<61> la
aplicaci<63>n, diciendo: CODIGO NO VALIDO.</em></p>
</blockquote>
<p>Para el ejemplo pr<70>ctico usaremos debuger de MS-DOS,
intentar<EFBFBD> ser lo m<>s descriptivo posible. Nuestra victima
ser<EFBFBD>, ser<65> <a href="ftp:juego.exe">Juego.exe</a>, dado que
ser<EFBFBD>a ilegal incluir un programa real para eliminar su
protecci<EFBFBD>n, eliminaremos el de este programa ejemplo, que puedes
bajarte de aqu<71> 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<61>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, <20>c<EFBFBD>mo? <20>qu<71> cada vez que te
pide una clave tu juego, es una clave distinta?. Bueno, eso es
por que no sabes que lo <20>nico que pasa es que la aplicaci<63>n
busca una clave al <em>azar</em>, pero el azar no existe, (ver mi
p<EFBFBD>g. de pensamientos filos<6F>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<65>
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<EFBFBD>n sea constante, conseguimos que siempre nos pida la
misma clave.</p>
<p>Bueno, os dir<69> que esto da resultados muy buenos por lo
general, y para poneros algunos ejemplos, os dir<69> 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<74>s preguntado: <20>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<75>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<73>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<73>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<EFBFBD>, 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<69>n editar un fichero binario, y escribir dentro
de <20>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<EFBFBD>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<6F>tica, est<73>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>