diff options
Diffstat (limited to 'src/format/dex/pool.c')
-rw-r--r-- | src/format/dex/pool.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c new file mode 100644 index 0000000..0a8bed3 --- /dev/null +++ b/src/format/dex/pool.c @@ -0,0 +1,197 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * pool.c - extraction des informations issues des tables globales + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "pool.h" + + +#include "dex-int.h" +#include "../mangling/demangler.h" + + + +/****************************************************************************** +* * +* 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éé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GOpenidaType *get_type_from_dex_pool(const GDexFormat *format, uint16_t index) +{ + off_t pos; /* Tête de lecture */ + type_id_item type_id; /* Définition de la classe */ + string_id_item str_id; /* Identifiant de chaîne */ + string_data_item str_data; /* Description de chaîne */ + + + //printf("Index :: 0x%04hx\n", index); + + + pos = format->header.type_ids_off + index * sizeof(type_id_item); + + if (!read_dex_type_id_item(format, &pos, &type_id)) + return NULL; + + + + + pos = format->header.string_ids_off + type_id.descriptor_idx * 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; + + + //printf(">> String :: '%s'\n", str_data.data); + + + return demangle_type(DGT_JAVA, (char *)str_data.data); + +} + + + + + +/****************************************************************************** +* * +* Paramètres : format = représentation interne du format DEX à consulter. * +* index = index de la classe recherchée. * +* * +* Description : Extrait une représentation de classe d'une table DEX. * +* * +* Retour : Composant GLib créé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GOpenidaType *get_class_from_dex_pool(const GDexFormat *format, uint16_t index) +{ + GOpenidaType *result; /* Instance à retourner */ + off_t pos; /* Tête de lecture */ + class_def_item class_def; /* Définition de la classe */ + + pos = format->header.class_defs_off + index * sizeof(class_def_item); + + if (!read_dex_class_def_item(format, &pos, &class_def)) + return NULL; + + + + result = NULL; + + + return result; + +} + + + + + + +/****************************************************************************** +* * +* Paramètres : format = représentation interne du format DEX à consulter. * +* index = index de la routine recherchée. * +* * +* Description : Extrait une représentation de routine d'une table DEX. * +* * +* Retour : Composant GLib créé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBinRoutine *get_routine_from_dex_pool(const GDexFormat *format, uleb128_t index) +{ + GBinRoutine *result; /* Instance à retourner */ + off_t pos; /* Tête de lecture */ + method_id_item meth_id; /* Description de la méthode */ + + + GOpenidaType *type; + + string_id_item str_id; /* Identifiant de chaîne */ + string_data_item str_data; /* Description de chaîne */ + + pos = format->header.method_ids_off + index * sizeof(method_id_item); + + if (!read_dex_method_id_item(format, &pos, &meth_id)) + return NULL; + + + + + + + type = get_type_from_dex_pool(format, meth_id.class_idx); + + /* + if (type == NULL) + printf("class is nil\n"); + + else + printf("class = '%s'\n", g_openida_type_to_string(type)); + */ + + /* Nom de la méthode */ + + pos = format->header.string_ids_off + meth_id.name_idx * 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; + + + //printf("String :: '%s'\n", str_data.data); + + + result = g_binary_routine_new(); + + g_binary_routine_set_name(result, (char *)str_data.data); + + if (type != NULL) + g_binary_routine_set_namespace(result, type); + + + //printf("==>>> routine :: '%s'\n", g_binary_routine_to_string(result)); + + return result; + +} |