From 4fd2ebd6ef0875b5d7d632db735d0510e19d4570 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 14 Nov 2010 16:30:10 +0000 Subject: Loaded source file from Dex classes. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@193 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 11 ++++++++ src/analysis/decomp/decompiler.c | 2 +- src/format/dex/class.c | 38 +++++++++++++++++++++++++ src/format/dex/class.h | 2 ++ src/format/dex/dex.c | 60 ++++++++++++++++++++++++++++++++++++++-- src/format/format-int.h | 6 ++++ src/format/format.c | 10 +++++-- src/format/format.h | 4 ++- 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 + + * 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 * 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 *); -- cgit v0.11.2-87-g4458