Jump to content

[Guía Completa] Fabricar Scripts para descompilar MMORPGs


 Pantsu 

Recommended Posts

Hola usuarios, actualmente ahi muchas formas de extraer cosas de otros juegos, la mas codiciada actualmente es el metodo del QuickBMS. Por eso os vendré a traer tutoriales sobre como fabricar los scripts. Ire haciendo un poco cada dia ya que tengo otras cosas que hacer que matarme horas en hacer un tema.. Asi que dejaré unos primeros pasos.

 

Lo primero que mencionare son los programas necesarios:

  • Un editor HEX, yo actualmente uso HxD.
  • El QuickBMS.
  • Un editor de texto como puede ser Wordpad o Notepad.
  • Una calculadora que soporte HEX como la que viene incorporada en Windows.

Yo lo hare en un .pak que tengo por aqui de un MMORPG (cada mmorpg usa diferentes tipos y codificaciones, yo hare una guia basica, el resto es practica y tiempo para llevarlo a cabo.)

 

Imagen enviada

 

Si miras a la derecha podras ver un texto que es algo leible. (Etcaura.tex, Etccursor.tex, Etcmahoujin.tex, Etcenv2.tex, and Etckaze.tex) Eso es en el mio, cada uno tiene diferentes.

 

Si usamos la cabeza sabremos que en ese archivo se encontraran al menos 5 archivos y que al descompilarlos se colocaran en una carpeta llamada etc. Empecemos mirando la cabezera de este archivo y comencemos con los primeros 4 bypes.

 

Imagen enviada

 

Ahi tenemos 05 00 00 00 - Cuando trabajas con archivos de videojuegos de ordenador a menudo sabras leer los numeros a la inversa, es decir el numero anterior no podria ser el 05 00 00 00 pero si que podria leerse como 00 00 00 05 o 5.

 

¿Aun no lo entendeis? Veamos. Si recordamos antes vimos 5 nombres de archivos (en mi caso) y nuestros primeros 4 bytes de nuestro archivo equivalen a 5, por lo que podemos deducir que la cantidad se almacena en los primeros 4 bytes de nuestro archivo.

 

Los datos se almacenan en grupos: De 4 bytes (long), 2 bytes (short) y de 1 byte (byte). Sabiendo esto tendriamos echo la primera parte de nuestro script.

 

get FILES long

 

Esto nos dice en QuickBMS que lea un valor long (de 4 bytes, mencionado anteriormente) y almacenarlo en archivos variables.
Los siguientes 4 bytes, comencemos: 74 00 00 00, no son necesarios para el script extractor, pero se representa el tamaño total del siguiente paso. ¿Como? Observen la imagen y miren la longitud:

 

Imagen enviada

 

La siguiente linea y mas común en los scripts actuales de QuickBMS es la siguiente, en este script lo lleva y en la mayoria:

 

get HEADERSZ long

 

Esto almacena el tamaño del encabezado en la variable headersz. Bien ahora tenemos 2 bytes más antes del nombre de archivo.

El 0C 00 es de 2 Bytes, por lo que es conocido como short. Pero, ¿Que representa 00 0C?

 

Si seleccionamos todo el nombre del archivo en el editor hexadecimal nos mostrara una longitud de C. Hemos encontrado la longitud del nombre por lo cual podemos hacer la siguiente linea de nuestro script que seria la siguiente:

 

get NSIZE short

 

Esto almacena los 2 bytes en la variable nsize que este representa la longitud del nombre.

 

Imagen enviada

 

Ahora vamos con la linea para guardar a la hora de exportar, con el QuickBMS es tan simple como poner una sola linea que seria la siguiente:

 

getdstring NAME NSIZE

 

Esto es como decir almacenar una cadena (con solo una palabra) en la variable name y la longitud es igual a la variable nsize.

 

Ahora vamos con los siguiente 4 bytes despues del nombre: 7C 00 00 00 - Ahora ya sabemos el nombre del archivo, por lo que ahora tenemos que saber el tamaño y ubicacion en el archivo.

 

7C no es un gran numero para el tamaño del archivo, a ver qué pasa si vamos al desplazamiento 7C. En HxD pulsais Ctrl+E y poneis tanto en posicion inicial como en posicion final el 7C. Al darle a aceptar te deberia llevar a este sitio (en mi caso):

 

