tuts_gba
Thread Id: 12514
Thread Name: GBA | Otros | [DISASSEMBLER] IDA PRO tutorial
#0
Sonicarvalho 17082
Si no sabes que es ASM, Si no sabes reconocer una rutina, lee otros tutoriales primero... Esto ni siquiera es un tutorial de ASM, pero un tutorial que muestra como ver rutinas ASM. Tienes que saber algo de ordenadores para seguir esto!

(Dudo que alguien entienda esto, pero pronto...)
Bien, hola todos! Hoy vamos a entrar en una parte mas avanzada de Rom Hacking, ASM!
Como todos sabemos, con ASM es posible todo! Pero es un poco difícil de aprender. Aún es más si no tienen suporte de programas.

Bien, tenemos que buscar y analizar rutinas para comprendemos como funciona la ROM. Es cierto que el Disassemble viewer del VBA puede hacer eso, pero no tenemos referencias a rutinas.

Hoy voy a mostrar un programa que vos hace disassemble de lo que quieran!

Primer, traten de hacer download de IDA PRO v6.1.0110409, buscando en el google el torrent! clic
(ignoren el virús, es similar al del elitemap!)
Este programa hace una 'BASE de DATOS' de la ROM!


Una vez tenendo el programa, abrimos el rom con el (ABRAN UNA ROM TOTALMENTE LIMPIA!), y nos aparece esto:


Como pueden ver, tienen que selecionar ARM PROCESSORS: ARM, y clicar en 'SET'.
NO CLIQUEN EN OK aún!

Ahora van a KERNEL OPTIONS 1, y dejen como esta en esta imagen:


Ahora, KERNEL OPTIONS 2:


Ahora ya pueden hacer OK!

En la próxima ventana, dejen así:


Con esto, hemos creado la sección de la ROM, y la sección EWRAM (02XXXXXX). Ahora deberá aparecer algo así:
.

Pero aún falta crear la iwram (03XXXXXX). Hagan SHIFT + F7. Ahora INS (aquella tecla en el teclado), y dejen la ventana como esta y clic OK:


Ahora, cliquen en options, despues en analisys e dejen la ventana así:


OK!! Ahora estamos listos para Disassemblar!

Vuelvan a la ventana inicial y cliquen en 'g' (de vuestro teclado), y van a 08000000.
Deberá aparecer esto:


Ahora cliquen la tecla 'P' y esperen que estea listo.

Pronto, ahora van a un offset cualquier de una rutina (con 08 detrás, si por ejemplo es 0x123467, entonces es 08123467) y cliquen en la tecla 'P'. El programa hará la analise de la rutina y mostrará la rutina.

Basicamente, para que sirve esto? Para que cuando encontren algo interesante en la Rom, no tengan que poner en blocs de notas, tienen la database que tendrá todo.

Ejemplo: Nosotros sabemos que en ruby el offset del gráfico del player (OW) está en el offset 3718D4. Entonces en el programa vamos al offset 083718D4 (siempre tiene que tener el 08 detrás), clicamos en la tecla 'N' y damos el nombre tabla_Sprites (no puede tener espacios), y así todas las rutina que usan esa tabla tendrán ese nombre allá y vosotros reconocerán las rutinas.

Pero esto no es todo: el programa tiene toneladas de funciones muy útiles para el ASM hacking, es solo un cuestión de explorar el programa.

Y como yo sé que no os haréis al trabajo de buscar nadie, aquí esta uno de mis regalos para vosotros: Mi Database, con todas mis descubiertas/busquedas para RUBY (u) Download!
------------
Ejemplo de la rutina del checkgender:



