diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-08-03 13:03:26 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-08-03 13:03:26 (GMT) |
commit | b7c83221f2a60be8ee5d44a7599dbe6869af005f (patch) | |
tree | 814e294533920d18f8734baa9aaef47c676e520a /src | |
parent | 7d2b7ca95966c2d687526cd75a96d1ea67d3f503 (diff) |
Loaded the permissions used by an APK file.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@255 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/binary.c | 18 | ||||
-rw-r--r-- | src/analysis/decomp/decompiler.c | 2 | ||||
-rw-r--r-- | src/analysis/disass/disassembler.c | 21 | ||||
-rw-r--r-- | src/analysis/disass/disassembler.h | 2 | ||||
-rw-r--r-- | src/format/dex/method.c | 4 | ||||
-rw-r--r-- | src/gui/panels/log.c | 4 | ||||
-rw-r--r-- | src/gui/panels/log.h | 4 | ||||
-rw-r--r-- | src/plugins/plugin-def.h | 11 | ||||
-rw-r--r-- | src/plugins/plugin-int.h | 15 | ||||
-rw-r--r-- | src/plugins/plugin.c | 147 | ||||
-rw-r--r-- | src/plugins/plugin.h | 3 |
11 files changed, 190 insertions, 41 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 2b84b57..21b4b14 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -48,7 +48,7 @@ #include "../debug/break.h" #include "../format/format.h" #include "../gui/panels/log.h" -#include "../plugins/pglist.h" +#include "../plugins/pglist.h" /* TODO : supprimer ? */ #include "../format/dbg_format.h" @@ -1001,8 +1001,7 @@ bin_t *map_binary_file(const char *filename, off_t *length) void ack_completed_disassembly(void/*GDelayedDisassembly*/ *disass, GOpenidaBinary *binary) { GRenderingLine *line; /* "Première" ligne de rendu */ - GPluginModule **pglist; /* Liste de greffons */ - size_t pgcount; /* Taille de cette liste */ + size_t i; /* Boucle de parcours */ const char * const *files; /* Liste de fichiers source */ @@ -1034,19 +1033,6 @@ void ack_completed_disassembly(void/*GDelayedDisassembly*/ *disass, GOpenidaBina g_exe_format_get_entry_point(binary->format)); if (line != NULL) g_rendering_line_add_flag(line, RLF_ENTRY_POINT); - /* Action post-désassemblage */ - - pglist = get_all_plugins_for_action(PGA_CODE_PROCESS, &pgcount); - - if (pgcount > 0) - { - for (i = 0; i < pgcount; i++) - g_plugin_module_execute_action_on_binary(pglist[i], binary, PGA_CODE_PROCESS); - - free(pglist); - - } - /* On réintègre le flot premier */ #endif diff --git a/src/analysis/decomp/decompiler.c b/src/analysis/decomp/decompiler.c index 24cd242..42dc1ff 100644 --- a/src/analysis/decomp/decompiler.c +++ b/src/analysis/decomp/decompiler.c @@ -152,8 +152,6 @@ static void prepare_all_routines_for_decomp(const GOpenidaBinary *binary, const { context = g_arch_processor_get_decomp_context(proc); - printf(" -- %s --\n", g_binary_routine_get_name(routines[i])); - instr = g_binary_format_decompile_routine(G_BIN_FORMAT(format), routines[i], context); if (context != NULL) diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index dc374db..75e411f 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -40,6 +40,7 @@ #include "../../format/format.h" #include "../../glibext/delayed-int.h" #include "../../gui/panels/log.h" +#include "../../plugins/pglist.h" @@ -379,13 +380,18 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con * * ******************************************************************************/ -GCodeBuffer *disassemble_binary(const GOpenidaBinary *binary, GBinPart **parts, size_t parts_count, GArchInstruction **instrs) +GCodeBuffer *disassemble_binary(GOpenidaBinary *binary, GBinPart **parts, size_t parts_count, GArchInstruction **instrs) { GCodeBuffer *result; /* Tampon constitué à renvoyer */ const uint8_t *data; /* Données binaires brutes */ off_t length; /* Quantité de ces données */ GDelayedDisassembly *disass; /* Désassemblage à mener */ GWorkQueue *queue; /* Gestionnaire de différés */ + GPluginModule **pglist; /* Liste de greffons */ + size_t pgcount; /* Taille de cette liste */ + size_t i; /* Boucle de parcours */ + + /* Déroulement de l'opération principale */ result = g_code_buffer_new(); @@ -403,6 +409,19 @@ GCodeBuffer *disassemble_binary(const GOpenidaBinary *binary, GBinPart **parts, g_object_unref(G_OBJECT(disass)); + /* Actions post-désassemblage */ + + pglist = get_all_plugins_for_action(PGA_DISASS_PROCESS, &pgcount); + + if (pgcount > 0) + { + for (i = 0; i < pgcount; i++) + g_plugin_module_execute_action_on_binary(pglist[i], binary, PGA_DISASS_PROCESS); + + free(pglist); + + } + return result; } diff --git a/src/analysis/disass/disassembler.h b/src/analysis/disass/disassembler.h index 2a0f72a..54da069 100644 --- a/src/analysis/disass/disassembler.h +++ b/src/analysis/disass/disassembler.h @@ -31,7 +31,7 @@ /* Procède à la décompilation des routines d'un fichier donné. */ -GCodeBuffer *disassemble_binary(const GOpenidaBinary *, GBinPart **parts, size_t parts_count, GArchInstruction **); +GCodeBuffer *disassemble_binary(GOpenidaBinary *, GBinPart **parts, size_t parts_count, GArchInstruction **); diff --git a/src/format/dex/method.c b/src/format/dex/method.c index c22c11f..25145f5 100644 --- a/src/format/dex/method.c +++ b/src/format/dex/method.c @@ -147,14 +147,16 @@ GDexMethod *g_dex_method_new(const GDexFormat *format, const encoded_method *see result->info = *seed; result->body = item; - printf(" ==== %s ====\n", g_binary_routine_get_name(routine)); + //printf(" ==== %s ====\n", g_binary_routine_get_name(routine)); //printf(" method idx :: %d\n", seed->method_idx_diff); //printf(" code size :: %d\n", item.insns_size); + /* printf(" code regs :: %d\n", item.registers_size); printf(" code ins :: %d\n", item.ins_size); printf(" code outs :: %d\n", item.outs_size); + */ //printf(" method idx :: %lld\n", *last); diff --git a/src/gui/panels/log.c b/src/gui/panels/log.c index 2ab6d0c..6bda922 100644 --- a/src/gui/panels/log.c +++ b/src/gui/panels/log.c @@ -124,7 +124,7 @@ static GtkWidget *build_log_panel(void) renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_add_attribute(column, renderer, "text", LGC_STRING); + gtk_tree_view_column_add_attribute(column, renderer, "markup", LGC_STRING); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); @@ -239,7 +239,7 @@ void log_variadic_message(LogMessageType type, const char *fmt, ...) char *ptr; /* Nouvelle allocation */ va_list ap; /* Liste d'arguments variable */ - len = 100; + len = VARIADIC_LOG_BUFSIZE; buffer = calloc(len, sizeof(char)); while (buffer != NULL) diff --git a/src/gui/panels/log.h b/src/gui/panels/log.h index c8fe790..264078c 100644 --- a/src/gui/panels/log.h +++ b/src/gui/panels/log.h @@ -36,6 +36,10 @@ #define PANEL_LOG_ID _("Messages") +/* Tranche d'allocation pour les messages complexes */ +#define VARIADIC_LOG_BUFSIZE 256 + + /* Type de messages disponibles */ typedef enum _LogMessageType { diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h index 0c7ff1c..c1579b2 100644 --- a/src/plugins/plugin-def.h +++ b/src/plugins/plugin-def.h @@ -49,10 +49,12 @@ typedef enum _PluginAction PGA_DISASSEMBLE = (1 << 1), /* Désassemblage (non trivial) */ - PGA_CODE_PROCESS = (1 << 2), /* Traitement du code existant */ + PGA_DISASS_PROCESS = (1 << 2), /* Traitement niveau assembleur*/ + PGA_CODE_PROCESS = (1 << 3), /* Traitement du code existant */ + + PGA_DEBUGGER_ATTACH = (1 << 4), /* Activation d'un débogueur */ + PGA_DEBUGGER_DETACH = (1 << 5) /* Désactivation d'un débogueur*/ - PGA_DEBUGGER_ATTACH = (1 << 3), /* Activation d'un débogueur */ - PGA_DEBUGGER_DETACH = (1 << 4) /* Désactivation d'un débogueur*/ } PluginAction; @@ -64,9 +66,6 @@ typedef PluginType (* get_plugin_type_fc) (void); /* Fournit une indication sur le type d'opération(s) menée(s). */ //typedef PluginAction (* get_plugin_action_fc) (void); -/* Exécute une action définie sur un binaire chargé. */ -typedef bool (* execute_action_on_binary_fc) (GOpenidaBinary *, PluginAction); - /* PGA_FORMAT_MATCHER */ diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index a4f3cb6..56753e0 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -29,12 +29,16 @@ #include "plugin-def.h" +#include "../gui/panels/log.h" +/* Précise le nom associé au greffon. */ +typedef char * (* get_plugin_name_fc) (void); + /* Procède à l'initialisation du greffon */ -typedef bool (* init_plugin_fc) (GObject *); +typedef bool (* init_plugin_fc) (GPluginModule *, GObject *); /* Fournit une indication sur le type d'opération(s) menée(s). */ typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); @@ -42,6 +46,9 @@ typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); /* Identifie un format à associer à un contenu binaire. */ typedef MatchingFormatAction (* is_matching_fc) (const GPluginModule *, char **, bin_t **, off_t *); +/* Exécute une action définie sur un binaire chargé. */ +typedef bool (* execute_action_on_binary_fc) (const GPluginModule *, GOpenidaBinary *, PluginAction); + /* Exécute une action relative à un débogueur. */ typedef bool (* execute_on_debugger_fc) (const GPluginModule *, GBinaryDebugger *, PluginAction); @@ -53,6 +60,7 @@ struct _GPluginModule GModule *module; /* Abstration de manipulation */ + char *name; /* Nom associé au greffon */ PluginType type; /* Type(s) du greffon */ init_plugin_fc init; /* Procédure d'initialisation */ @@ -75,8 +83,11 @@ struct _GPluginModuleClass +/* Présente dans le journal un message simple. */ +void g_plugin_module_log_simple_message(const GPluginModule *, LogMessageType, const char *); - +/* Présente dans le journal un message complexe. */ +void g_plugin_module_log_variadic_message(const GPluginModule *, LogMessageType, const char *, ...); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 7521008..e769df6 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -26,7 +26,12 @@ #include <gmodule.h> +#include <libgen.h> +#include <malloc.h> +#include <stdarg.h> #include <stdbool.h> +#include <stdio.h> +#include <string.h> #include "plugin-int.h" @@ -98,22 +103,26 @@ static void g_plugin_module_init(GPluginModule *line) GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) { GPluginModule *result; /* Structure à retourner */ + get_plugin_name_fc get_name; /* Nom du greffon */ get_plugin_action_fc __get_type; /* Type(s) de greffon */ get_plugin_action_fc get_action; /* Actions du greffon */ - + char *dir; /* Répertoire modifiable */ result = g_object_new(G_TYPE_PLUGIN_MODULE, NULL); result->module = g_module_open(filename, G_MODULE_BIND_LAZY); + if (!result->module) goto bad_plugin; - if (!result->module) + if (!g_module_symbol(result->module, "get_plugin_name", (gpointer *)&get_name)) { - printf("err null mod\n"); - return NULL; - + log_variadic_message(LMT_ERROR, + _("No 'get_plugin_name' entry in plugin candidate '%s'"), + filename); + goto bad_plugin; } + result->name = get_name(); if (!g_module_symbol(result->module, "init_plugin", (gpointer *)&result->init)) { @@ -166,12 +175,21 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) - if (!result->init(ref)) - printf("Err loading pg\n"); - else printf("Loaded '%s' : ok (%p)\n", filename, result); + if (!result->init(result, ref)) + { + log_variadic_message(LMT_ERROR, _("Initialization of plugin '%s' failed !"), filename); + goto bad_plugin; + } + + dir = strdup(filename); + dir = dirname(dir); - return result; + log_variadic_message(LMT_PROCESS, _("Loaded the '<b>%s</b>' from the '<b>%s</b>' directory"), + strrchr(filename, G_DIR_SEPARATOR) + 1, dir); + free(dir); + + return result; bad_plugin: @@ -186,6 +204,115 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) * * * Paramètres : plugin = greffon à consulter. * * * +* Description : Fournit le nom associé au greffon. * +* * +* Retour : Désignation humaine. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_plugin_module_get_name(const GPluginModule *plugin) +{ + return plugin->name; + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* msg = message à faire apparaître à l'écran. * +* * +* Description : Présente dans le journal un message simple. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_plugin_module_log_simple_message(const GPluginModule *plugin, LogMessageType type, const char *msg) +{ + size_t len; /* Taille tampon disponible */ + char *buffer; /* Tampon du msg reconstitué */ + + len = 1 + strlen(plugin->name) + 2 + strlen(msg) + 1; + buffer = calloc(len, sizeof(char)); + + strcpy(buffer, "["); + strcat(buffer, plugin->name); + strcat(buffer, "] "); + strcat(buffer, msg); + + log_simple_message(type, buffer); + + free(buffer); + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* type = espèce du message à ajouter. * +* fmt = format du message à faire apparaître à l'écran. * +* ... = éventuels arguments venant compléter le message. * +* * +* Description : Présente dans le journal un message complexe. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessageType type, const char *fmt, ...) +{ + size_t len; /* Taille tampon disponible */ + char *buffer; /* Tampon du msg reconstitué */ + int ret; /* Bilan d'une impression */ + char *ptr; /* Nouvelle allocation */ + va_list ap; /* Liste d'arguments variable */ + + len = VARIADIC_LOG_BUFSIZE; + buffer = calloc(len, sizeof(char)); + + while (buffer != NULL) + { + va_start(ap, fmt); + ret = vsnprintf(buffer, len, fmt, ap); + va_end(ap); + + if (ret >= 0 && ret < len) break; + + else + { + if (ret > -1) len += 1; /* glibc 2.1 */ + else len *= 2; /* glibc 2.0 */ + + if ((ptr = realloc(buffer, len)) == NULL) + { + free(buffer); + buffer = NULL; + } + else buffer = ptr; + + } + + } + + g_plugin_module_log_simple_message(plugin, type, buffer); + + free(buffer); + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* * * Description : Indique les opérations offertes par un greffon donné. * * * * Retour : Action(s) offerte(s) par le greffon. * @@ -262,7 +389,7 @@ MatchingFormatAction g_plugin_module_is_matching(const GPluginModule *plugin, ch bool g_plugin_module_execute_action_on_binary(const GPluginModule *plugin, GOpenidaBinary *binary, PluginAction action) { - return plugin->exec_on_bin(binary, action); + return plugin->exec_on_bin(plugin, binary, action); } diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index dbd27fd..aa90ee1 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -54,6 +54,9 @@ GType g_plugin_module_get_type(void); /* Crée un module pour un greffon donné. */ GPluginModule *g_plugin_module_new(const gchar *, GObject *); +/* Fournit le nom associé au greffon. */ +const char *g_plugin_module_get_name(const GPluginModule *); + /* Indique les opérations offertes par un greffon donné. */ PluginAction g_plugin_module_get_action(const GPluginModule *); |