summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2011-07-11 00:40:33 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2011-07-11 00:40:33 (GMT)
commit1f1693722646de5ac8d2299a22121a760941f75e (patch)
tree44b86a5fa26439b35b5416ff47f8612f3733c5fd
parentcb8d8fb7a69dfd7ef03585d921ddccfc452f39de (diff)
Saved improvements of binaries support.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@208 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog22
-rw-r--r--src/analysis/binary.c13
-rw-r--r--src/common/xml.c37
-rw-r--r--src/common/xml.h5
-rw-r--r--src/dialogs/Makefile.am1
-rw-r--r--src/editor.c35
-rw-r--r--src/format/part.c2
-rw-r--r--src/gtkext/easygtk.c41
-rw-r--r--src/gtkext/easygtk.h3
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 <nocbos@gmail.com>
+
+ * 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 <nocbos@gmail.com>
* 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);