summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Makefile.am15
-rw-r--r--src/plugins/overjump/Makefile.am17
-rw-r--r--src/plugins/overjump/overjump.c313
-rw-r--r--src/plugins/overjump/overjump.h50
-rw-r--r--src/plugins/pglist.c147
-rw-r--r--src/plugins/pglist.h7
-rw-r--r--src/plugins/plugin-def.h55
-rw-r--r--src/plugins/plugin.c77
-rw-r--r--src/plugins/plugin.h9
9 files changed, 675 insertions, 15 deletions
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 2d480bb..f6ceef2 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -1,17 +1,22 @@
-lib_LIBRARIES = libplugins.a
+lib_LTLIBRARIES = libplugins.la
-libplugins_a_SOURCES = \
+libplugins_la_SOURCES = \
pglist.h pglist.c \
+ plugin-def.h \
plugin.h plugin.c
-libplugins_a_CFLAGS = $(AM_CFLAGS)
+libplugins_la_CFLAGS = $(AM_CFLAGS)
+libpyoida_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS) $(LIBPYTHON_LIBS) \
+ -L../common/.libs -lcommon \
+ -L../format/.libs -lformat
-INCLUDES = $(LIBGTK_CFLAGS)
+
+INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS)
AM_CPPFLAGS =
AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
-SUBDIRS = pyoida
+SUBDIRS = overjump pyoida
diff --git a/src/plugins/overjump/Makefile.am b/src/plugins/overjump/Makefile.am
new file mode 100644
index 0000000..1101c34
--- /dev/null
+++ b/src/plugins/overjump/Makefile.am
@@ -0,0 +1,17 @@
+
+lib_LTLIBRARIES = libpluginoverjump.la
+
+libpluginoverjump_la_SOURCES = \
+ overjump.h overjump.c
+
+libpluginoverjump_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS) $(LIBPYTHON_LIBS) \
+ -L../../panel/.libs -lpanel
+
+
+INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS)
+
+AM_CPPFLAGS =
+
+AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
+
+SUBDIRS =
diff --git a/src/plugins/overjump/overjump.c b/src/plugins/overjump/overjump.c
new file mode 100644
index 0000000..f712979
--- /dev/null
+++ b/src/plugins/overjump/overjump.c
@@ -0,0 +1,313 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * overjump.c - greffon assurant un désassemblage pour les architectures Intel
+ *
+ * Copyright (C) 2009 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "overjump.h"
+
+
+#include <malloc.h>
+#include <stdlib.h>
+
+
+
+typedef uint64_t vmpa_t;
+
+
+
+
+/* Instance de désassemblage supportant les sauts */
+typedef struct _overjump_instance
+{
+ off_t bin_length; /* Taille des données brutes */
+ uint8_t *bin_data; /* Données binaires brutes */
+
+ exe_format *format; /* Format du binaire */
+ asm_processor *proc; /* Architecture du binaire */
+ disass_options *options; /* Options de désassemblage */
+
+ bin_part **parts; /* Parts binaires à ausculter */
+ size_t parts_count; /* Quantité de ces parts */
+
+} overjump_instance;
+
+
+/* Localise une adresse virtuelle donnée. */
+size_t get_bin_part_from_vmpa(overjump_instance *, vmpa_t, off_t *, off_t *, vmpa_t *);
+
+/* Désassemble une ou plusieures adresses virtuelles. */
+GRenderingLine *disassemble_address(overjump_instance *, vmpa_t, bool);
+
+
+
+/******************************************************************************
+* *
+* Paramètres : ref = espace de référencement global. *
+* *
+* Description : Initialise le greffon pour le désassemblage Intel. *
+* *
+* Retour : true. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+overjump_instance *create_overjump_instance(openida_binary *binary)
+{
+ overjump_instance *result; /* Instance crée à renvoyer */
+
+ result = (overjump_instance *)calloc(1, sizeof(overjump_instance));
+
+ result->bin_data = get_openida_binary_data(binary, &result->bin_length);
+
+ result->format = get_openida_binary_format(binary);
+ result->proc = get_openida_binary_processor(binary);
+ result->options = get_openida_binary_options(binary);
+
+ result->parts = get_elf_default_code_parts(result->format, &result->parts_count);
+ qsort(result->parts, result->parts_count, sizeof(bin_part *), compare_bin_parts);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : instance = instance personnalisée du greffon à manipuler. *
+* addr = adresse en mémoire recherchée. *
+* pos = position de la section à donner. [OUT] *
+* size = taille de la section à donner. [OUT] *
+* base = adresse virtuelle de la section à donner. [OUT] *
+* *
+* Description : Localise une adresse virtuelle donnée. *
+* *
+* Retour : Indice de la partie concernée, ou parts_count si non trouvée.*
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t get_bin_part_from_vmpa(overjump_instance *instance, vmpa_t addr, off_t *pos, off_t *size, vmpa_t *base)
+{
+ size_t result; /* Indice à retourner */
+
+ for (result = 0; result < instance->parts_count; result++)
+ {
+ get_bin_part_values(instance->parts[result], pos, size, base);
+
+ if (*base <= addr && addr < (*base + *size))
+ break;
+
+ }
+
+ return result;
+
+}
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : instance = instance personnalisée du greffon à manipuler. *
+* addr = adresse en mémoire recherchée. *
+* onlyone = fixe une limite pour le désassemblage. *
+* *
+* Description : Désassemble une ou plusieures adresses virtuelles. *
+* *
+* Retour : Liste de lignes de rendu transcrites. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GRenderingLine *disassemble_address(overjump_instance *instance, vmpa_t addr, bool onlyone)
+{
+ GRenderingLine *result; /* Liste à retourner */
+ off_t pos; /* Début de partie concernée */
+ off_t size; /* Taille de cette partie */
+ vmpa_t base; /* Adresse de base de la partie*/
+ size_t index; /* Indice de la partie trouvée */
+
+
+
+ off_t start;
+
+ off_t npos;
+ uint64_t offset;
+
+
+
+
+ asm_instr *instr;
+ GRenderingLine *line;
+
+
+ result = NULL;
+
+ index = get_bin_part_from_vmpa(instance, addr, &pos, &size, &base);
+
+
+ start = pos + addr - base;
+ npos = 0;
+
+
+ offset = addr;
+
+
+ instr = decode_instruction(instance->proc, &instance->bin_data[start],
+ &npos, size, start, offset);
+
+
+ line = g_code_line_new(offset, instr, instance->options);
+ g_rendering_line_add_to_lines(&result, line);
+
+
+
+
+ return result;
+
+}
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : ref = espace de référencement global. *
+* *
+* Description : Initialise le greffon pour le désassemblage Intel. *
+* *
+* Retour : true. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool init_plugin(GObject *ref)
+{
+
+ printf("Init overjump\n");
+
+
+
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Fournit une indication sur le type d'opération(s) menée(s). *
+* *
+* Retour : Description d'une action. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+G_MODULE_EXPORT PluginAction get_plugin_action(void)
+{
+ return PGA_DISASSEMBLE;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : binary = binaire dont le contenu est à désassembler. *
+* *
+* Description : S'occupe du désassemblage (pur) de code binaire. *
+* *
+* Retour : Lignes de code pour la représentation à insérer. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+G_MODULE_EXPORT GRenderingLine *disassemble_binary_parts(openida_binary *binary)
+{
+
+ GRenderingLine *result;
+ overjump_instance *instance;
+
+
+
+
+ off_t start;
+ off_t pos;
+ off_t len;
+
+ uint64_t base = 0;
+ uint64_t offset = 0;
+
+ GRenderingLine *line;
+
+ asm_instr *instr;
+
+ result = NULL;
+
+ instance = create_overjump_instance(binary);
+
+
+ result = disassemble_address(instance, get_exe_entry_point(instance->format), true);
+
+
+
+#if 0
+
+ get_bin_part_values(instance->parts[0], &pos, &len, &base);
+
+ /* Décodage des instructions */
+
+ start = pos;
+ pos = 0;
+
+
+ offset = base + pos;
+
+
+ instr = decode_instruction(instance->proc, &instance->bin_data[start], &pos, len, start, offset);
+
+
+ line = g_code_line_new(offset, instr, instance->options);
+ g_rendering_line_add_to_lines(&result, line);
+
+
+
+ disassemble_address(overjump_instance *instance, vmpa_t addr, bool onlyone);
+
+#endif
+
+
+ return result;
+
+}
+
+
diff --git a/src/plugins/overjump/overjump.h b/src/plugins/overjump/overjump.h
new file mode 100644
index 0000000..c7687d4
--- /dev/null
+++ b/src/plugins/overjump/overjump.h
@@ -0,0 +1,50 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * overjump.h - prototypes pour le greffon assurant un désassemblage pour les architectures Intel
+ *
+ * Copyright (C) 2009 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _PLUGINS_OVERJUMP_H
+#define _PLUGINS_OVERJUMP_H
+
+
+#include <glib-object.h>
+#include <gmodule.h>
+#include <stdbool.h>
+
+
+#include "../plugin-def.h"
+
+
+
+/* Initialise le greffon pour le désassemblage Intel. */
+bool init_plugin(GObject *);
+
+
+
+/* Fournit une indication sur le type d'opération(s) menée(s). */
+G_MODULE_EXPORT PluginAction get_plugin_action(void);
+
+/* S'occupe du désassemblage (pur) de code binaire. */
+G_MODULE_EXPORT GRenderingLine *disassemble_binary_parts(openida_binary *);
+
+
+
+#endif /* _PLUGINS_OVERJUMP_H */
diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c
index 8301eb3..85421e6 100644
--- a/src/plugins/pglist.c
+++ b/src/plugins/pglist.c
@@ -25,7 +25,16 @@
#include "pglist.h"
+#include <dirent.h>
+#include <malloc.h>
+#include <string.h>
+
+
+#include <config.h>
+
+
#include "plugin.h"
+#include "../common/extstr.h"
@@ -34,14 +43,21 @@ typedef struct _plugins_list
{
GObject *ref; /* Référencement global */
-
-
+ GPluginModule **plugins; /* Liste de greffons */
+ size_t plugins_count; /* Taille de cette liste */
} plugins_list;
/* Liste de l'ensemble des greffons */
-static plugins_list list;
+static plugins_list _list;
+
+
+/* Filtre les répertoire et les modules de greffons pootentels. */
+int filter_dirs_or_mods(const struct dirent *);
+
+/* Part à la recherche de greffons sous forme de modules. */
+void browse_directory_for_plugins(plugins_list *, const char *);
@@ -51,7 +67,7 @@ static plugins_list list;
* *
* Description : Procède au chargement des différents greffons trouvés. *
* *
-* Retour : Toujours true (même s'il y a des erreurs de chargemet). *
+* Retour : Toujours true (même s'il y a des erreurs de chargement). *
* *
* Remarques : - *
* *
@@ -59,15 +75,128 @@ static plugins_list list;
bool init_all_plugins(GObject *ref)
{
- GPluginModule *pg;
+ _list.ref = ref;
- list.ref = ref;
+ browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/src/plugins");
+ return true;
- pg = g_plugin_module_new("/home/ocb/prog/openida.pg/src/plugins/pyoida/pyoidamodule.so", list.ref);
+}
- printf("plug ? %p\n", pg);
- return true;
+/******************************************************************************
+* *
+* Paramètres : entry = entrée de répertoire à analyser. *
+* *
+* Description : Filtre les répertoire et les modules de greffons pootentels. *
+* *
+* Retour : Valeur non nulle pour garder l'élément. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+int filter_dirs_or_mods(const struct dirent *entry)
+{
+ int result; /* Conclusion à remonter */
+
+ if (entry->d_type == DT_DIR)
+ result = strcmp(entry->d_name, ".") * strcmp(entry->d_name, "..");
+
+ else
+ result = (strrcmp(entry->d_name, "." G_MODULE_SUFFIX) == 0 ? 1 : 0);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : list = liste de greffons à compléter si possible. *
+* dir = répertoire à parcourir en quête de greffons (sans /). *
+* *
+* Description : Part à la recherche de greffons sous forme de modules. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void browse_directory_for_plugins(plugins_list *list, const char *dir)
+{
+ struct dirent **namelist; /* Eléments trouvés */
+ int ret; /* Bilan du parcours */
+ char *filename; /* Elément à ausculter */
+ GPluginModule *plugin; /* Greffon à intégrer ou pas */
+
+ ret = scandir(dir, &namelist, filter_dirs_or_mods, alphasort);
+ if (ret < 0)
+ {
+ perror("scandir");
+ return;
+ }
+
+ while (ret--)
+ {
+ filename = (char *)calloc(strlen(dir) + 1 + strlen(namelist[ret]->d_name) + 1, sizeof(char));
+
+ strcpy(filename, dir);
+ strcat(filename, "/"); /* FIXME : Win */
+ strcat(filename, namelist[ret]->d_name);
+
+ if (namelist[ret]->d_type == DT_DIR)
+ browse_directory_for_plugins(list, filename);
+
+ else
+ {
+ plugin = g_plugin_module_new(filename, list->ref);
+
+ if (plugin != NULL)
+ {
+ list->plugins = (GPluginModule **)realloc(list->plugins, ++list->plugins_count * sizeof(GPluginModule *));
+ list->plugins[list->plugins_count - 1] = plugin;
+ }
+
+ }
+
+ free(filename);
+ free(namelist[ret]);
+
+ }
+
+ free(namelist);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : action = fonctionnalité recherchée. *
+* *
+* Description : Founit un greffon offrant le service demandé. *
+* *
+* Retour : Greffon satisfaisant ou NULL si aucun. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GPluginModule *get_one_plugin_for_action(PluginAction action)
+{
+ GPluginModule *result; /* Greffon à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = NULL;
+
+ for (i = 0; i < _list.plugins_count; i++)
+ if (g_plugin_module_get_action(_list.plugins[i]) & action)
+ {
+ result = _list.plugins[i];
+ break;
+ }
+
+ return result;
}
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index 89abd51..4aa77cd 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -30,10 +30,17 @@
#include <gtk/gtk.h>
+#include "plugin-def.h"
+#include "plugin.h"
+
+
/* Procède au chargement des différents greffons trouvés. */
bool init_all_plugins(GObject *);
+/* Founit un greffon offrant le service demandé. */
+GPluginModule *get_one_plugin_for_action(PluginAction);
+
#endif /* _PLUGINS_PGLIST_H */
diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h
new file mode 100644
index 0000000..68167e2
--- /dev/null
+++ b/src/plugins/plugin-def.h
@@ -0,0 +1,55 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * plugin-def.h - prototypes pour les définitions de base utiles aux greffons
+ *
+ * Copyright (C) 2009 Cyrille Bagard
+ *
+ * This file is part of OpenIDA.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#ifndef _PLUGINS_PLUGIN_DEF_H
+#define _PLUGINS_PLUGIN_DEF_H
+
+
+#include "../analysis/binary.h"
+#include "../analysis/line.h"
+
+
+
+/* Action(s) menée(s) par le greffon */
+typedef enum _PluginAction
+{
+ PGA_DISASSEMBLE = (1 << 0) /* Désassemblage (non trivial) */
+
+} PluginAction;
+
+
+
+
+
+/* Fournit une indication sur le type d'opération(s) menée(s). */
+typedef PluginAction (* get_plugin_action_fc) (void);
+
+
+
+/* S'occupe du désassemblage (pur) de code binaire. */
+typedef GRenderingLine * (* disassemble_binary_parts_fc) (openida_binary *);
+
+
+
+#endif /* _PLUGINS_PLUGIN_DEF_H */
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index f21ac02..80daa74 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -30,6 +30,8 @@
+
+
/* Procède à l'initialisation du greffon */
typedef bool (* init_plugin_fc) (GObject *);
@@ -42,8 +44,12 @@ struct _GPluginModule
GModule *module; /* Abstration de manipulation */
+ PluginAction action; /* Opération(s) menée(s) */
+
init_plugin_fc init; /* Procédure d'initialisation */
+ disassemble_binary_parts_fc disassemble;/* Fonction de désassemblage */
+
};
@@ -104,7 +110,6 @@ static void g_plugin_module_init(GPluginModule *line)
}
-
/******************************************************************************
* *
* Paramètres : filename = nom du fichier à charger. *
@@ -121,6 +126,8 @@ static void g_plugin_module_init(GPluginModule *line)
GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)
{
GPluginModule *result; /* Structure à retourner */
+ get_plugin_action_fc __get_action; /* Actions du greffon */
+
result = g_object_new(G_TYPE_PLUGIN_MODULE, NULL);
@@ -128,6 +135,32 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)
result->module = g_module_open(filename, G_MODULE_BIND_LAZY);
+
+ if (!g_module_symbol(result->module, "get_plugin_action", (gpointer *)&__get_action))
+ {
+ printf("Err plugin get_action sym\n");
+ //g_object_destroy(result);
+ return NULL;
+ }
+
+ result->action = __get_action();
+
+
+ /* ... */
+ if (result->action & PGA_DISASSEMBLE)
+ {
+ if (!g_module_symbol(result->module, "disassemble_binary_parts", (gpointer *)&result->disassemble))
+ {
+ printf("Err plugin disass sym\n");
+ //g_object_destroy(result);
+ return NULL;
+ }
+
+
+ }
+
+
+
if (!g_module_symbol(result->module, "init_plugin", (gpointer *)&result->init))
{
printf("Err plugin init sym\n");
@@ -136,9 +169,51 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref)
+
+
+
if (!result->init(ref))
printf("Err loading pg\n");
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à consulter. *
+* *
+* Description : Indique les opérations offertes par un greffon donné. *
+* *
+* Retour : Action(s) offerte(s) par le greffon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+PluginAction g_plugin_module_get_action(const GPluginModule *plugin)
+{
+ return plugin->action;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à consulter. *
+* binary = binaire dont le contenu est à désassembler. *
+* *
+* Description : S'occupe du désassemblage (pur) de code binaire. *
+* *
+* Retour : Lignes de code pour la représentation à insérer. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GRenderingLine *g_plugin_module_disassemble_binary_parts(const GPluginModule *plugin, openida_binary *binary)
+{
+ return plugin->disassemble(binary);
+
+}
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 6013e21..455f17c 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -29,6 +29,9 @@
#include <glib-object.h>
+#include "plugin-def.h"
+
+
/* Greffon pour OpenIDA (instance) */
typedef struct _GPluginModule GPluginModule;
@@ -51,6 +54,12 @@ GType g_plugin_module_get_type(void);
/* Crée un module pour un greffon donné. */
GPluginModule *g_plugin_module_new(const gchar *, GObject *);
+/* Indique les opérations offertes par un greffon donné. */
+PluginAction g_plugin_module_get_action(const GPluginModule *);
+
+/* S'occupe du désassemblage (pur) de code binaire. */
+GRenderingLine *g_plugin_module_disassemble_binary_parts(const GPluginModule *, openida_binary *);
+
#endif /* _PLUGINS_PLUGIN_H */