diff options
Diffstat (limited to 'src/format/dex')
-rw-r--r-- | src/format/dex/dex-int.c | 57 | ||||
-rwxr-xr-x | src/format/dex/dex-int.h | 4 | ||||
-rwxr-xr-x | src/format/dex/dex_def.h | 18 | ||||
-rw-r--r-- | src/format/dex/pool.c | 97 | ||||
-rw-r--r-- | src/format/dex/pool.h | 8 |
5 files changed, 184 insertions, 0 deletions
diff --git a/src/format/dex/dex-int.c b/src/format/dex/dex-int.c index be1c211..025429f 100644 --- a/src/format/dex/dex-int.c +++ b/src/format/dex/dex-int.c @@ -134,15 +134,72 @@ bool read_dex_type_id_item(const GDexFormat *format, off_t *pos, type_id_item *i } +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* pos = position de début de lecture. [OUT] * +* proto_id = structure lue à retourner. [OUT] * +* * +* Description : Procède à la lecture d'une description de prototype. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ +bool read_dex_proto_id_item(const GDexFormat *format, off_t *pos, proto_id_item *proto_id) +{ + bool result; /* Bilan à retourner */ + const bin_t *content; /* Contenu binaire à lire */ + off_t length; /* Taille totale du contenu */ + result = true; + content = G_BIN_FORMAT(format)->content; + length = G_BIN_FORMAT(format)->length; + result &= read_u32(&proto_id->shorty_idx, content, pos, length, SRE_LITTLE); + result &= read_u32(&proto_id->return_type_idx, content, pos, length, SRE_LITTLE); + result &= read_u32(&proto_id->parameters_off, content, pos, length, SRE_LITTLE); + return result; +} +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* pos = position de début de lecture. [OUT] * +* field_id = structure lue à retourner. [OUT] * +* * +* Description : Procède à la lecture d'une description de champ. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool read_dex_field_id_item(const GDexFormat *format, off_t *pos, field_id_item *field_id) +{ + bool result; /* Bilan à retourner */ + const bin_t *content; /* Contenu binaire à lire */ + off_t length; /* Taille totale du contenu */ + + result = true; + content = G_BIN_FORMAT(format)->content; + length = G_BIN_FORMAT(format)->length; + + result &= read_u16(&field_id->class_idx, content, pos, length, SRE_LITTLE); + result &= read_u16(&field_id->type_idx, content, pos, length, SRE_LITTLE); + result &= read_u32(&field_id->name_idx, content, pos, length, SRE_LITTLE); + + return result; + +} /****************************************************************************** diff --git a/src/format/dex/dex-int.h b/src/format/dex/dex-int.h index e34dbd3..2e3cc00 100755 --- a/src/format/dex/dex-int.h +++ b/src/format/dex/dex-int.h @@ -71,7 +71,11 @@ bool read_dex_string_data_item(const GDexFormat *, off_t *, string_data_item *); /* Procède à la lecture d'un identifiant de type DEX. */ bool read_dex_type_id_item(const GDexFormat *, off_t *, type_id_item *); +/* Procède à la lecture d'une description de prototype. */ +bool read_dex_proto_id_item(const GDexFormat *, off_t *, proto_id_item *); +/* Procède à la lecture d'une description de champ. */ +bool read_dex_field_id_item(const GDexFormat *, off_t *, field_id_item *); /* Procède à la lecture d'une description de méthode. */ bool read_dex_method_id_item(const GDexFormat *, off_t *, method_id_item *); diff --git a/src/format/dex/dex_def.h b/src/format/dex/dex_def.h index 9387a90..9faf050 100755 --- a/src/format/dex/dex_def.h +++ b/src/format/dex/dex_def.h @@ -54,8 +54,23 @@ typedef struct _type_id_item } type_id_item; +/* Description d'un prototype */ +typedef struct _proto_id_item +{ + uint32_t shorty_idx; /* Description version courte */ + uint32_t return_type_idx; /* Type de retour */ + uint32_t parameters_off; /* Position des arguments */ +} proto_id_item; +/* Description d'un champ */ +typedef struct _field_id_item +{ + uint16_t class_idx; /* Classe d'appartenance */ + uint16_t type_idx; /* Type du champ */ + uint32_t name_idx; /* Nom du champ */ + +} field_id_item; /* Description d'une méthode */ typedef struct _method_id_item @@ -151,6 +166,9 @@ typedef struct _code_item #define ENDIAN_CONSTANT 0x12345678 #define REVERSE_ENDIAN_CONSTANT 0x78563412 +/* Indice non valide */ +#define NO_INDEX 0xffffffff + /* En-tête de tout programe Dex */ typedef struct _dex_header diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c index 0a8bed3..dbcee52 100644 --- a/src/format/dex/pool.c +++ b/src/format/dex/pool.c @@ -34,6 +34,45 @@ * Paramètres : format = représentation interne du format DEX à consulter. * * index = index du type recherchée. * * * +* Description : Extrait une chaîne de caractères d'une table DEX. * +* * +* Retour : Chaîne de caractères trouvées ou NULL en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index) +{ + off_t pos; /* Tête de lecture */ + string_id_item str_id; /* Identifiant de chaîne */ + string_data_item str_data; /* Description de chaîne */ + + pos = format->header.string_ids_off + index * sizeof(string_id_item); + + if (!read_dex_string_id_item(format, &pos, &str_id)) + return NULL; + + pos = str_id.string_data_off; + + if (!read_dex_string_data_item(format, &pos, &str_data)) + return NULL; + + return (const char *)str_data.data; + +} + + + + + + + +/****************************************************************************** +* * +* Paramètres : format = représentation interne du format DEX à consulter. * +* index = index du type recherchée. * +* * * Description : Extrait une représentation de type d'une table DEX. * * * * Retour : Composant GLib créé. * @@ -119,6 +158,64 @@ GOpenidaType *get_class_from_dex_pool(const GDexFormat *format, uint16_t index) +/****************************************************************************** +* * +* Paramètres : format = représentation interne du format DEX à consulter. * +* index = index du champ recherché. * +* * +* Description : Extrait une représentation de champ d'une table DEX. * +* * +* Retour : Composant GLib créé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBinVariable *get_field_from_dex_pool(const GDexFormat *format, uint32_t index) +{ + GBinVariable *result; /* Instance à retourner */ + off_t pos; /* Tête de lecture */ + field_id_item field_id; /* Description du champ */ + GOpenidaType *type; /* Type du champ */ + const char *name; /* Désignation humaine */ + GOpenidaType *owner; /* Propriétaire du champ */ + + pos = format->header.field_ids_off + index * sizeof(field_id_item); + + if (!read_dex_field_id_item(format, &pos, &field_id)) + return NULL; + + type = get_type_from_dex_pool(format, field_id.type_idx); + + name = get_string_from_dex_pool(format, field_id.name_idx); + if (name == NULL) goto bad_name; + + result = g_binary_variable_new(type); + g_binary_variable_set_name(result, name); + + if (field_id.class_idx != NO_INDEX) + { + owner = get_type_from_dex_pool(format, field_id.class_idx); + if (owner == NULL) goto bad_owner; + + g_binary_variable_set_owner(result, owner); + + } + + return result; + + bad_owner: + + g_object_ref(G_OBJECT(type)); + g_object_unref(G_OBJECT(result)); + + bad_name: + + g_object_unref(G_OBJECT(type)); + + return NULL; + +} /****************************************************************************** diff --git a/src/format/dex/pool.h b/src/format/dex/pool.h index a41a1da..263a807 100644 --- a/src/format/dex/pool.h +++ b/src/format/dex/pool.h @@ -31,6 +31,9 @@ +/* Extrait une chaîne de caractères d'une table DEX. */ +const char *get_string_from_dex_pool(const GDexFormat *, uint32_t); + /* Extrait une représentation de type d'une table DEX. */ GOpenidaType *get_type_from_dex_pool(const GDexFormat *, uint16_t); @@ -40,6 +43,11 @@ GOpenidaType *get_class_from_dex_pool(const GDexFormat *, uint16_t); + + +/* Extrait une représentation de champ d'une table DEX. */ +GBinVariable *get_field_from_dex_pool(const GDexFormat *, uint32_t); + /* Extrait une représentation de routine d'une table DEX. */ GBinRoutine *get_routine_from_dex_pool(const GDexFormat *, uleb128_t); |