From 1f1693722646de5ac8d2299a22121a760941f75e Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 11 Jul 2011 00:40:33 +0000 Subject: Saved improvements of binaries support. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@208 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 22 ++++++++++++++++++++++ src/analysis/binary.c | 13 +++++++++++++ src/common/xml.c | 37 +++++++++++++++++++++++++++++++++++-- src/common/xml.h | 5 ++++- src/dialogs/Makefile.am | 1 + src/editor.c | 35 +++++++++++++++++++++++++++++++++-- src/format/part.c | 2 +- src/gtkext/easygtk.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/gtkext/easygtk.h | 3 +++ 9 files changed, 153 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 60be647..bc64dc5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +11-07-11 Cyrille Bagard + + * src/analysis/binary.c: + Load the type of binary from XML. + + * src/common/xml.c: + * src/common/xml.h: + Provide a way to specify string attributes in nodes. + + * src/dialogs/Makefile.am: + Add add_shellcode.[ch] to libdialogs_la_SOURCES. + + * src/editor.c: + Define new menus for adding binaries. + + * src/format/part.c: + Update call to [_]add_string_attribute_to_node. + + * src/gtkext/easygtk.c: + * src/gtkext/easygtk.h: + Create the 'qck_create_textview()' function. + 11-01-06 Cyrille Bagard * po/fr.po: diff --git a/src/analysis/binary.c b/src/analysis/binary.c index f13a887..15be43e 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -445,6 +445,7 @@ GOpenidaBinary *g_openida_binary_new_from_file(const char *filename) GOpenidaBinary *g_openida_binary_new_from_xml(xmlXPathContextPtr context, const char *path) { GOpenidaBinary *result; /* Adresse à retourner */ + char *type; /* Tupe de binaire à charger */ size_t access_len; /* Taille d'un chemin interne */ char *access; /* Chemin pour une sous-config.*/ char *filename; /* Chemin du binaire à charger */ @@ -456,6 +457,14 @@ GOpenidaBinary *g_openida_binary_new_from_xml(xmlXPathContextPtr context, const result = NULL; + /* Type */ + + type = get_node_prop_value(context, path, "type"); + + printf("###type### %s\n", type); + + free(type); + /* Chemin du fichier à retrouver */ access = strdup(path); @@ -627,6 +636,10 @@ bool g_openida_binary_save(const GOpenidaBinary *binary, xmlDocPtr xdoc, xmlXPat result = true; + /* Type */ + + result &= add_string_attribute_to_node(xdoc, context, path, "type", "file"); + /* Nom du fichier associé */ access = strdup(path); diff --git a/src/common/xml.c b/src/common/xml.c index eb450e0..a90bc65 100644 --- a/src/common/xml.c +++ b/src/common/xml.c @@ -878,7 +878,7 @@ bool add_content_to_node(xmlDocPtr xdoc, xmlXPathContextPtr context, const char * * ******************************************************************************/ -bool add_string_attribute_to_node(xmlNodePtr node, const char *name, const char *value) +bool _add_string_attribute_to_node(xmlNodePtr node, const char *name, const char *value) { xmlAttrPtr attrib; /* Attribut créé et en place */ @@ -891,6 +891,39 @@ bool add_string_attribute_to_node(xmlNodePtr node, const char *name, const char /****************************************************************************** * * +* Paramètres : xdoc = structure XML chargée. * +* context = contexte à utiliser pour les recherches. * +* path = chemin d'accès au noeud visé. * +* name = nom de la propriété à créer. * +* value = chaîne de caractère à placer. * +* * +* Description : Ajoute une propriété à un noeud existant donné. * +* * +* Retour : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool add_string_attribute_to_node(xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path, const char *name, const char *value) +{ + xmlNodePtr node; /* Noeud à modifier */ + xmlAttrPtr attrib; /* Attribut créé et en place */ + + if (value == NULL) return true; + + node = ensure_node_exist(xdoc, context, path); + if (node == NULL) return false; + + attrib = xmlSetProp(node, BAD_CAST name, BAD_CAST value); + + return (attrib != NULL); + +} + + +/****************************************************************************** +* * * Paramètres : node = noeud dont le contenu est à mettre à jour. * * name = nom de la propriété à créer. * * value = valeur numérique à placer. * @@ -909,6 +942,6 @@ bool add_long_attribute_to_node(xmlNodePtr node, const char *name, long value) snprintf(tmp, 11, "%ld", value); - return add_string_attribute_to_node(node, name, tmp); + return _add_string_attribute_to_node(node, name, tmp); } diff --git a/src/common/xml.h b/src/common/xml.h index a555f56..988a6d7 100644 --- a/src/common/xml.h +++ b/src/common/xml.h @@ -124,7 +124,10 @@ xmlNodePtr ensure_node_exist(xmlDocPtr, xmlXPathContextPtr, const char *); bool add_content_to_node(xmlDocPtr, xmlXPathContextPtr, const char *, const char *); /* Ajoute une propriété à un noeud existant donné. */ -bool add_string_attribute_to_node(xmlNodePtr, const char *, const char *); +bool _add_string_attribute_to_node(xmlNodePtr, const char *, const char *); + +/* Ajoute une propriété à un noeud existant donné. */ +bool add_string_attribute_to_node(xmlDocPtr, xmlXPathContextPtr, const char *, const char *, const char *); /* Ajoute une propriété à un noeud existant donné. */ bool add_long_attribute_to_node(xmlNodePtr, const char *, long); diff --git a/src/dialogs/Makefile.am b/src/dialogs/Makefile.am index 359ac95..16b2dc7 100644 --- a/src/dialogs/Makefile.am +++ b/src/dialogs/Makefile.am @@ -3,6 +3,7 @@ noinst_LTLIBRARIES = libdialogs.la libdialogs_la_SOURCES = \ about.h about.c \ + add_shellcode.h add_shellcode.c \ binparts.h binparts.c \ export.h export.c \ plugins.h plugins.c diff --git a/src/editor.c b/src/editor.c index 4211b73..ee1684a 100644 --- a/src/editor.c +++ b/src/editor.c @@ -52,6 +52,7 @@ #include "gtkext/gtkviewpanel.h" #include "debug/debugger.h" +#include "dialogs/add_shellcode.h" #include "dialogs/binparts.h" #include "dialogs/export.h" #include "dialogs/plugins.h" @@ -65,8 +66,6 @@ -void sigchld_handler(int num); - /* Construit la fenêtre de l'éditeur. */ @@ -106,6 +105,9 @@ void mcb_view_code(GtkCheckMenuItem *, gpointer); /* Affiche la boîte d'ajout d'un binaire au projet courant. */ void mcb_project_add_binary(GtkMenuItem *, gpointer); +/* Réagit au menu "Projet -> Ajouter un binaire -> Shellcode". */ +static void mcb_project_add_binary_shellcode(GtkMenuItem *, GObject *); + /* Retire un binaire du projet courant. */ void mcb_project_remove_binary(GtkMenuItem *, gpointer); @@ -377,6 +379,15 @@ GtkWidget *create_editor(void) submenuitem = qck_create_menu_item(NULL, NULL, _("Add a binary..."), G_CALLBACK(mcb_project_add_binary), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + submenuitem = qck_create_menu_item(NULL, NULL, _("Add a binary"), NULL, NULL); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), submenubar); + + submenuitem = qck_create_menu_item(NULL, NULL, _("Shellcode"), G_CALLBACK(mcb_project_add_binary_shellcode), result); + gtk_container_add(GTK_CONTAINER(submenubar), submenuitem); + submenuitem = qck_create_menu_item(G_OBJECT(result), "menu_prj_remove_bin", _("Remove a binary"), NULL, NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -1032,6 +1043,26 @@ void mcb_project_add_binary(GtkMenuItem *menuitem, gpointer data) /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * +* ref = adresse de l'espace de référencement global. * +* * +* Description : Réagit au menu "Projet -> Ajouter un binaire -> Shellcode". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_project_add_binary_shellcode(GtkMenuItem *menuitem, GObject *ref) +{ + run_add_shellcode_assistant(get_current_openida_project(), GTK_WINDOW(ref)); + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * * data = adresse de l'espace de référencement global. * * * * Description : Retire un binaire du projet courant. * diff --git a/src/format/part.c b/src/format/part.c index 006cb75..371c1ef 100644 --- a/src/format/part.c +++ b/src/format/part.c @@ -220,7 +220,7 @@ bool g_binary_part_save_to_xml(const GBinPart *part, xmlDocPtr xdoc, xmlNodePtr node = add_node_to_node(xdoc, parent, "Part"); if (node == NULL) return false; - result = add_string_attribute_to_node(node, "name", part->name); + result = _add_string_attribute_to_node(node, "name", part->name); result &= add_long_attribute_to_node(node, "offset", part->offset); result &= add_long_attribute_to_node(node, "size", part->size); diff --git a/src/gtkext/easygtk.c b/src/gtkext/easygtk.c index 15071e0..3c8a29f 100644 --- a/src/gtkext/easygtk.c +++ b/src/gtkext/easygtk.c @@ -276,6 +276,47 @@ GtkWidget *qck_create_entry(GObject *object, const char *name, const char *text) * * * Paramètres : object = espace dédié à l'inscription de références. * * name = nom à donner au nouveau composant. * +* handler = éventuelle fonction de sélection associée. * +* data = données à transmettre avec l'événement si besoin. * +* * +* Description : Crée et enregistre un composant 'GtkTextView'. * +* * +* Retour : Champ de saisie mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *qck_create_textview(GObject *object, const char *name, GCallback handler, gpointer data) +{ + GtkWidget *result; /* Résultat à renvoyer */ + GtkTextBuffer *buffer; /* Tampon créé en interne GTK */ + + result = gtk_text_view_new(); + + if (G_IS_OBJECT(object) && name != NULL) + { + gtk_widget_ref(result); + g_object_set_data_full(object, name, result, (GtkDestroyNotify)g_object_unref); + } + + gtk_widget_show(result); + + if (handler != NULL) + { + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(result)); + g_signal_connect(buffer, "changed", handler, data); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : object = espace dédié à l'inscription de références. * +* name = nom à donner au nouveau composant. * * caption = intitulé du bouton à créer. * * handler = éventuelle fonction de sélection associée. * * data = données à transmettre avec l'événement si besoin. * diff --git a/src/gtkext/easygtk.h b/src/gtkext/easygtk.h index 13a415a..51b9c67 100644 --- a/src/gtkext/easygtk.h +++ b/src/gtkext/easygtk.h @@ -50,6 +50,9 @@ GtkWidget *qck_create_label(GObject *, const char *, const char *); /* Crée et enregistre un composant 'GtkEntry'. */ GtkWidget *qck_create_entry(GObject *, const char *, const char *); +/* Crée et enregistre un composant 'GtkTextView'. */ +GtkWidget *qck_create_textview(GObject *, const char *, GCallback, gpointer); + /* Crée et enregistre un composant 'GtkButton'. */ GtkWidget *qck_create_button(GObject *, const char *, const char *, GCallback, gpointer); -- cgit v0.11.2-87-g4458