summaryrefslogtreecommitdiff
path: root/src/format/dex/pool.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-05-13 12:32:03 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-05-13 12:32:03 (GMT)
commit118a668adbf6ca9d4c549618e54f58330f46ce58 (patch)
tree10e75f1a7e83ab48aba82a5a595441a065a6037e /src/format/dex/pool.c
parente56b4db3aae87f0458319019635dea4968a5c529 (diff)
Supported Dalvik VM / DEX (partially).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@155 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/dex/pool.c')
-rw-r--r--src/format/dex/pool.c197
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;
+
+}