/* 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 . */ #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; }