summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-11-18 18:46:08 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-11-18 18:46:08 (GMT)
commit0f914ad3fdcc1ebac5789b55b9677e7868016e21 (patch)
treebafc46ac54d02ff35310c3433615e6b74010a920
parent23bc425f9c35c31a80d65d824452c8728614a206 (diff)
Allowed to attach debug information to formats.
-rw-r--r--plugins/dex/format.c2
-rw-r--r--plugins/elf/format.c2
-rw-r--r--plugins/pychrysalide/plugin.c6
-rw-r--r--src/format/executable-int.h2
-rw-r--r--src/format/executable.c31
-rw-r--r--src/format/format.c2
-rw-r--r--src/plugins/pglist.h3
-rw-r--r--src/plugins/plugin-def.h4
-rw-r--r--src/plugins/plugin-int.h8
-rw-r--r--src/plugins/plugin.c25
-rw-r--r--src/plugins/plugin.h6
11 files changed, 56 insertions, 35 deletions
diff --git a/plugins/dex/format.c b/plugins/dex/format.c
index b657fe6..5ae0ec8 100644
--- a/plugins/dex/format.c
+++ b/plugins/dex/format.c
@@ -407,7 +407,7 @@ static bool g_dex_format_analyze(GDexFormat *format, wgroup_id_t gid, GtkStatusS
g_executable_format_setup_portions(exe, status);
- if (!g_executable_format_complete_loading(exe, status))
+ if (!g_executable_format_complete_loading(exe, gid, status))
goto gdfa_error;
result = true;
diff --git a/plugins/elf/format.c b/plugins/elf/format.c
index 340c2c7..d6bdc5e 100644
--- a/plugins/elf/format.c
+++ b/plugins/elf/format.c
@@ -403,7 +403,7 @@ static bool g_elf_format_analyze(GElfFormat *format, wgroup_id_t gid, GtkStatusS
if (!find_all_elf_strings(format, gid, status))
goto gefa_error;
- if (!g_executable_format_complete_loading(exe, status))
+ if (!g_executable_format_complete_loading(exe, gid, status))
goto gefa_error;
result = true;
diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c
index 34a0129..fb2044d 100644
--- a/plugins/pychrysalide/plugin.c
+++ b/plugins/pychrysalide/plugin.c
@@ -408,10 +408,6 @@ GPluginModule *g_python_plugin_new(const char *modname, const char *filename)
switch (action)
{
- case PGA_FORMAT_LOADER_LAST:
- /* TODO */
- break;
-
default:
log_variadic_message(LMT_WARNING,
_("Unknown action '0x%02x' in plugin '%s'..."),
@@ -757,7 +753,7 @@ static bool py_plugin_module_define_constants(PyTypeObject *obj_type)
result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_ANALYSIS_STARTED);
result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_PRELOAD);
- result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_LOADER_LAST);
+ result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_ATTACH_DEBUG);
result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_ANALYSIS_ENDED);
result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_POST_ANALYSIS_STARTED);
result &= PyDict_AddIntMacro(obj_type, PGA_FORMAT_POST_ANALYSIS_ENDED);
diff --git a/src/format/executable-int.h b/src/format/executable-int.h
index 58eba25..2f3ea73 100644
--- a/src/format/executable-int.h
+++ b/src/format/executable-int.h
@@ -86,7 +86,7 @@ struct _GExeFormatClass
void g_executable_format_setup_portions(GExeFormat *, GtkStatusStack *);
/* Effectue les ultimes opérations de chargement d'un binaire. */
-bool g_executable_format_complete_loading(GExeFormat *, GtkStatusStack *);
+bool g_executable_format_complete_loading(GExeFormat *, wgroup_id_t, GtkStatusStack *);
/* Fournit l'emplacement correspondant à une position physique. */
bool g_exe_format_without_virt_translate_offset_into_vmpa(const GExeFormat *, phys_t, vmpa2t *);
diff --git a/src/format/executable.c b/src/format/executable.c
index e70840b..fcc0acd 100644
--- a/src/format/executable.c
+++ b/src/format/executable.c
@@ -33,6 +33,7 @@
#include "executable-int.h"
#include "format.h"
#include "../core/logs.h"
+#include "../plugins/pglist.h"
@@ -326,6 +327,7 @@ void g_executable_format_setup_portions(GExeFormat *format, GtkStatusStack *stat
/******************************************************************************
* *
* Paramètres : format = instance à traiter. *
+* gid = groupe de travail dédié. *
* status = barre de statut à tenir informée. *
* *
* Description : Effectue les ultimes opérations de chargement d'un binaire. *
@@ -336,14 +338,37 @@ void g_executable_format_setup_portions(GExeFormat *format, GtkStatusStack *stat
* *
******************************************************************************/
-bool g_executable_format_complete_loading(GExeFormat *format, GtkStatusStack *status)
+bool g_executable_format_complete_loading(GExeFormat *format, wgroup_id_t gid, GtkStatusStack *status)
{
bool result; /* Bilan à faire remonter */
+ size_t count; /* Qté d'infos supplémentaires */
+ size_t i; /* Boucle de parcours */
+ GDbgFormat *dbg; /* Informations de débogage */
GBinFormat *base; /* Version basique du format */
- base = G_BIN_FORMAT(format);
+ result = true;
+
+ attach_debug_format(format);
+
+ count = g_exe_format_count_debug_info(format);
+
+ for (i = 0; i < count && result; i++)
+ {
+ dbg = g_exe_format_get_debug_info(format, i);
+
+ result = g_binary_format_analyze(G_BIN_FORMAT(dbg), gid, status);
+
+ g_object_unref(G_OBJECT(dbg));
- result = g_binary_format_complete_loading(base, status);
+ }
+
+ if (result)
+ {
+ base = G_BIN_FORMAT(format);
+
+ result = g_binary_format_complete_loading(base, status);
+
+ }
return result;
diff --git a/src/format/format.c b/src/format/format.c
index de57e4c..05e4597 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -203,8 +203,6 @@ static void g_binary_format_finalize(GBinFormat *format)
bool g_binary_format_complete_loading(GBinFormat *format, GtkStatusStack *status)
{
- handle_binary_format(PGA_FORMAT_LOADER_LAST, format, status);
-
g_binary_format_delete_duplicated_symbols(format);
return true;
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index 31c9c29..0c8f6af 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -109,6 +109,9 @@ GPluginModule **get_all_plugins_for_action(PluginAction, size_t *);
#define preload_binary_format(a, f, i, s) \
process_all_plugins_for(a, g_plugin_module_preload_binary_format, f, i, s)
+#define attach_debug_format(f) \
+ process_all_plugins_for(PGA_FORMAT_ATTACH_DEBUG, g_plugin_module_attach_debug_format, f)
+
/* DPS_DISASSEMBLY */
#define process_disassembly_event(a, b, s, c) \
diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h
index fd05b00..96b04b1 100644
--- a/src/plugins/plugin-def.h
+++ b/src/plugins/plugin-def.h
@@ -147,7 +147,7 @@ typedef enum _PluginAction
PGA_FORMAT_PRELOAD = DPC_BINARY_PROCESSING | DPS_FORMAT | DEFINE_PLUGIN_ACTION(1),
/* Accompagnement du chargement */
- PGA_FORMAT_LOADER_LAST = DPC_BINARY_PROCESSING | DPS_FORMAT | DEFINE_PLUGIN_ACTION(2),
+ PGA_FORMAT_ATTACH_DEBUG = DPC_BINARY_PROCESSING | DPS_FORMAT | DEFINE_PLUGIN_ACTION(2),
/* Fin de l'analyse d'un format */
PGA_FORMAT_ANALYSIS_ENDED = DPC_BINARY_PROCESSING | DPS_FORMAT | DEFINE_PLUGIN_ACTION(3),
@@ -155,7 +155,7 @@ typedef enum _PluginAction
/* Début de la vague finale d'analyse d'un format */
PGA_FORMAT_POST_ANALYSIS_STARTED = DPC_BINARY_PROCESSING | DPS_FORMAT | DEFINE_PLUGIN_ACTION(4),
- /* Début de la vague finale d'analyse d'un format */
+ /* Fin de la vague finale d'analyse d'un format */
PGA_FORMAT_POST_ANALYSIS_ENDED = DPC_BINARY_PROCESSING | DPS_FORMAT | DEFINE_PLUGIN_ACTION(5),
/**
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h
index cee6242..8df3527 100644
--- a/src/plugins/plugin-int.h
+++ b/src/plugins/plugin-int.h
@@ -53,12 +53,12 @@ typedef void (* pg_include_theme_fc) (const GPluginModule *, PluginAction, char
/* Assure l'interprétation d'un format en différé. */
typedef bool (* pg_handle_format_analysis_fc) (const GPluginModule *, PluginAction, GBinFormat *, wgroup_id_t, GtkStatusStack *);
-/* Procède à une opération liée au format de fichier uniquement. */
-typedef bool (* pg_handle_format_fc) (const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *);
-
/* Procède à un préchargement de format de fichier. */
typedef bool (* pg_preload_format_fc) (const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *);
+/* Procède au rattachement d'éventuelles infos de débogage. */
+typedef void (* pg_attach_debug) (const GPluginModule *, PluginAction, GExeFormat *);
+
/* Exécute une action pendant un désassemblage de binaire. */
typedef void (* pg_process_disassembly_fc) (const GPluginModule *, PluginAction, GLoadedBinary *, GtkStatusStack *, GProcContext *);
@@ -89,8 +89,8 @@ struct _GPluginModule
pg_handle_loaded_fc handle_loaded; /* Traitement de contenu chargé*/
pg_handle_format_analysis_fc handle_fmt_analysis; /* Analyse de format */
- pg_handle_format_fc handle_format; /* Manipulation du format */
pg_preload_format_fc preload_format; /* Préchargement d'un format */
+ pg_attach_debug attach_debug; /* Informations de débogage */
pg_process_disassembly_fc process_disass; /* Catégorie 'désassemblage' */
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index 161d6a6..1608032 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -377,15 +377,15 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
goto bad_plugin;
break;
- case PGA_FORMAT_LOADER_LAST:
+ case PGA_FORMAT_PRELOAD:
if (!load_plugin_symbol(result->module,
- "handle_binary_format", &result->handle_format))
+ "preload_binary_format", &result->preload_format))
goto bad_plugin;
break;
- case PGA_FORMAT_PRELOAD:
+ case PGA_FORMAT_ATTACH_DEBUG:
if (!load_plugin_symbol(result->module,
- "preload_binary_format", &result->preload_format))
+ "chrysalide_plugin_attach_debug", &result->attach_debug))
goto bad_plugin;
break;
@@ -869,9 +869,10 @@ bool g_plugin_module_handle_binary_format_analysis(const GPluginModule *plugin,
* Paramètres : plugin = greffon à manipuler. *
* action = type d'action attendue. *
* format = format de binaire à manipuler pendant l'opération. *
+* info = informations à constituer en avance de phase. *
* status = barre de statut à tenir informée. *
* *
-* Description : Procède à une opération liée au format de fichier uniquement.*
+* Description : Procède à un préchargement de format de fichier. *
* *
* Retour : Bilan de l'exécution du traitement. *
* *
@@ -879,9 +880,9 @@ bool g_plugin_module_handle_binary_format_analysis(const GPluginModule *plugin,
* *
******************************************************************************/
-bool g_plugin_module_handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GtkStatusStack *status)
+bool g_plugin_module_preload_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GPreloadInfo *info, GtkStatusStack *status)
{
- return plugin->handle_format(plugin, action, format, status);
+ return plugin->preload_format(plugin, action, format, info, status);
}
@@ -891,20 +892,18 @@ bool g_plugin_module_handle_binary_format(const GPluginModule *plugin, PluginAct
* Paramètres : plugin = greffon à manipuler. *
* action = type d'action attendue. *
* format = format de binaire à manipuler pendant l'opération. *
-* info = informations à constituer en avance de phase. *
-* status = barre de statut à tenir informée. *
* *
-* Description : Procède à un préchargement de format de fichier. *
+* Description : Procède au rattachement d'éventuelles infos de débogage. *
* *
-* Retour : Bilan de l'exécution du traitement. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-bool g_plugin_module_preload_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GPreloadInfo *info, GtkStatusStack *status)
+void g_plugin_module_attach_debug_format(const GPluginModule *plugin, PluginAction action, GExeFormat *format)
{
- return plugin->preload_format(plugin, action, format, info, status);
+ plugin->attach_debug(plugin, action, format);
}
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 1127604..86dba25 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -103,12 +103,12 @@ void g_plugin_module_handle_loaded_content(const GPluginModule *, PluginAction,
/* Procède à une opération liée à l'analyse d'un format. */
bool g_plugin_module_handle_binary_format_analysis(const GPluginModule *, PluginAction, GBinFormat *, wgroup_id_t, GtkStatusStack *);
-/* Procède à une opération liée au format de fichier uniquement. */
-bool g_plugin_module_handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *);
-
/* Procède à un préchargement de format de fichier. */
bool g_plugin_module_preload_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *);
+/* Procède au rattachement d'éventuelles infos de débogage. */
+void g_plugin_module_attach_debug_format(const GPluginModule *, PluginAction, GExeFormat *);
+
/* Exécute une action pendant un désassemblage de binaire. */
void g_plugin_module_process_disassembly_event(const GPluginModule *, PluginAction, GLoadedBinary *, GtkStatusStack *, GProcContext *);