Hola. Este es mi primer tutorial de hacking asi que espero hacerlo bien :S
En fin, este tutorial se trata sobre "pointers" (no se como se dira en español, pero literalmente significa "señalador") que se usan para Hex Edit ROMs. Conocer esto es ESENCIAL para hackear juegos, al menos de la segunda generacion (no se si esto funcionara para otros juegos u otras generaciones, pero mientras sea Hex editing yo supongo que si)
En fin, vamos a empezar. Lo que necesitas es:
- Calculadora de windows
- Haber pasado la primaria
- Un editor hex (yo uso I.hex)
- Conocimiento super basico de hex (que es un byte) (Ver "Diccionario basico de Hex")
¿Que es un "pointer"?
Vamos a hacer esto simple: Un pointer es aquello que señala (de ahi su nombre) donde se encuentra cierta data. Es como si la computadora fuera un turista y te preguntara "¿donde queda este sitio?" y tu le dijeras "este sitio queda aqui"
Hay 2 clases de pointers: 2byte pointers y 3byte pointers. La estructura de 2byte pointers es la siguiente:
[Pointer (2bytes)]
y la de 3byte pointers es:
[Pointer (2bytes)]
¿Cual es la diferencia entre 2byte pointers y 3byte pointers?
Bien, aparte de lo obvio (que uno usa 3 bytes y el otro 2 bytes) la mayor diferencia es su funcion. Un 2byte pointer solo "señala" la data que se encuentra en el mismo Bank. Un bank, por ejemplo podria ser "2B". El bank "2B" comprende desde AC000 hasta AFFFF (Un bank comprende 3FFF bytes)
Si estas interesado en saber como halle los offset que comprenden el Bank 2B, solo tienes que multiplicar 2B * 4000 en una calculadora que soporte calculos en hexadecimal
En cambio, un 3byte pointer puede señalar data que se encuentra en TODO el juego! Volviendo al ejemplo del turista, un 2byte pointer seria como decirle al turista que lo que busca queda "cerca" mientras que un 3byte pointer seria decirle al turista que lo que busca queda "lejos".
¿Entonces un 3byte pointer no seria siempre mejor que un 2byte pointer? Seria mejor para ahorrar espacio...
Es cierto, pero el hacker (tu) no decide si se va a usar 2byte pointers o 3byte pointers. La estructura de como fue diseñado el juego es la que decide si te va a pedir 2byte pointers o 3byte pointers. Por ejemplo, la data que señala mapas es un 3byte pointers, asi que la data que señala los mapas puede estar en cualquier parte del ROM, mientras que la data que señala un "signpost" (un anuncio, como "New bark town: A town where the winds of new begginig blows") es un 2byte pointer, por lo que solo puede estar en el mismo bank que toda la estructura del signpost.
Antes de hallar el Pointer que necesites, necesitas saber esta formula:
Offset / 4000 = Bank
Para hallar el pointer deseado necesitas usar la siguiente formula:
[Offset - (Bank * 4000)] + 4000 = Pointer MOD
Pointer MOD es nada mas y nada menos que el Pointer, solo que sus bytes estan al revez. Puede parecer confuso, pero poner en practica todo esto puede resultar mas facil de entender.
EJEMPLO
Muy bien, abramos nuestro editor hex y vayamos a offset AD6AC, no dire como lo se porque no es tema de este tutorial, pero este offset es el comienzo del mapa de Mahogany Town en Pokemon Crystal.
En fin. Vayamos a offset AD6AC y averiguemos cual es su 3byte pointer.
Abrimos inicio y buscamos la calculadora de windows. Una vez ahi da click en "ver" y luego en "programador". La calculadora deberia mostrarse asi:
¿Ves la columna donde dice "Hexa Dec Oct Bin"? Da click en "Hexa" y vamos a aplicar la formula:
AD6AC / 4000 = 2B. El Bank de este offset es 2B
[AD6AC - (2B * 4000)] + 4000
[AD6AC - AC000] + 4000
16AC + 4000
56AC
56AC es el Pointer MOD
AC56 es el Pointer
Asi que el pointer de offset AD6AC es AC56.
¿Cual es su 3byte pointer?
Recordemos que el 3byte pointer es [pointer]. Como el Bank es 2B, entonces el 3byte pointer para offset AD6AC es 2BAC56.
¿Cual es su 2byte pointer?
El 2byte pointer es nada mas y nada menos que el pointer en si mismo. En otras palabras, el 2byte pointer para offset AD6AC es AC56.
¿Como comprobamos que esto es correcto?
Bueno, como queriamos hallar el 3byte pointer desde un principio usemos nuestro Hex editor. Abramos el ROM con el hex editor y vayamos a "Search". Una vez ahi marca "Hex" (si estas usando i.Hex. Esto depende del hex editor que uses) y escribe "2BAC56". Si lo hiciste bien deberias llegar a offset 94F07. Muy bien, que es lo que dicen los 3 bytes desde 94F07 hasta 94F09? Esos 3 bytes dicen "2B AC 56". Si cambias estos valores el juego no podra cargar mahogany y lo habras arruinado al menos que pongas esos valores de nuevo porque el juego no sabria localizar donde esta Mahogany.
Cuando hagas ROM hacking usando Hex editing es esencial que sepas esto, porque dependiendo de lo que necesites hackear, vas a tener que hacer uso de ya sea 2byte pointers o 3byte pointers casi siempre, asi que antes de aventurarte a hacer hex editing asegurate de dominar esto bien, que no es tan dificil y puede ser mas provechoso que utilizar un millon de tools para hackear.
¿Como se repointea?
"Repointear" es simplemente mover todos los bytes de un lugar a otro y cambiar el pointer que señala del lugar anterior al nuevo lugar para que el juego reconozca los cambios. Una vez hecho esto puedes borrar los bytes que estaban en el anterior lugar y no pasara nada malo al juego porque cambiaste la ubicacion de la data.