summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-11-14 16:30:10 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-11-14 16:30:10 (GMT)
commit4fd2ebd6ef0875b5d7d632db735d0510e19d4570 (patch)
tree58778508862e4dc3412b3391b56109871831e126
parentae8cf6257c8d929de1b7ee86e29fcb45ab4af91c (diff)
Loaded source file from Dex classes.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@193 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog11
-rw-r--r--src/analysis/decomp/decompiler.c2
-rw-r--r--src/format/dex/class.c38
-rw-r--r--src/format/dex/class.h2
-rwxr-xr-xsrc/format/dex/dex.c60
-rw-r--r--src/format/format-int.h6
-rw-r--r--src/format/format.c10
-rw-r--r--src/format/format.h4
8 files changed, 126 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index aca1f7a..3bf8c1e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+10-11-14 Cyrille Bagard <nocbos@gmail.com>
+
+ * src/analysis/decomp/decompiler.c
+ * src/format/dex/class.c
+ * src/format/dex/class.h
+ * src/format/dex/dex.c
+ * src/format/format.c
+ * src/format/format.h
+ * src/format/format-int.h
+ Load source file from Dex classes.
+
10-11-12 Cyrille Bagard <nocbos@gmail.com>
* src/arch/dalvik/dop_aget.c:
diff --git a/src/analysis/decomp/decompiler.c b/src/analysis/decomp/decompiler.c
index 9e8ec38..faa2f00 100644
--- a/src/analysis/decomp/decompiler.c
+++ b/src/analysis/decomp/decompiler.c
@@ -190,7 +190,7 @@ GCodeBuffer *decompile_all_from_file(const GOpenidaBinary *binary, const char *f
format = g_openida_binary_get_format(binary);
- g_binary_format_decompile(G_BIN_FORMAT(format), result);
+ g_binary_format_decompile(G_BIN_FORMAT(format), result, filename);
return result;
diff --git a/src/format/dex/class.c b/src/format/dex/class.c
index 23e08a0..8182987 100644
--- a/src/format/dex/class.c
+++ b/src/format/dex/class.c
@@ -29,6 +29,7 @@
#include "dex-int.h"
#include "method.h"
+#include "pool.h"
@@ -42,6 +43,8 @@ struct _GDexClass
{
GObject parent; /* A laisser en premier */
+ class_def_item definition; /* Définition de la classe */
+
GDexMethod **direct_methods; /* Méthodes propres */
size_t dmethods_count; /* Quantité de ces méthodes */
GDexMethod **virtual_methods; /* Méthodes virtuelles */
@@ -157,6 +160,8 @@ static GDexClass *g_dex_class_new(const GDexFormat *format, off_t offset)
result = g_object_new(G_TYPE_DEX_CLASS, NULL);
+ result->definition = def;
+
index = 0;
for (i = 0; i < data.direct_methods_size; i++)
@@ -285,6 +290,39 @@ GBinPart **g_dex_class_get_parts(const GDexClass *class, GBinPart **parts, size_
}
+/******************************************************************************
+* *
+* Paramètres : class = informations chargées à consulter. *
+* format = représentation interne du format DEX à compléter. *
+* *
+* Description : Retrouve si possible le nom du fichier source d'une classe. *
+* *
+* Retour : Nom du fichier trouvé ou NULL si aucun. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *g_dex_class_get_source_file(const GDexClass *class, const GDexFormat *format)
+{
+ const char *result; /* Trouvaille à renvoyer */
+
+ result = get_string_from_dex_pool(format,
+ class->definition.source_file_idx);
+
+ return result;
+
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/format/dex/class.h b/src/format/dex/class.h
index 810f5e1..b9dfed1 100644
--- a/src/format/dex/class.h
+++ b/src/format/dex/class.h
@@ -55,6 +55,8 @@ GType g_dex_class_get_type(void);
/* Fournit les références aux zones binaires à analyser. */
GBinPart **g_dex_class_get_parts(const GDexClass *, GBinPart **, size_t *);
+/* Retrouve si possible le nom du fichier source d'une classe. */
+const char *g_dex_class_get_source_file(const GDexClass *, const GDexFormat *);
diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c
index b87981f..5280f4d 100755
--- a/src/format/dex/dex.c
+++ b/src/format/dex/dex.c
@@ -28,7 +28,7 @@
#include "dex-int.h"
-
+#include "../format-int.h"
@@ -45,6 +45,9 @@ static void g_dex_format_class_init(GDexFormatClass *);
/* Initialise une instance de format d'exécutable DEX. */
static void g_dex_format_init(GDexFormat *);
+/* Procède à la décompilation complète du format. */
+static void g_dex_format_decompile(const GDexFormat *, GCodeBuffer *, const char *);
+
/* Indique le type d'architecture visée par le format. */
static FormatTargetMachine g_dex_format_get_target_machine(const GDexFormat *);
@@ -126,7 +129,12 @@ static void g_dex_format_class_init(GDexFormatClass *klass)
static void g_dex_format_init(GDexFormat *format)
{
- GExeFormat *exe_format; /* Format parent à constituer */
+ GExeFormat *exe_format; /* Format parent à compléter #1*/
+ GBinFormat *bin_format; /* Format parent à compléter #2*/
+
+ bin_format = G_BIN_FORMAT(format);
+
+ bin_format->decompile = (format_decompile_fc)g_dex_format_decompile;
exe_format = G_EXE_FORMAT(format);
@@ -192,6 +200,54 @@ GBinFormat *g_dex_format_new(const bin_t *content, off_t length)
/******************************************************************************
* *
+* Paramètres : format = informations chargées à consulter. *
+* buffer = tampon mis à disposition pour la sortie. *
+* filename = nom du fichier source à cibler. *
+* *
+* Description : Procède à la décompilation complète du format. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dex_format_decompile(const GDexFormat *format, GCodeBuffer *buffer, const char *filename)
+{
+ size_t i; /* Boucle de parcours */
+ const char *source; /* Fichier source trouvé */
+
+ for (i = 0; i < format->classes_count; i++)
+ {
+ source = g_dex_class_get_source_file(format->classes[i], format);
+ if (source == NULL || strcmp(source, filename) != 0) continue;
+
+ printf("SRC :: '%s'\n", source);
+
+#if 0
+ GOpenidaType *get_type_from_dex_pool(const GDexFormat *format, uint16_t index)
+
+
+ Décrit le type fourni sous forme de caractères. *
+* *
+* Retour : Chaîne à libérer de la mémoire après usage. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *_g_openida_type_to_string(const GOpenidaType *type, bool simple)
+
+#endi
+
+ }
+
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* *
* Description : Indique le type d'architecture visée par le format. *
diff --git a/src/format/format-int.h b/src/format/format-int.h
index 319f5cd..27d4129 100644
--- a/src/format/format-int.h
+++ b/src/format/format-int.h
@@ -32,6 +32,10 @@
/* ------------------------ TRAITEMENT INDIVIDUEL DE FORMATS ------------------------ */
+/* Procède à la décompilation complète du format. */
+typedef void (* format_decompile_fc) (const GBinFormat *, GCodeBuffer *, const char *);
+
+
/* Format binaire générique (instance) */
struct _GBinFormat
{
@@ -46,6 +50,8 @@ struct _GBinFormat
GBinRoutine **routines; /* Liste des routines trouvées */
size_t routines_count; /* Nombre de ces routines */
+ format_decompile_fc decompile; /* Décompilation d'un fichier */
+
};
/* Format binaire générique (classe) */
diff --git a/src/format/format.c b/src/format/format.c
index 73f23bd..e618120 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -335,8 +335,9 @@ GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *format, GBi
/******************************************************************************
* *
-* Paramètres : format = informations chargées à consulter. *
-* buffer = tampon mis à disposition pour la sortie. *
+* Paramètres : format = informations chargées à consulter. *
+* buffer = tampon mis à disposition pour la sortie. *
+* filename = nom du fichier source à cibler. *
* *
* Description : Procède à la décompilation complète du format. *
* *
@@ -346,7 +347,7 @@ GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *format, GBi
* *
******************************************************************************/
-void g_binary_format_decompile(const GBinFormat *format, GCodeBuffer *buffer)
+void g_binary_format_decompile(const GBinFormat *format, GCodeBuffer *buffer, const char *filename)
{
@@ -356,6 +357,9 @@ void g_binary_format_decompile(const GBinFormat *format, GCodeBuffer *buffer)
size_t i;
GDecInstruction *instr;
+
+ if (format->decompile != NULL)
+ format->decompile(format, buffer, filename);
routines = g_binary_format_get_routines(format, &count);
diff --git a/src/format/format.h b/src/format/format.h
index 073fae3..5a8c684 100644
--- a/src/format/format.h
+++ b/src/format/format.h
@@ -33,6 +33,8 @@
#include "symbol.h"
#include "../analysis/routine.h"
#include "../decomp/instruction.h"
+#include "../decomp/output.h"
+
/* ------------------------ TRAITEMENT INDIVIDUEL DE FORMATS ------------------------ */
@@ -74,7 +76,7 @@ GBinRoutine **g_binary_format_get_routines(const GBinFormat *, size_t *);
GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *, GBinRoutine *);
/* Procède à la décompilation complète du format. */
-void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *);
+void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *, const char *filename);
/* Recherche le symbole correspondant à une adresse. */
bool g_binary_format_resolve_symbol(const GBinFormat *, const char **, SymbolType *, vmpa_t *);