diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-04-29 17:13:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-04-29 17:13:36 (GMT) |
commit | e2f87e6e92a361cdd66b6867f51dda2abb1ed1b3 (patch) | |
tree | 2c3b5473c6042f64c145eb25cf923be8935ae793 /src/plugins | |
parent | 1e9b23fb37755fef5992f65cb9862fab271e13d9 (diff) |
Saved the current work on the overjump plugin.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@61 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/Makefile.am | 15 | ||||
-rw-r--r-- | src/plugins/overjump/Makefile.am | 17 | ||||
-rw-r--r-- | src/plugins/overjump/overjump.c | 313 | ||||
-rw-r--r-- | src/plugins/overjump/overjump.h | 50 | ||||
-rw-r--r-- | src/plugins/pglist.c | 147 | ||||
-rw-r--r-- | src/plugins/pglist.h | 7 | ||||
-rw-r--r-- | src/plugins/plugin-def.h | 55 | ||||
-rw-r--r-- | src/plugins/plugin.c | 77 | ||||
-rw-r--r-- | src/plugins/plugin.h | 9 |
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 */ |