summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-08-06 21:34:51 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-08-06 21:34:51 (GMT)
commitb070fb755b9e32bfa80e8854606f431d285ca23e (patch)
tree4a5cf3b8e6516cf3b93ac1fc64c1d18008c0f3e2
parentc4b5b5d4d88dc60caad7a10b22c38cc796fdec08 (diff)
Extended the API to allow obfuscators detections.
-rw-r--r--plugins/pychrysalide/analysis/loaded.c55
-rw-r--r--src/analysis/loaded.c28
-rw-r--r--src/analysis/loaded.h3
-rw-r--r--src/analysis/routine.c2
-rw-r--r--src/analysis/routine.h2
-rw-r--r--src/plugins/pglist.h5
-rw-r--r--src/plugins/plugin-def.h8
-rw-r--r--src/plugins/plugin-int.h5
-rw-r--r--src/plugins/plugin.c30
-rw-r--r--src/plugins/plugin.h3
10 files changed, 139 insertions, 2 deletions
diff --git a/plugins/pychrysalide/analysis/loaded.c b/plugins/pychrysalide/analysis/loaded.c
index 0c94a88..9b280a2 100644
--- a/plugins/pychrysalide/analysis/loaded.c
+++ b/plugins/pychrysalide/analysis/loaded.c
@@ -26,6 +26,7 @@
#include <assert.h>
+#include <malloc.h>
#include <pygobject.h>
@@ -42,6 +43,9 @@ static PyObject *py_loaded_content_analyze(PyObject *, PyObject *);
/* Lance l'analyse de l'élément chargé et attend sa conclusion. */
static PyObject *py_loaded_content_analyze_and_wait(PyObject *, PyObject *);
+/* Etablit une liste d'obscurcissements présents. */
+static PyObject *py_loaded_content_detect_obfuscators(PyObject *, PyObject *);
+
/* Détermine le nombre de vues disponibles pour un contenu. */
static PyObject *py_loaded_content_count_views(PyObject *, PyObject *);
@@ -106,6 +110,52 @@ static PyObject *py_loaded_content_analyze_and_wait(PyObject *self, PyObject *ar
/******************************************************************************
* *
+* Paramètres : self = contenu binaire à manipuler. *
+* args = non utilisé ici. *
+* *
+* Description : Etablit une liste d'obscurcissements présents. *
+* *
+* Retour : Désignations humaines correspondantes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_loaded_content_detect_obfuscators(PyObject *self, PyObject *args)
+{
+ PyObject *result; /* Bilan à retourner */
+ int version; /* Avec la version si possible */
+ int ret; /* Bilan de lecture des args. */
+ GLoadedContent *content; /* Version GLib de l'élément */
+ size_t count; /* Nombre de détections */
+ char **detections; /* Liste d'obscurcissements */
+ size_t i; /* Boucle de parcours */
+
+ ret = PyArg_ParseTuple(args, "p", &version);
+ if (!ret) Py_RETURN_NONE;
+
+ content = G_LOADED_CONTENT(pygobject_get(self));
+
+ detections = g_loaded_content_detect_obfuscators(content, version, &count);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ PyTuple_SetItem(result, i, PyUnicode_FromString(detections[i]));
+ free(detections[i]);
+ }
+
+ if (detections != NULL)
+ free(detections);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : self = contenu chargé à manipuler. *
* args = non utilisé ici. *
* *
@@ -162,6 +212,11 @@ PyTypeObject *get_python_loaded_content_type(void)
"wait for its completion."
},
{
+ "detect_obfuscators", py_loaded_content_detect_obfuscators,
+ METH_VARARGS,
+ "detect_obfuscators($self, version, /)\n--\n\nList all detected obfuscators."
+ },
+ {
"count_views", py_loaded_content_count_views,
METH_NOARGS,
"count_views($self, /)\n--\n\nCompute the quantity of available views."
diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c
index a035e5e..9b7a2ff 100644
--- a/src/analysis/loaded.c
+++ b/src/analysis/loaded.c
@@ -370,6 +370,34 @@ const char *g_loaded_content_describe(const GLoadedContent *content, bool full)
}
+/******************************************************************************
+* *
+* Paramètres : content = élément chargé à consulter. *
+* version = précise si les versions doivent être recherchées. *
+* count = nombre de types d'obscurcissement trouvés. [OUT] *
+* *
+* Description : Etablit une liste d'obscurcissements présents. *
+* *
+* Retour : Désignations humaines correspondantes à libérer après usage *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char **g_loaded_content_detect_obfuscators(const GLoadedContent *content, bool version, size_t *count)
+{
+ char **result; /* Liste à retourner */
+
+ result = NULL;
+ *count = 0;
+
+ detect_external_tools(PGA_DETECTION_OBFUSCATORS, content, version, &result, count);
+
+ return result;
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* GESTION DYNAMIQUE DES VUES */
diff --git a/src/analysis/loaded.h b/src/analysis/loaded.h
index 71e1ff6..60d1fce 100644
--- a/src/analysis/loaded.h
+++ b/src/analysis/loaded.h
@@ -79,6 +79,9 @@ bool g_loaded_content_analyze_and_wait(GLoadedContent *);
/* Fournit le désignation associée à l'élément chargé. */
const char *g_loaded_content_describe(const GLoadedContent *, bool);
+/* Etablit une liste d'obscurcissements présents. */
+char **g_loaded_content_detect_obfuscators(const GLoadedContent *, bool, size_t *);
+
/* --------------------------- GESTION DYNAMIQUE DES VUES --------------------------- */
diff --git a/src/analysis/routine.c b/src/analysis/routine.c
index 3b47930..edb9cb3 100644
--- a/src/analysis/routine.c
+++ b/src/analysis/routine.c
@@ -491,7 +491,7 @@ size_t g_binary_routine_get_args_count(const GBinRoutine *routine)
* *
******************************************************************************/
-GBinVariable *g_binary_routine_get_arg(GBinRoutine *routine, size_t index)
+GBinVariable *g_binary_routine_get_arg(const GBinRoutine *routine, size_t index)
{
GBinVariable *result; /* Argument à retourner */
diff --git a/src/analysis/routine.h b/src/analysis/routine.h
index e1512a8..1a2cd92 100644
--- a/src/analysis/routine.h
+++ b/src/analysis/routine.h
@@ -105,7 +105,7 @@ void g_binary_routine_add_arg(GBinRoutine *, GBinVariable *);
size_t g_binary_routine_get_args_count(const GBinRoutine *);
/* Fournit un argument d'une routine. */
-GBinVariable *g_binary_routine_get_arg(GBinRoutine *, size_t);
+GBinVariable *g_binary_routine_get_arg(const GBinRoutine *, size_t);
/* Retire un argument d'une routine. */
void g_binary_routine_remove_arg(GBinRoutine *, size_t);
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index b2635eb..7cc4416 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -109,6 +109,11 @@ GPluginModule **get_all_plugins_for_action(PluginAction, size_t *);
#define process_disassembly_event(a, b, s, c) \
process_all_plugins_for(a, g_plugin_module_process_disassembly_event, b, s, c)
+/* DPS_DETECTION */
+
+#define detect_external_tools(a, cnt, v, n, c) \
+ process_all_plugins_for(a, g_plugin_module_detect_external_tools, cnt, v, n, c)
+
#endif /* _PLUGINS_PGLIST_H */
diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h
index 6bc2086..b8b0e0d 100644
--- a/src/plugins/plugin-def.h
+++ b/src/plugins/plugin-def.h
@@ -83,6 +83,7 @@ typedef uint32_t plugin_action_t;
#define DPS_CONTENT DEFINE_PLUGIN_SUB_CATEGORY(0)
#define DPS_FORMAT DEFINE_PLUGIN_SUB_CATEGORY(1)
#define DPS_DISASSEMBLY DEFINE_PLUGIN_SUB_CATEGORY(2)
+#define DPS_DETECTION DEFINE_PLUGIN_SUB_CATEGORY(3)
// GUI -> project
// binary loaded
@@ -172,6 +173,13 @@ typedef enum _PluginAction
/* Désassemblage fini */
PGA_DISASSEMBLY_ENDED = DPC_BINARY_PROCESSING | DPS_DISASSEMBLY | DEFINE_PLUGIN_ACTION(9),
+ /**
+ * DPC_BINARY_PROCESSING | DPS_DETECTION
+ */
+
+ /* Intervention en toute fin d'analyse de contenu chargé */
+ PGA_DETECTION_OBFUSCATORS = DPC_BINARY_PROCESSING | DPS_DETECTION | DEFINE_PLUGIN_ACTION(0),
+
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h
index 04b87bb..d04d9ab 100644
--- a/src/plugins/plugin-int.h
+++ b/src/plugins/plugin-int.h
@@ -59,6 +59,9 @@ typedef bool (* pg_handle_format_fc) (const GPluginModule *, PluginAction, GBinF
/* Procède à un préchargement de format de fichier. */
typedef bool (* pg_preload_format_fc) (const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *);
+/* Effectue la détection d'effets d'outils externes. */
+typedef void (* pg_detect_tools_fc) (const GPluginModule *, PluginAction, const GLoadedContent *, bool, char ***, size_t *);
+
@@ -124,6 +127,8 @@ struct _GPluginModule
pg_handle_format_fc handle_format; /* Manipulation du format */
pg_preload_format_fc preload_format; /* Préchargement d'un format */
+ pg_detect_tools_fc detect; /* Lancement de détections */
+
};
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index de9c953..7780f43 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -373,6 +373,12 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
goto bad_plugin;
break;
+ case DPS_DETECTION:
+ if (!load_plugin_symbol(result->module,
+ "chrysalide_plugin_detect_external_tools", &result->detect))
+ goto bad_plugin;
+ break;
+
default:
log_variadic_message(LMT_WARNING,
_("Unknown sub-category '0x%02x' in plugin '%s'..."), sub, filename);
@@ -847,3 +853,27 @@ void g_plugin_module_process_disassembly_event(const GPluginModule *plugin, Plug
plugin->process_disass(plugin, action, binary, status, context);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à manipuler. *
+* action = type d'action attendue. *
+* content = élément chargé à consulter. *
+* version = précise si les versions doivent être recherchées. *
+* names = désignations humaines correspondantes, à libérer. *
+* count = nombre de types d'obscurcissement trouvés. [OUT] *
+* *
+* Description : Effectue la détection d'effets d'outils externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_plugin_module_detect_external_tools(const GPluginModule *plugin, PluginAction action, const GLoadedContent *content, bool version, char ***names, size_t *count)
+{
+ plugin->detect(plugin, action, content, version, names, count);
+
+}
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index d0aeb28..a73cc6f 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -106,6 +106,9 @@ bool g_plugin_module_preload_binary_format(const GPluginModule *, PluginAction,
/* Exécute une action pendant un désassemblage de binaire. */
void g_plugin_module_process_disassembly_event(const GPluginModule *, PluginAction, GLoadedBinary *, GtkStatusStack *, GProcContext *);
+/* Effectue la détection d'effets d'outils externes. */
+void g_plugin_module_detect_external_tools(const GPluginModule *, PluginAction, const GLoadedContent *, bool, char ***, size_t *);
+
#endif /* _PLUGINS_PLUGIN_H */