Imagen enviada

 

Esto se ve bien ahora mismo.. se ve como un archivo de formato .IMG0. Bien, vamos con la siguiente linea:

 

get OFFSET long

 

Esto almacena los 4 bytes como variable offset - Vamos con los siguiente 4 bytes que serian:70 10 00 00

¿Recordais que en cuando trabajas con archivos de videojuegos se hace el numero a la inversa? Aqui tambien, ahora mismo el 70 10 00 00 se podria traducir como un numero exageradamente alto, bien.. Hagamos la inversa: 00 00 10 70 o mejor dicho, 1070. Mas corto verdad? xD

 

Lo siguiente y de nuevo le damos a Ctrl+E y en Posicion Inicial (Start Offset - Si tambien lo tienes en ingles) dejandolo de la siguiente manera:

 

Imagen enviada

 

Mirad lo que es el codigo hexadecimal, esta todo perfectamente colocado. Veo el TrueVision-XFILE que es un final clasico para los archivos .tga y tambien terminamos justo antes del .IMG que fue el comienzo de nuestro primer archivo.

 

Imagen enviada

 

Eso suele significar que hemos encontrado nuestro tamaño, y con lo cual lo pondremos en la siguiente linea de nuestro script de esta forma:

 

get SIZE long

 

Esto almacena los 4 bytes en la variable size. - Bien ahora tenemos 2 bytes y luego el siguiente nombre de archivo que mencione al principio.

 

Veamos los numeros anteriores son 0E 00 que a la inversa seria 00 0E o la letra E. Bueno los últimos 2 bytes que teníamos antes de un nombre que el nombre tamaño permite ver si todavía esta en lo correcto.

 

Imagen enviada

 

Como veis al longitud de este archivo es.. la letra E. ^^

 

Debemos encontrar donde se repite el patron en la cabecera y todo lo que necesitamos para extraer los archivos. Ahora ya casi podemos acabar nuestro script y nuestro extractor para este videojuego. Cada vez que comienza el patron, mejor dicho un bucle el cual seguira hasta que no haya archivos en el paquete. En resumidas cuentas esta linea lo que hace es que descompile todo, absolutamente todo lo del paquete, y con esta linea ya casi estaria acabado el script.

 

for i = 0 < FILES

 

Esto ejecuta los comandos hasta i = 0 (Al estar en 0 ejecutara hasta que no quede ningun archivo) y establece los archivos.
Lo siguiente viene siendo la parte final del script, el comando log que hara casi todo el trabajo del script, la linea es la siguiente:

log NAME OFFSET SIZE

Esto dice cual es el nombre del archivo y lo llena de los datos(archivos) a partir de la variable OFFSET y el tamaño bueno, para algo se llama SIZE, no ahi mucho que explicar de ahi, ahora la ultima linea de este script basico:

next i

Esto lo que hace es que valla al siguiente i, como puse anteriormente en i = 0 < FILES, esta linea lo que haria es que pase al siguiente archivo.

Finalizamos ya con esto, lo guardamos como extractor.bms y ya tendriamos echo el script. Yo lo pruebo y como veis en la imagen:

 

Imagen enviada

 

Imagen enviada

get FILES longget HEADERSZ longfor i = 0 < FILESget NSIZE shortgetdstring NAME NSIZEget OFFSET longget SIZE longlog NAME OFFSET SIZEnext i

Esto seria el script finalizado.

Saludos y espero que les haya servido. - Como dije, ahora el resto lo tendreis que aprender vosotros, sabiendo lo basico el resto con tiempo se aprende. - Con el tiempo aprendereis que ahi mas de 3 Bytes (El de 4, 2 y 1) pero por ahora, al ser lo basico creo que con esos tres os sirve para aprender lo basico, espero que os guste y gracias por leerme ^^

Link to comment
Share on other sites

  • 3 weeks later...

puedes pasarnos los archivos que empleastes en la guia porfavor? intente usar algunos de otros juegos pero no me aparecian las mismas cosas en hexadecimal que ati

 

ya que estoy empezando con esto creo que es mejor partir de los mismos archivos que tu porfis, me seria de gran ayuda.. de verdad que quiero aprender..

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...
  • Dilong locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...