08067BB0 @ =============== S U B R O U T I N E =======================================
08067BB0
08067BB0
08067BB0 sA0_Check_gender: @ DATA XREF: ROM:Cmd_tableo
08067BB0 LDR R0, =Var_800D
08067BB2 LDR R1, =saveblock2_trainercard
08067BB4 LDRB R1, [R1,#8]
08067BB6 STRH R1, [R0]
08067BB8 MOVS R0, #0
08067BBA BX LR
08067BBA @ End of function sA0_Check_gender
08067BBA
08067BBA @ ---------------------------------------------------------------------------
08067BBC off_8067BBC: .long Var_800D @ DATA XREF: sA0_Check_genderr
08067BC0 off_8067BC0: .long saveblock2_trainercard @ DATA XREF: sA0_Check_gender+2r


Ahora, para los que quieren entender algo en una rutina, aquí está la explicación de cada linea:


@ =============== S U B R O U T I N E =======================================


Primera cosa: TODO lo que esta despues del @, son comentarios, hechos por mi o por el programa. El SUBROUTINE es un ejemplo de uno hecho por el programa. NO INTERFIEREN EN LA RUTINA, Y NO HACEN DAÑO! Son hechos para las personas percibieren mejor las rutinas!


08067BB0 sA0_Check_gender: @ DATA XREF: ROM:Cmd_table


El offset detras del nombre, 08067bb0 es donde esta localizada la rutina.
El 'sA0_Check_gender' es el nombre que yo he dado a la rutina. Como es un comando de scripting, sA0_Check_Gender. (abreviatura,Numero del comando,Nombre del comando). Pero esto es como yo doy nombres a rutinas, no significa que vosotros tengan que hacer como yo.
Finalmente, @ DATA XREF: ROM:Cmd_table -> DATA XREF es Referencia de los datos, donde la rutina es referenciada, en este caso, la tabla de los comandos.


LDR R0, =Var_800D

Carga el offset del LASTRESULT en R0.


LDR R1, =saveblock2_trainercard

Carga el offset donde están localizados los datos del entrenador protagonista (02024EA4) en R1


LDRB R1, [R1,#8]

Carga el byte del offset en R1 + 0x8 y graba en R1 (carga el byte de 2024EAC, byte responsable por el sexo del protagonista). Esto, como podéis percibir, apaga el valor anterior de R1 (2024EA4) y sustituí por el byte del sexo (0 = chico; 1 = chica)


STRH R1, [R0]

Graba los contenidos de R1 (sexo) en R0 (offset del LASTRESULT).
STRH es una instrucción que graba HALFs (2 bytes). Como las variables son de 2 bytes, tiene que se usar esta instrucción, y no STRB o solamente STR, que graban 1 byte y 4, respectivamente!


MOVS R0, #0
BX LR

El mov r0, 0 sirve para "limpiar" el registro, para otra rutina lo utilizar, pues graba 0 en el R0.
El BX LR es para poner en el procesador el offset de la rutina que llamó esta, precisamente en el punto despues. Es como un RETURN de scripting.

Happy Hacking! Give Credits!
Sonicarvalho
#1
Cheve_X 15014
:O

¡Muy bueno! ¡Te agradezco Mucho! Ya tenía el Programa, pero no sabía como configurarlo así que lo eliminé x)

Ahora a buscarlo denuevo D:
Te agradezco mucho, de apoco se llega a cualquier lugar. Y si alguien te dá un envión al principio mejor será.
Ahora me pondré a Dissasemblar y a ver Rutinas para ver si puedo entender algo ^^

Salu2! y muchas Gracias (Si si, again)
#2
Sonicarvalho 17082
Gracias por tu comentario, Cheve! Te recomendo utilizar el archivo que he puesto para download en el final del tutorial, que es una base de datos algo documentada para Ruby(U). Así verás algunas rutinas con nombres y mas, y incluso puedes hacer el mismo para cualquier rom de GBA, no solo pokemon.
#3
Sonicarvalho 17082
1er post atualizado!
#4
Almamu 12843
Como apunte al tema, cuando saltes al punto de entrada del rom en la IDA View, si pulsas C empieza el autoanalisis y te dice todos (o la mayoría) de puntos de entrada de subrutinas en ASM, además de que te busca todas las cadenas de texto terminadas en NULL('\0' == 0x0) y un par de cosas más bastante útiles para trabajar con IDA. Vengo de usarlo con juegos de PC y el autoanalisis es de muchísima ayuda para esto ;) (aunque parece ser que la lista de cadenas no muestra ninguna del juego)

Estas direcciones os serán de utilidad, están en base al punto de entrada del rom(aquí 0x8000000)
Address Bytes Expl.
000h 4 ROM Entry Point (32bit ARM branch opcode, eg. "B rom_start")
004h 156 Nintendo Logo (compressed bitmap, required!)
0A0h 12 Game Title (uppercase ascii, max 12 characters)
0ACh 4 Game Code (uppercase ascii, 4 characters)
0B0h 2 Maker Code (uppercase ascii, 2 characters)
0B2h 1 Fixed value (must be 96h, required!)
0B3h 1 Main unit code (00h for current GBA models)
0B4h 1 Device type (usually 00h)
0B5h 7 Reserved Area (should be zero filled)
0BCh 1 Software version (usually 00h)
0BDh 1 Complement check (header checksum, required!)
0BEh 2 Reserved Area (should be zero filled)
--- Additional Multiboot Header Entries ---
0C0h 4 RAM Entry Point (32bit ARM branch opcode, eg. "B ram_start")
0C4h 1 Boot mode (init as 00h - BIOS overwrites this value!)
0C5h 1 Slave ID Number (init as 00h - BIOS overwrites this value!)
0C6h 26 Not used (seems to be unused)
0E0h 4 JOYBUS Entry Pt. (32bit ARM branch opcode, eg. "B joy_start")
#5
sime1 24459
puede por favor reuploadar su database que no hay mas online??

PS: sorry for my spanish...
#6
Sonicarvalho 17082
Ok, aquí está (también en actualizado en el tema) :
https://dl.dropbox.com/u/34178219/Pokemon%20Ruby%2026-07-2012.idb
#7
sime1 24459
muchas gracias amigo :)