summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-08-03 13:03:26 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-08-03 13:03:26 (GMT)
commitb7c83221f2a60be8ee5d44a7599dbe6869af005f (patch)
tree814e294533920d18f8734baa9aaef47c676e520a /src
parent7d2b7ca95966c2d687526cd75a96d1ea67d3f503 (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.c18
-rw-r--r--src/analysis/decomp/decompiler.c2
-rw-r--r--src/analysis/disass/disassembler.c21
-rw-r--r--src/analysis/disass/disassembler.h2
-rw-r--r--src/format/dex/method.c4
-rw-r--r--src/gui/panels/log.c4
-rw-r--r--src/gui/panels/log.h4
-rw-r--r--src/plugins/plugin-def.h11
-rw-r--r--src/plugins/plugin-int.h15
-rw-r--r--src/plugins/plugin.c147
-rw-r--r--src/plugins/plugin.h3
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 *);