summaryrefslogtreecommitdiff
path: root/src/format/dex
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/dex')
-rw-r--r--src/format/dex/dex-int.c57
-rwxr-xr-xsrc/format/dex/dex-int.h4
-rwxr-xr-xsrc/format/dex/dex_def.h18
-rw-r--r--src/format/dex/pool.c97
-rw-r--r--src/format/dex/pool.h8
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);