Archivos DEX (Dalvik Executable): La Cabecera
La cabecera es como cabe de esperar, una de las partes mas importantes de la estructura el archivo .dex. Contiene el magic que nos permite identificar el formato de archivo, además de diferentes chechsums y hashes para comprobar la integridad del propio archivo. Pero lo que es mas importante, en la cabecera se encuentra el “mapa” para entender y descomponer el formato .dex en sus diferentes partes, ya que contiene una lista con los offsets y longitud de las diferentes parte de el archivo que comentábamos en el artículo anterior.
- Tabla con las posiciones de los Strings
- Tabla con las posiciones de los Tipos
- Tabla con las posiciones de las estructuras/Prototipos de los métodos
- Tabla con las posiciones de las Propiedades de las clases o Campos de los métodos
- Tabla con las posiciones de los Métodos
- Tabla con las posiciones de las Clases
- Datos
| Name | Format | Description |
|---|---|---|
| magic | ubyte[8] | Este valor es el que identifica el tipo de fichero. |
| checksum | uint | Checksum (adler32) calculado en base a todo el fichero, menos magic y checksum. |
| signature | ubyte[20] | Firma HashSHA-1 de todo el fichero menos magic, checksum y la propia firma. |
| file_size | uint | Tamaño de todo el fichero incluida la cabecera (en bytes). |
| header_size | uint | Tamañode la cabecera (en bytes). Actualmente siempre toma el valor de 0×70 (112) |
| endian_tag | uint | Nos indica que tipo de formato endian usa el fichero. Importante de cara a interpretar los valores de los datos del archivo, pero defecto es litle-endian. [aclaración] |
| link_size | uint | Indicael tamaño de la sección de enlace (link section) o 0, si elfichero es enlazado de forma dinámica. |
| link_off | uint | Desplazamientoal comienzo de la sección de enlace desde el inicio del ficheroo 0 si link_size == 0. |
| map_off | uint | Desplazamientoal map_list en caso que éste exista o 0 en caso contrario. Elmap_list es una lista con todo el contenido del fichero. Estaestructura de datos puede contener datos redundantes, pero laintención de la misma es el poder recorrer el contenido delfichero de una forma más cómoda. Esta lista está ordenada. |
| string_ids_size | uint | Númerode elementos en la lista de strings. |
| string_ids_off | uint | Desplazamientoa la lista de strings o 0 en caso que dicha lista este vacía,circunstancia que raramente se va a dar. |
| type_ids_size | uint | Númerode elementos en la lista de tipos (type). |
| type_ids_off | uint | Desplazamientoa la lista de tipos o 0 en caso que dicha lista este vacía. Casoque raramente también se dará. |
| proto_ids_size | uint | Númerode elementos en la lista de prototipos. |
| proto_ids_off | uint | Desplazamientoa la lista de prototipos. 0 en caso que dicha lista este vacía.De nuevo, situación que raramente se dará. |
| field_ids_size | uint | Númerode elementos en la lista de campos. |
| field_ids_off | uint | Desplazamientoa la lista de campos o 0 en caso que dicha lista esté vacía. |
| method_ids_size | uint | Númerode elementos en la lista de métodos. |
| method_ids_off | uint | Desplazamientoa la lista de métodos. 0 si la lista está vacía. |
| class_defs_size | uint | Númerode elementos en la lista de clases. |
| class_defs_off | uint | Desplazamientoa la lista de clases. 0 en caso dicha lista este vacía,situación poco probable. |
| data_size | uint | Tamañoen bytes de la sección de datos. Debe ser un número parmúltiplo del tamaño de un uint (sizeof(uint)). |
| data_off | uint | Desplazamientoa la sección de datos. |
ENDIAN_CONSTANT y REVERSE_ENDIAN_CONSTANT
En caso de que el valor se el campo endian_tag sea igual a REVERSE_ENDIAN_CONSTANT (0×78563412), consideraremos que el archivo esta en formato litle-endian, lo cual es el estandar y lo mas común. A pesar de ello, es posible usar otras configuraciones, tipo big-endian, en tal caso el campo endian_tag tomara el valor ENDIAN_CONSTANT (0×12345678).
Fuente: http://www.netmite.com/android/mydroid/dalvik/docs/dex-format.html