From c476dae9b50d6ff218e903e3f8d40ad51003fa40 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Fri, 4 Dec 2015 20:05:58 +0100 Subject: Moved all files related to the GUI into the 'gui' directory. --- ChangeLog | 60 ++++ configure.ac | 4 +- src/Makefile.am | 6 +- src/dialogs/Makefile.am | 21 -- src/dialogs/about.c | 166 --------- src/dialogs/about.h | 37 -- src/dialogs/bookmark.c | 328 ------------------ src/dialogs/bookmark.h | 44 --- src/dialogs/export.c | 790 ------------------------------------------- src/dialogs/export.h | 40 --- src/dialogs/goto.c | 251 -------------- src/dialogs/goto.h | 43 --- src/dialogs/gotox.c | 500 --------------------------- src/dialogs/gotox.h | 47 --- src/dialogs/plugins.c | 313 ----------------- src/dialogs/plugins.h | 40 --- src/dialogs/shellcode.c | 803 -------------------------------------------- src/dialogs/shellcode.h | 37 -- src/dialogs/storage.c | 648 ----------------------------------- src/dialogs/storage.h | 40 --- src/editor.c | 446 ------------------------ src/editor.h | 38 --- src/gui/Makefile.am | 4 +- src/gui/dialogs/Makefile.am | 21 ++ src/gui/dialogs/about.c | 166 +++++++++ src/gui/dialogs/about.h | 37 ++ src/gui/dialogs/bookmark.c | 328 ++++++++++++++++++ src/gui/dialogs/bookmark.h | 44 +++ src/gui/dialogs/export.c | 790 +++++++++++++++++++++++++++++++++++++++++++ src/gui/dialogs/export.h | 40 +++ src/gui/dialogs/goto.c | 251 ++++++++++++++ src/gui/dialogs/goto.h | 43 +++ src/gui/dialogs/gotox.c | 500 +++++++++++++++++++++++++++ src/gui/dialogs/gotox.h | 47 +++ src/gui/dialogs/plugins.c | 313 +++++++++++++++++ src/gui/dialogs/plugins.h | 40 +++ src/gui/dialogs/shellcode.c | 803 ++++++++++++++++++++++++++++++++++++++++++++ src/gui/dialogs/shellcode.h | 37 ++ src/gui/dialogs/storage.c | 648 +++++++++++++++++++++++++++++++++++ src/gui/dialogs/storage.h | 40 +++ src/gui/editor.c | 446 ++++++++++++++++++++++++ src/gui/editor.h | 38 +++ src/gui/menus/Makefile.am | 3 +- src/gui/menus/binary.c | 6 +- src/gui/menus/edition.c | 6 +- src/gui/menus/help.c | 2 +- src/gui/menus/project.c | 2 +- src/gui/panels/strings.c | 2 +- src/main.c | 2 +- 49 files changed, 4710 insertions(+), 4651 deletions(-) delete mode 100644 src/dialogs/Makefile.am delete mode 100644 src/dialogs/about.c delete mode 100644 src/dialogs/about.h delete mode 100644 src/dialogs/bookmark.c delete mode 100644 src/dialogs/bookmark.h delete mode 100644 src/dialogs/export.c delete mode 100644 src/dialogs/export.h delete mode 100644 src/dialogs/goto.c delete mode 100644 src/dialogs/goto.h delete mode 100644 src/dialogs/gotox.c delete mode 100644 src/dialogs/gotox.h delete mode 100644 src/dialogs/plugins.c delete mode 100644 src/dialogs/plugins.h delete mode 100644 src/dialogs/shellcode.c delete mode 100644 src/dialogs/shellcode.h delete mode 100644 src/dialogs/storage.c delete mode 100644 src/dialogs/storage.h delete mode 100644 src/editor.c delete mode 100644 src/editor.h create mode 100644 src/gui/dialogs/Makefile.am create mode 100644 src/gui/dialogs/about.c create mode 100644 src/gui/dialogs/about.h create mode 100644 src/gui/dialogs/bookmark.c create mode 100644 src/gui/dialogs/bookmark.h create mode 100644 src/gui/dialogs/export.c create mode 100644 src/gui/dialogs/export.h create mode 100644 src/gui/dialogs/goto.c create mode 100644 src/gui/dialogs/goto.h create mode 100644 src/gui/dialogs/gotox.c create mode 100644 src/gui/dialogs/gotox.h create mode 100644 src/gui/dialogs/plugins.c create mode 100644 src/gui/dialogs/plugins.h create mode 100644 src/gui/dialogs/shellcode.c create mode 100644 src/gui/dialogs/shellcode.h create mode 100644 src/gui/dialogs/storage.c create mode 100644 src/gui/dialogs/storage.h create mode 100644 src/gui/editor.c create mode 100644 src/gui/editor.h diff --git a/ChangeLog b/ChangeLog index 52cc5fa..5ccb406 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,65 @@ 15-12-04 Cyrille Bagard + * configure.ac: + * src/Makefile.am: + Update code. + + * src/dialogs/Makefile.am: + * src/dialogs/about.c: + * src/dialogs/about.h: + * src/dialogs/bookmark.c: + * src/dialogs/bookmark.h: + * src/dialogs/export.c: + * src/dialogs/export.h: + * src/dialogs/goto.c: + * src/dialogs/goto.h: + * src/dialogs/gotox.c: + * src/dialogs/gotox.h: + * src/dialogs/plugins.c: + * src/dialogs/plugins.h: + * src/dialogs/shellcode.c: + * src/dialogs/shellcode.h: + * src/dialogs/storage.c: + * src/dialogs/storage.h: + * src/editor.c: + * src/editor.h: + Moved files. + + * src/gui/Makefile.am: + Update code. + + * src/gui/dialogs/Makefile.am: + * src/gui/dialogs/about.c: + * src/gui/dialogs/about.h: + * src/gui/dialogs/bookmark.c: + * src/gui/dialogs/bookmark.h: + * src/gui/dialogs/export.c: + * src/gui/dialogs/export.h: + * src/gui/dialogs/goto.c: + * src/gui/dialogs/goto.h: + * src/gui/dialogs/gotox.c: + * src/gui/dialogs/gotox.h: + * src/gui/dialogs/plugins.c: + * src/gui/dialogs/plugins.h: + * src/gui/dialogs/shellcode.c: + * src/gui/dialogs/shellcode.h: + * src/gui/dialogs/storage.c: + * src/gui/dialogs/storage.h: + * src/gui/editor.c: + * src/gui/editor.h: + Moved files: move all files related to the GUI into the 'gui' directory. + + * src/gui/menus/Makefile.am: + * src/gui/menus/binary.c: + * src/gui/menus/edition.c: + * src/gui/menus/help.c: + * src/gui/menus/project.c: + * src/gui/panels/strings.c: + * src/main.c: + Update code. + +15-12-04 Cyrille Bagard + * .gitignore: Ignore the 'stamp-h1' file. diff --git a/configure.ac b/configure.ac index 5328d27..d8896fd 100644 --- a/configure.ac +++ b/configure.ac @@ -18,7 +18,7 @@ AM_SILENT_RULES AM_GNU_GETTEXT_VERSION([0.18.3]) AM_GNU_GETTEXT([external]) -AC_CONFIG_SRCDIR([src/editor.c]) +AC_CONFIG_SRCDIR([src/main.c]) ############################################################ @@ -333,7 +333,6 @@ AC_CONFIG_FILES([Makefile src/decomp/expr/dalvik/Makefile src/decomp/instr/Makefile src/decomp/lang/Makefile - src/dialogs/Makefile src/format/Makefile src/format/dex/Makefile src/format/dwarf/Makefile @@ -351,6 +350,7 @@ AC_CONFIG_FILES([Makefile src/gtkext/graph/Makefile src/gtkext/graph/nodes/Makefile src/gui/Makefile + src/gui/dialogs/Makefile src/gui/menus/Makefile src/gui/panels/Makefile src/gui/tb/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 4940a6d..159c71f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,7 +87,6 @@ libchrysaplugin_la_LIBADD = \ ############################################################ chrysalide_SOURCES = \ - editor.h editor.c \ main.c @@ -102,8 +101,7 @@ chrysalide_LDFLAGS = $(LIBGTK_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) `pk -Lplugins/.libs -lplugins -chrysalide_LDADD = $(LIBINTL) \ - dialogs/libdialogs.la +chrysalide_LDADD = $(LIBINTL) @@ -113,6 +111,6 @@ chrysalide_LDADD = $(LIBINTL) \ # glibext doit être traité en premier, à cause des marshals GLib -SUBDIRS = core glibext gtkext analysis arch format common debug decomp dialogs gui plugins +SUBDIRS = core glibext gtkext analysis arch format common debug decomp gui plugins # TODO: rm -rf panels diff --git a/src/dialogs/Makefile.am b/src/dialogs/Makefile.am deleted file mode 100644 index 1fe821a..0000000 --- a/src/dialogs/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ - -noinst_LTLIBRARIES = libdialogs.la - -libdialogs_la_SOURCES = \ - about.h about.c \ - bookmark.h bookmark.c \ - export.h export.c \ - goto.h goto.c \ - gotox.h gotox.c \ - plugins.h plugins.c \ - shellcode.h shellcode.c \ - storage.h storage.c - -libdialogs_la_LDFLAGS = - - -AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) - -AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) - -SUBDIRS = diff --git a/src/dialogs/about.c b/src/dialogs/about.c deleted file mode 100644 index 70062cc..0000000 --- a/src/dialogs/about.c +++ /dev/null @@ -1,166 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * about.h - boîte de dialogue d'information sur le programme - * - * Copyright (C) 2010-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "about.h" - - -#include -#include -#include - - -#include -#include - - -#include "../gtkext/easygtk.h" -#include "../gtkext/support.h" - - - -/* Réagit à l'appui d'une touche sur la fenêtre 'A propos'. */ -static gboolean close_about_window_on_escape(GtkWidget *, GdkEventKey *, gpointer); - - - -/****************************************************************************** -* * -* Paramètres : parent = fenêtre parente à surpasser. * -* * -* Description : Construit la fenêtre d'informations sur le logiciel. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_about_dialog(GtkWindow *parent) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GdkRGBA color; /* Couleur de fond noire */ - GtkWidget *fixed; /* Support global */ - gchar *filename; /* Chemin d'accès au fichier */ - GtkWidget *image; /* Image chargée */ - unsigned int revision; /* Numéro de révision */ - unsigned int max; /* Nbre. de boucles à effectuer*/ - unsigned int i; /* Boucle de parcours */ - unsigned int level; /* Unité la plus importante */ - char buffer[16]; /* Nom d'image à forger */ - GtkWidget *label; /* Etiquette inférieure */ - - result = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_set_size_request(result, 350, 430); - gtk_container_set_border_width(GTK_CONTAINER(result), 0); - gtk_window_set_title(GTK_WINDOW(result), _("About")); - gtk_window_set_transient_for(GTK_WINDOW(result), parent); - gtk_window_set_default_size(GTK_WINDOW(result), 350, 430); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - g_signal_connect(result, "key_press_event", G_CALLBACK(close_about_window_on_escape), NULL); - - gdk_rgba_parse(&color, "black"); - gtk_widget_override_background_color(GTK_WIDGET(result), GTK_STATE_FLAG_NORMAL, &color); - - fixed = gtk_fixed_new(); - gtk_widget_show(fixed); - gtk_container_add(GTK_CONTAINER(result), fixed); - - /* Images principales */ - - filename = find_pixmap_file("chrysalide-full.png"); - image = qck_create_image(NULL, NULL, filename); - gtk_fixed_put(GTK_FIXED(fixed), image, 10, 10); - gtk_widget_set_size_request(image, 330, 300); - - filename = find_pixmap_file("chrysalide_text.png"); - image = qck_create_image(NULL, NULL, filename); - gtk_fixed_put(GTK_FIXED(fixed), image, 48, 324); - gtk_widget_set_size_request(image, 253, 42); - - /* Numéro de révision */ - - filename = find_pixmap_file("revision.png"); - image = qck_create_image(NULL, NULL, filename); - gtk_fixed_put(GTK_FIXED(fixed), image, 149, 360); - gtk_widget_set_size_request(image, 14, 18); - - revision = REVISION; - max = log(revision) / log(10); - - for (i = 0; i <= max; i++) - { - level = pow(10, max - i); - - snprintf(buffer, 16, "revision_%u.png", revision / level); - - filename = find_pixmap_file(buffer); - image = qck_create_image(NULL, NULL, filename); - gtk_fixed_put(GTK_FIXED(fixed), image, 163 + i * 14, 360); - gtk_widget_set_size_request(image, 14, 18); - - revision %= level; - - } - - /* Copyright */ - - label = qck_create_label(NULL, NULL, "Copyright (C) 2010-2014 Cyrille Bagard"); - gtk_widget_set_halign(label, GTK_ALIGN_CENTER); - gtk_label_set_use_markup(GTK_LABEL(label), TRUE); - gtk_fixed_put(GTK_FIXED(fixed), label, 0, 400); - gtk_widget_set_size_request(label, 350, 20); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : window = fenêtre visée par la procédure. * -* event = informations liées à l'événement. * -* dummy = donnée non utilisée ici. * -* * -* Description : Réagit à l'appui d'une touche sur la fenêtre 'A propos'. * -* * -* Retour : TRUE pour poursuivre la propagation, FALSE autrement. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean close_about_window_on_escape(GtkWidget *widget, GdkEventKey *event, gpointer dummy) -{ - gboolean result; /* Ordre à retourner */ - - if (event->keyval == GDK_KEY_Escape) - { - gtk_widget_destroy(widget); - result = TRUE; - } - else result = FALSE; - - return result; - -} diff --git a/src/dialogs/about.h b/src/dialogs/about.h deleted file mode 100644 index 900f14c..0000000 --- a/src/dialogs/about.h +++ /dev/null @@ -1,37 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * about.h - prototypes pour la boîte de dialogue d'information sur le programme - * - * Copyright (C) 2010 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_ABOUT_H -#define _DIALOGS_ABOUT_H - - -#include - - - -/* Construit la fenêtre d'informations sur le logiciel. */ -GtkWidget *create_about_dialog(GtkWindow *); - - - -#endif /* _DIALOGS_ABOUT_H */ diff --git a/src/dialogs/bookmark.c b/src/dialogs/bookmark.c deleted file mode 100644 index b171087..0000000 --- a/src/dialogs/bookmark.c +++ /dev/null @@ -1,328 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * bookmark.c - boîte de dialogue pour les sauts à une adresse donnée - * - * Copyright (C) 2012-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "bookmark.h" - - -#include -#include - - -#include - - -#include "..//analysis/db/items/bookmark.h" -#include "../gtkext/easygtk.h" - - - -/* Filtre les adresses en hexadécimal pendant l'édition. */ -static void filter_addresses(GtkEntry *, const gchar *, gint, gint *, gpointer); - -/* Clôture l'édition d'une adresse. */ -static void validate_addresses(GtkEntry *, GtkDialog *); - - - -/****************************************************************************** -* * -* Paramètres : entry = composant GTK concerné par la procédure. * -* text = nouveau texte inséré. * -* length = taille de ce texte. * -* position = point d'insertion. * -* data = adresse non utilisée ici. * -* * -* Description : Filtre les adresses en hexadécimal pendant l'édition. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void filter_addresses(GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) -{ - gboolean has_hex; /* Préfixe '0x' déjà présent ? */ - gchar *filtered; /* Contenu nouveau approuvé */ - gint count; /* Nouvelle taille validée */ - gint i; /* Boucle de parcours */ - - /** - * On cherche à empêcher l'édition avant un '0x' présent, - * ce qui viendrait fausser le fitrage. - */ - has_hex = g_str_has_prefix(gtk_entry_get_text(entry), "0x"); - - filtered = g_new(gchar, length); - - count = 0; - - for (i = 0; i < length; i++) - switch (text[i]) - { - case '0' ... '9': - case 'a' ... 'f': - if (!has_hex || ((i + *position) >= 2)) - filtered[count++] = text[i]; - break; - case 'A' ... 'F': - if (!has_hex || ((i + *position) >= 2)) - filtered[count++] = tolower(text[i]); - break; - case 'x': - case 'X': - if ((i + *position) == 1) - filtered[count++] = 'x'; - break; - } - - if (count > 0) - { - g_signal_handlers_block_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); - gtk_editable_insert_text(GTK_EDITABLE(entry), filtered, count, position); - g_signal_handlers_unblock_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); - } - - g_signal_stop_emission_by_name(G_OBJECT(entry), "insert_text"); - - g_free(filtered); - -} - - -/****************************************************************************** -* * -* Paramètres : entry = composant GTK concerné par la procédure. * -* dialog = boîte de dialogue à valider. * -* * -* Description : Clôture l'édition d'une adresse. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void validate_addresses(GtkEntry *entry, GtkDialog *dialog) -{ - gtk_dialog_response(dialog, GTK_RESPONSE_OK); - -} - - -/****************************************************************************** -* * -* Paramètres : parent = fenêtre parente à surpasser. * -* addr = localisation du point à consigner. * -* * -* Description : Construit la fenêtre de création de signet. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_bookmark_dialog(GtkWindow *parent, const vmpa2t *addr) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkWidget *dlgvbox; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire #1 */ - GtkWidget *frame; /* Support avec encadrement */ - GtkWidget *sub_vbox; /* Support à construire #2 */ - GtkWidget *hbox; /* Support à construire #3 */ - GtkWidget *label; /* Message d'introduction */ - GtkWidget *entry; /* Zone de saisie principale */ - GtkWidget *radio; /* Définition de localisation */ - VMPA_BUFFER(target); /* Désignation humaine de cible*/ - - result = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(result), _("Add a bookmark")); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_window_set_modal(GTK_WINDOW(result), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); - gtk_widget_show(dlgvbox); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox); - gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); - - /* Localisation dans l'espace */ - - sub_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(sub_vbox); - - frame = qck_create_frame(_("Localisation"), sub_vbox, 8, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - /* 1) Adresse */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(sub_vbox), hbox, FALSE, TRUE, 0); - - label = qck_create_label(NULL, NULL, _("Target:")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(result), "addr", NULL); - //g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_text_empty_entry), assistant); - gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); - - /* 2) Type d'adresse */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(hbox), 8); - - radio = qck_create_radio_button(G_OBJECT(result), "phys", _("Value is physical offset"), - NULL, NULL, NULL); - gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - - radio = qck_create_radio_button(G_OBJECT(result), "virt", _("Value is virtual address"), - GTK_RADIO_BUTTON(radio), NULL, NULL); - gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - - /* Commentaire éventuel */ - - entry = qck_create_entry(G_OBJECT(result), "comment", NULL); - - frame = qck_create_frame(_("Optional comment"), entry, 8, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - /* Zone de validation */ - - gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); - - /* Remplissage avec les valeurs fournies */ - - entry = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "addr")); - - if (addr != NULL && has_virt_addr(addr)) - { - vmpa2_virt_to_string(addr, MDS_UNDEFINED, target, NULL); - radio = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "virt")); - } - - else if (addr != NULL && has_phys_addr(addr)) - { - vmpa2_virt_to_string(addr, MDS_UNDEFINED, target, NULL); - radio = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "virt")); - } - - else - radio = NULL; - - if (radio == NULL) - { - gtk_entry_set_text(GTK_ENTRY(entry), "0x"); - gtk_editable_set_position(GTK_EDITABLE(entry), -1); - gtk_widget_grab_focus(entry); - } - - else - { - gtk_entry_set_text(GTK_ENTRY(entry), target); - gtk_editable_set_position(GTK_EDITABLE(entry), -1); - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); - - } - - if (radio != NULL) - { - entry = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "comment")); - gtk_widget_grab_focus(entry); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * -* * -* Description : Fournit le signet conçu via la saisie de l'utilisateur. * -* * -* Retour : Adresse reccueillie par la boîte de dialogue. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GDbItem *get_item_from_bookmark_dialog(GtkWidget *dialog) -{ - GDbItem *result; /* Signet nouveau à retourner */ - GObject *ref; /* Espace de référencements */ - vmpa2t *orig; /* Copie de valeur originale */ - vmpa2t addr; /* Localisation finale utilisée*/ - GtkWidget *entry; /* Zone de saisie principale */ - const gchar *text; /* Adresse en version texte */ - GtkToggleButton *radio; /* Définition de localisation */ - - ref = G_OBJECT(dialog); - - /* Si la valeur d'origine a été conservée intacte... */ - - orig = (vmpa2t *)g_object_get_data(ref, "orig"); - - if (orig == NULL) - { - entry = GTK_WIDGET(g_object_get_data(ref, "addr")); - text = gtk_entry_get_text(GTK_ENTRY(entry)); - - radio = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "phys")); - - if (gtk_toggle_button_get_active(radio)) - orig = string_to_vmpa_phy(text); - else - orig = string_to_vmpa_virt(text); - - - - } - - copy_vmpa(&addr, orig); - delete_vmpa(orig); - - /* Récupération du commentaire éventuel */ - - entry = GTK_WIDGET(g_object_get_data(ref, "comment")); - text = gtk_entry_get_text(GTK_ENTRY(entry)); - - /* Mise en place du signet défini */ - - if (strlen(text) > 0) - result = G_DB_ITEM(g_db_bookmark_new(&addr, text)); - else - result = G_DB_ITEM(g_db_bookmark_new(&addr, NULL)); - - return result; - -} diff --git a/src/dialogs/bookmark.h b/src/dialogs/bookmark.h deleted file mode 100644 index 0afdb4c..0000000 --- a/src/dialogs/bookmark.h +++ /dev/null @@ -1,44 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * bookmark.h - prototypes pour la boîte de dialogue pour les sauts à une adresse donnée - * - * Copyright (C) 2012 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_BOOKMARK_H -#define _DIALOGS_BOOKMARK_H - - -#include - - -#include "../arch/vmpa.h" -#include "../analysis/db/item.h" - - - -/* Construit la fenêtre de création de signet. */ -GtkWidget *create_bookmark_dialog(GtkWindow *, const vmpa2t *); - -/* Fournit le signet conçu via la saisie de l'utilisateur. */ -GDbItem *get_item_from_bookmark_dialog(GtkWidget *); - - - -#endif /* _DIALOGS_BOOKMARK_H */ diff --git a/src/dialogs/export.c b/src/dialogs/export.c deleted file mode 100644 index 726b16d..0000000 --- a/src/dialogs/export.c +++ /dev/null @@ -1,790 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * export.c - assistant d'exportation de contenu binaire - * - * Copyright (C) 2010-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "export.h" - - -#include -#include -#include -#include -#include - - -#include - - -#include "../common/extstr.h" -#include "../gtkext/easygtk.h" - - - -/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */ - - -/* Ferme l'assistant sans dérouler la procédure. */ -static void export_assistant_cancel(GtkAssistant *, gpointer); - -/* Ferme l'assistant et déroule la procédure. */ -static void export_assistant_close(GtkAssistant *, GObject *); - - - -/* ----------------------- DEFINITION DU FORMAT D'EXPORTATION ----------------------- */ - - -/* Ajoute le panneau de choix du format d'exportation. */ -static void register_format_panel(GtkAssistant *); - -/* Réagit un changement du format pour l'exportation. */ -static void on_export_format_changed(GtkComboBox *, GtkAssistant *); - -/* Interdit un champ de texte vide pour les options de texte. */ -static void forbid_text_empty_entry(GtkEntry *, GtkAssistant *); - -/* Interdit un champ de texte vide pour les options HTML. */ -static void forbid_html_empty_entry(GtkEntry *, GtkAssistant *); - - - -/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */ - - -/* Ajoute le panneau de sélection du contenu à exporter. */ -static void register_content_panel(GtkAssistant *); - - - -/* ------------------------ DEFINITION DE LA SORTIE ATTENDUE ------------------------ */ - - -/* Ajoute le panneau de choix du type de sortie. */ -static void register_output_panel(GtkAssistant *); - -/* Réagit un changement du nom de fichier pour l'exportation. */ -static void on_export_filename_changed(GtkEntry *, GtkAssistant *); - -/* Sélectionne ou non un nouveau fichier de sortie. */ -static void on_filename_browsing_clicked(GtkButton *, GObject *); - - - -/* ---------------------------------------------------------------------------------- */ -/* PARTIE PRINCIPALE DE L'ASSISTANT */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* parent = fenêtre principale de l'éditeur. * -* * -* Description : Crée et affiche un assistant d'aide à l'exportation. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void run_export_assistant(GLoadedBinary *binary, GtkWindow *parent) -{ - GtkWidget *assistant; /* Fenêtre à afficher */ - GObject *ref; /* Espace de référencement */ - - assistant = gtk_assistant_new(); - gtk_widget_set_size_request(assistant, 500, 350); - gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER); - gtk_window_set_title(GTK_WINDOW(assistant), _("Export assistant")); - - gtk_window_set_modal(GTK_WINDOW(assistant), TRUE); - gtk_window_set_transient_for(GTK_WINDOW(assistant), parent); - - ref = G_OBJECT(assistant); - g_object_set_data(ref, "binary", binary); - - register_format_panel(GTK_ASSISTANT(assistant)); - register_content_panel(GTK_ASSISTANT(assistant)); - register_output_panel(GTK_ASSISTANT(assistant)); - - g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL); - g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref); - - gtk_widget_show_all(assistant); - -} - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* data = adresse non utilisée ici. * -* * -* Description : Ferme l'assistant sans dérouler la procédure. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void export_assistant_cancel(GtkAssistant *assistant, gpointer data) -{ - GObject *support; /* Support interne à supprimer */ - - support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "text_options")); - if (support != NULL) g_object_unref(support); - - support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "html_options")); - if (support != NULL) g_object_unref(support); - - gtk_widget_destroy(GTK_WIDGET(assistant)); - -} - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* ref = adresse de l'espace de référencement global. * -* * -* Description : Ferme l'assistant et déroule la procédure. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void export_assistant_close(GtkAssistant *assistant, GObject *ref) -{ - GtkComboBox *combo; /* Selection du format */ - BufferExportType type; /* Type d'exportation requise */ - buffer_export_context ctx; /* Contexte à constituer */ - GtkEntry *entry; /* Zone de saisie */ - const gchar *filename; /* Chemin d'accès du fichier */ - GtkToggleButton *checkbutton; /* Coche à retrouver */ - bool display[BLC_DISPLAY]; /* Affichage à garantir */ - GLoadedBinary *binary; /* Binaire chargé à parcourir */ - GCodeBuffer *buffer; /* Tampon de code à traiter */ - GBufferView *view; /* Vue à exporter */ - GObject *support; /* Support interne à supprimer */ - - /* Type d'exportation */ - - combo = GTK_COMBO_BOX(g_object_get_data(ref, "format")); - - type = (BufferExportType)gtk_combo_box_get_active(combo); - - /* Fichier de sortie */ - - entry = GTK_ENTRY(g_object_get_data(ref, "filename")); - filename = gtk_entry_get_text(entry); - - switch (type) - { - case BET_TEXT: - case BET_HTML: - ctx.fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR); - if (ctx.fd == -1) - { - perror("open"); - return; - } - break; - - default: - assert(false); - break; - - } - - /* Eléments à afficher */ - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "physical_off")); - display[BLC_PHYSICAL] = gtk_toggle_button_get_active(checkbutton); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr")); - display[BLC_VIRTUAL] = gtk_toggle_button_get_active(checkbutton); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code")); - display[BLC_BINARY] = gtk_toggle_button_get_active(checkbutton); - - /* Options éventuelles */ - - switch (type) - { - case BET_TEXT: - entry = GTK_ENTRY(g_object_get_data(ref, "text_separator")); - ctx.sep = gtk_entry_get_text(entry); - if (strcmp(ctx.sep, "\\t") == 0) ctx.sep = "\t"; - break; - - case BET_HTML: - entry = GTK_ENTRY(g_object_get_data(ref, "html_font_name")); - ctx.font_name = gtk_entry_get_text(entry); - - entry = GTK_ENTRY(g_object_get_data(ref, "html_bg_color")); - ctx.bg_color = gtk_entry_get_text(entry); - - break; - - default: - break; - - } - - /* Programmation de la tâche */ - - binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); - - buffer = g_loaded_binary_get_disassembled_buffer(binary); - view = g_buffer_view_new(buffer, NULL); - - g_buffer_view_export(view, &ctx, type, display); - - /* Conclusion */ - - switch (type) - { - case BET_TEXT: - case BET_HTML: - close(ctx.fd); - break; - - default: - break; - - } - - g_object_unref(view); - - support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "text_options")); - if (support != NULL) g_object_unref(support); - - support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "html_options")); - if (support != NULL) g_object_unref(support); - - gtk_widget_destroy(GTK_WIDGET(assistant)); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* DEFINITION DU FORMAT D'EXPORTATION */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de choix du format d'exportation. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_format_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal #1 */ - GtkWidget *hbox; /* Support principal #2 */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *combobox; /* Sélection du format */ - GtkWidget *options; /* Zone d'options */ - GtkWidget *content; /* Accueil desdites options */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Format de sortie */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("Format: ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - combobox = qck_create_combobox(G_OBJECT(assistant), "format", G_CALLBACK(on_export_format_changed), assistant); - gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0); - - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("Simple text")); - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("HTML")); - - /* Eventuelles options */ - - content = gtk_event_box_new(); - gtk_widget_show(content); - - options = qck_create_frame(_("Options"), content, 0, 12, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), options, FALSE, FALSE, 0); - - g_object_set_data(G_OBJECT(assistant), "options", content); - - /* Intégration */ - - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 1); - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Format")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_INTRO); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - -} - - -/****************************************************************************** -* * -* Paramètres : combo = liste dont la sélection vient de changer. * -* assistant = fenêtre affichée et référencement global. * -* * -* Description : Réagit un changement du format pour l'exportation. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_export_format_changed(GtkComboBox *combo, GtkAssistant *assistant) -{ - BufferExportType selected; /* Format attendu */ - GtkContainer *content; /* Accueil des options */ - GtkWidget *old; /* Ancien support à remplacer */ - GtkWidget *vbox; /* Support principal #1 */ - GtkWidget *hbox; /* Support principal #2 */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *entry; /* Zone de saisie de valeur */ - char *filename; /* Chemin à venir modifier */ - char *dot; /* Dernière occurence de point */ - - selected = (BufferExportType)gtk_combo_box_get_active(combo); - - content = GTK_CONTAINER(g_object_get_data(G_OBJECT(assistant), "options")); - - old = gtk_bin_get_child(GTK_BIN(content)); - if (old != NULL) - { - g_object_ref(G_OBJECT(old)); - gtk_container_remove(content, old); - } - - switch (selected) - { - case BET_TEXT: - - hbox = GTK_WIDGET(g_object_get_data(G_OBJECT(assistant), "text_options")); - - if (hbox == NULL) - { - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - g_object_ref(G_OBJECT(hbox)); - gtk_widget_show(hbox); - g_object_set_data(G_OBJECT(assistant), "text_options", hbox); - - label = qck_create_label(NULL, NULL, _("String between columns: ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(assistant), "text_separator", NULL); - g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_text_empty_entry), assistant); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - gtk_entry_set_text(GTK_ENTRY(entry), "\\t"); - - } - - gtk_container_add(content, hbox); - - break; - - case BET_HTML: - - vbox = GTK_WIDGET(g_object_get_data(G_OBJECT(assistant), "html_options")); - - if (vbox == NULL) - { - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - g_object_ref(G_OBJECT(vbox)); - gtk_widget_show(vbox); - g_object_set_data(G_OBJECT(assistant), "html_options", vbox); - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("HTML table font name: ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(assistant), "html_font_name", NULL); - g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_html_empty_entry), assistant); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - gtk_entry_set_text(GTK_ENTRY(entry), "monospace"); - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("HTML table background color: ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(assistant), "html_bg_color", NULL); - g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_html_empty_entry), assistant); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - gtk_entry_set_text(GTK_ENTRY(entry), "#2c2c2c"); - - } - - gtk_container_add(content, vbox); - - break; - - default: - break; - - } - - /* Mise à jour de l'extension du fichier de sortie, si possible */ - - entry = GTK_WIDGET(g_object_get_data(G_OBJECT(assistant), "filename")); - - if (entry != NULL) - { - filename = strdup(gtk_entry_get_text(GTK_ENTRY(entry))); - - dot = strrchr(filename, '.'); - if (dot == NULL) goto oefc_no_dot; - - *dot = '\0'; - - switch (selected) - { - case BET_TEXT: - filename = stradd(filename, ".txt"); - break; - case BET_HTML: - filename = stradd(filename, ".html"); - break; - default: - break; - } - - gtk_entry_set_text(GTK_ENTRY(entry), filename); - - oefc_no_dot: - - free(filename); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : entry = zone de texte dont le contenu vient de changer. * -* assistant = fenêtre affichée et référencement global. * -* * -* Description : Interdit un champ de texte vide pour les options HTML. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void forbid_text_empty_entry(GtkEntry *entry, GtkAssistant *assistant) -{ - const gchar *text; /* Texte saisi dans la zone */ - gint num; /* Etape courante */ - GtkWidget *page; /* Support de cette étape */ - - text = gtk_entry_get_text(entry); - - num = gtk_assistant_get_current_page(assistant); - page = gtk_assistant_get_nth_page(assistant, num); - - gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); - -} - - -/****************************************************************************** -* * -* Paramètres : _entry = zone de texte dont le contenu vient de changer. * -* assistant = fenêtre affichée et référencement global. * -* * -* Description : Interdit un champ de texte vide pour les options de texte. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void forbid_html_empty_entry(GtkEntry *_entry, GtkAssistant *assistant) -{ - bool status; /* Etat final à remonter */ - GtkEntry *entry; /* Zone de texte générique */ - const gchar *text; /* Texte saisi dans la zone */ - gint num; /* Etape courante */ - GtkWidget *page; /* Support de cette étape */ - - status = true; - - /* Police de caractère */ - - entry = GTK_ENTRY(g_object_get_data(G_OBJECT(assistant), "html_font_name")); - text = gtk_entry_get_text(entry); - - status &= (strlen(text) > 0); - - /* Couleur de fond */ - - entry = GTK_ENTRY(g_object_get_data(G_OBJECT(assistant), "html_bg_color")); - - if (entry != NULL) - { - text = gtk_entry_get_text(entry); - - status &= (strlen(text) > 0); - - } - - /* Mise à jour graphique */ - - num = gtk_assistant_get_current_page(assistant); - - if (num != -1) - { - page = gtk_assistant_get_nth_page(assistant, num); - - gtk_assistant_set_page_complete(assistant, page, status); - - } - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* SELECTION DU CONTENU A TRAITER */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de sélection du contenu à exporter. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_content_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal */ - GtkWidget *frame; /* Support avec encadrement */ - GtkWidget *sub_vbox; /* Division verticale */ - GtkWidget *checkbutton; /* Coche pour une option */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Eléments à afficher */ - - sub_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(sub_vbox); - - frame = qck_create_frame(_("Items to display"), sub_vbox, 0, 12, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "physical_off", _("Physical offset"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(sub_vbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(sub_vbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(sub_vbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - /* Intégration */ - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Exported content")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONTENT); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* DEFINITION DE LA SORTIE ATTENDUE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de choix du type de sortie. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_output_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal #1 */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *hbox; /* Support principal #2 */ - GtkWidget *entry; /* Zone de saisie de texte */ - GtkWidget *button; /* Sélection de fichier */ - GLoadedBinary *binary; /* Binaire chargé à parcourir */ - const char *filename; /* Chemin d'accès par défaut */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Fichier de sortie */ - - label = qck_create_label(NULL, NULL, _("File: ")); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - - button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - - /* Intégration */ - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Output")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONFIRM); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - - /* Choix par défaut */ - - binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); - filename = g_loaded_binary_get_name(binary, true); - - gtk_entry_set_text(GTK_ENTRY(entry), filename); - gtk_editable_insert_text(GTK_EDITABLE(entry), ".html", -1, (gint []) { strlen(filename) }); - - g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); - -} - - -/****************************************************************************** -* * -* Paramètres : entry = zone de texte dont le contenu vient de changer. * -* assistant = fenêtre affichée et référencement global. * -* * -* Description : Réagit un changement du nom de fichier pour l'exportation. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant) -{ - const gchar *text; /* Texte saisi dans la zone */ - gint num; /* Etape courante */ - GtkWidget *page; /* Support de cette étape */ - - text = gtk_entry_get_text(entry); - - num = gtk_assistant_get_current_page(assistant); - page = gtk_assistant_get_nth_page(assistant, num); - - gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); - -} - - -/****************************************************************************** -* * -* Paramètres : button = bouton d'édition de la sélection. * -* ref = espace de référencement principal. * -* * -* Description : Sélectionne ou non un nouveau fichier de sortie. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_filename_browsing_clicked(GtkButton *button, GObject *ref) -{ - GtkWidget *dialog; /* Boîte à afficher */ - gchar *filename; /* Nom du fichier à intégrer */ - GtkEntry *entry; /* Zone de saisie à maj. */ - - dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref), - GTK_FILE_CHOOSER_ACTION_SAVE, - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Save"), GTK_RESPONSE_ACCEPT, - NULL); - - entry = GTK_ENTRY(g_object_get_data(ref, "filename")); - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), gtk_entry_get_text(entry)); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - { - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - - gtk_entry_set_text(GTK_ENTRY(entry), filename); - - g_free(filename); - - } - - gtk_widget_destroy(dialog); - -} diff --git a/src/dialogs/export.h b/src/dialogs/export.h deleted file mode 100644 index 9db624d..0000000 --- a/src/dialogs/export.h +++ /dev/null @@ -1,40 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * export.h - prototypes pour l'assistant d'exportation de contenu binaire - * - * Copyright (C) 2010-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_EXPORT_H -#define _DIALOGS_EXPORT_H - - -#include - - -#include "../analysis/binary.h" - - - -/* Crée et affiche un assistant d'aide à l'exportation. */ -void run_export_assistant(GLoadedBinary *, GtkWindow *); - - - -#endif /* _DIALOGS_EXPORT_H */ diff --git a/src/dialogs/goto.c b/src/dialogs/goto.c deleted file mode 100644 index 847fa9a..0000000 --- a/src/dialogs/goto.c +++ /dev/null @@ -1,251 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * goto.c - boîte de dialogue pour les sauts à une adresse donnée - * - * Copyright (C) 2012-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "goto.h" - - -#include - - -#include - - -#include "../gtkext/easygtk.h" - - - -/* Filtre les adresses en hexadécimal pendant l'édition. */ -static void filter_addresses(GtkEntry *, const gchar *, gint, gint *, gpointer); - -/* Clôture l'édition d'une adresse. */ -static void validate_addresses(GtkEntry *, GtkDialog *); - - - -/****************************************************************************** -* * -* Paramètres : entry = composant GTK concerné par la procédure. * -* text = nouveau texte inséré. * -* length = taille de ce texte. * -* position = point d'insertion. * -* data = adresse non utilisée ici. * -* * -* Description : Filtre les adresses en hexadécimal pendant l'édition. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void filter_addresses(GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) -{ - gboolean has_hex; /* Préfixe '0x' déjà présent ? */ - gchar *filtered; /* Contenu nouveau approuvé */ - gint count; /* Nouvelle taille validée */ - gint i; /* Boucle de parcours */ - - /** - * On cherche à empêcher l'édition avant un '0x' présent, - * ce qui viendrait fausser le fitrage. - */ - has_hex = g_str_has_prefix(gtk_entry_get_text(entry), "0x"); - - filtered = g_new(gchar, length); - - count = 0; - - for (i = 0; i < length; i++) - switch (text[i]) - { - case '0' ... '9': - case 'a' ... 'f': - if (!has_hex || ((i + *position) >= 2)) - filtered[count++] = text[i]; - break; - case 'A' ... 'F': - if (!has_hex || ((i + *position) >= 2)) - filtered[count++] = tolower(text[i]); - break; - case 'x': - case 'X': - if ((i + *position) == 1) - filtered[count++] = 'x'; - break; - } - - if (count > 0) - { - g_signal_handlers_block_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); - gtk_editable_insert_text(GTK_EDITABLE(entry), filtered, count, position); - g_signal_handlers_unblock_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); - } - - g_signal_stop_emission_by_name(G_OBJECT(entry), "insert_text"); - - g_free(filtered); - -} - - -/****************************************************************************** -* * -* Paramètres : entry = composant GTK concerné par la procédure. * -* dialog = boîte de dialogue à valider. * -* * -* Description : Clôture l'édition d'une adresse. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void validate_addresses(GtkEntry *entry, GtkDialog *dialog) -{ - gtk_dialog_response(dialog, GTK_RESPONSE_OK); - -} - - -/****************************************************************************** -* * -* Paramètres : parent = fenêtre parente à surpasser. * -* * -* Description : Construit la fenêtre de sélection des sections. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_goto_dialog(GtkWindow *parent) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkWidget *dlgvbox; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire #1 */ - GtkWidget *label; /* Message d'introduction */ - GtkWidget *combobox; /* Liste de sélection */ - GtkWidget *entry; /* Zone de saisie principale */ - GtkWidget *hbox; /* Support à construire #2 */ - GtkWidget *radio; /* Définition de localisation */ - - result = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(result), _("Go to address")); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_window_set_modal(GTK_WINDOW(result), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); - gtk_widget_show(dlgvbox); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox); - gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); - - /* Zone de saisie principale */ - - label = qck_create_label(NULL, NULL, _("Enter the value of the target address:")); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - - combobox = qck_create_combobox_with_entry(G_OBJECT(result), "combobox", NULL, NULL); - gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, TRUE, 0); - - entry = gtk_bin_get_child(GTK_BIN(combobox)); - - g_signal_connect(G_OBJECT(entry), "insert_text", - G_CALLBACK(filter_addresses), NULL); - g_signal_connect(G_OBJECT(entry), "activate", - G_CALLBACK(validate_addresses), GTK_DIALOG(result)); - - - /* TODO */ - //gtk_combo_box_append_text(combobox, "test"); - - - /* Propriétés de la localisation */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(hbox), 8); - - radio = qck_create_radio_button(G_OBJECT(result), "phy", _("Address is physical"), - NULL, NULL, NULL); - gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - - radio = qck_create_radio_button(G_OBJECT(result), "virt", _("Address is virtual"), - GTK_RADIO_BUTTON(radio), NULL, NULL); - gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - - /* Zone de validation */ - - gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); - - gtk_entry_set_text(GTK_ENTRY(entry), "0x"); - gtk_widget_grab_focus (entry); - gtk_editable_set_position(GTK_EDITABLE(entry), -1); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * -* * -* Description : Fournit l'adresse obtenue par la saisie de l'utilisateur. * -* * -* Retour : Adresse reccueillie par la boîte de dialogue. * -* * -* Remarques : - * -* * -******************************************************************************/ - -vmpa2t *get_address_from_goto_dialog(GtkWidget *dialog) -{ - vmpa2t *result; /* Adresse à retourner */ - GtkWidget *combobox; /* Liste de sélection */ - GtkWidget *entry; /* Zone de saisie principale */ - const gchar *text; /* Adresse en version texte */ - GtkToggleButton *radio; /* Définition de localisation */ - - combobox = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), "combobox")); - entry = gtk_bin_get_child(GTK_BIN(combobox)); - - text = gtk_entry_get_text(GTK_ENTRY(entry)); - - radio = GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "phy")); - - if (gtk_toggle_button_get_active(radio)) - result = string_to_vmpa_phy(text); - else - result = string_to_vmpa_virt(text); - - return result; - -} diff --git a/src/dialogs/goto.h b/src/dialogs/goto.h deleted file mode 100644 index 7bb57b5..0000000 --- a/src/dialogs/goto.h +++ /dev/null @@ -1,43 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * goto.h - prototypes pour la boîte de dialogue pour les sauts à une adresse donnée - * - * Copyright (C) 2012 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_GOTO_H -#define _DIALOGS_GOTO_H - - -#include - - -#include "../arch/vmpa.h" - - - -/* Construit la fenêtre de saut à une adresse. */ -GtkWidget *create_goto_dialog(GtkWindow *); - -/* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ -vmpa2t *get_address_from_goto_dialog(GtkWidget *); - - - -#endif /* _DIALOGS_GOTO_H */ diff --git a/src/dialogs/gotox.c b/src/dialogs/gotox.c deleted file mode 100644 index 00c4fd0..0000000 --- a/src/dialogs/gotox.c +++ /dev/null @@ -1,500 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * goto.c - boîte de dialogue pour les sauts à une adresse donnée - * - * Copyright (C) 2012-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "gotox.h" - - -#include -#include - - -#include - - -#include "../gtkext/easygtk.h" -#include "../gtkext/support.h" - - - -/* Colonnes de la liste des symboles */ -typedef enum _GotoXColumn -{ - GXC_PHYSICAL, /* Correspondance physique */ - GXC_VIRTUAL, /* Correspondance virtuelle */ - - GXC_PICTURE, /* Image de représentation */ - GXC_ADDRESS, /* Adresse mémoire du symbole */ - GXC_NAME, /* Désignation humaine */ - GXC_CONTENT, /* Contenu de la ligne visée */ - - GXC_COUNT /* Nombre de colonnes */ - -} GotoXColumn; - - -/* Réagit à une validation d'une ligne affichée. */ -static void on_gotox_row_activated(GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, GtkDialog *); - -/* Construit la fenêtre de sélection d'adresses. */ -static GtkWidget *create_gotox_dialog(GtkWindow *, GtkTreeStore **); - -/* Ajoute une nouvelle localisation de destination. */ -static void add_new_location_to_list(GtkTreeStore *, GLoadedBinary *, const vmpa2t *, GBinSymbol *); - - - -/****************************************************************************** -* * -* Paramètres : treeview = composant graphique manipulé par l'utilisateur. * -* path = chemin d'accès à la ligne activée. * -* column = colonne impactée par l'action. * -* dialog = boîte de dialogue affichant la liste éditée. * -* * -* Description : Réagit à une validation d'une ligne affichée. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_gotox_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, GtkDialog *dialog) -{ - gtk_dialog_response(dialog, GTK_RESPONSE_OK); - -} - - -/****************************************************************************** -* * -* Paramètres : parent = fenêtre parente à surpasser. * -* store = modèle de gestion pour les éléments de liste. [OUT] * -* * -* Description : Construit la fenêtre de sélection d'adresses. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GtkWidget *create_gotox_dialog(GtkWindow *parent, GtkTreeStore **store) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkWidget *dlgvbox; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire #1 */ - GtkWidget *scrollwnd; /* Support défilant */ - GtkWidget *treeview; /* Affichage de la liste */ - GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ - GtkTreeViewColumn *column; /* Colonne de la liste */ - - result = gtk_dialog_new(); - gtk_window_set_default_size(GTK_WINDOW(result), 600, 350); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_window_set_modal(GTK_WINDOW(result), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); - gtk_widget_show(dlgvbox); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox); - gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); - - /* Liste arborescente ou linéaire */ - - scrollwnd = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrollwnd); - gtk_box_pack_start(GTK_BOX(vbox), scrollwnd, TRUE, TRUE, 0); - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); - - *store = gtk_tree_store_new(GXC_COUNT, - G_TYPE_UINT64, G_TYPE_UINT64, - CAIRO_GOBJECT_TYPE_SURFACE, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - - treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(*store)); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); - gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(treeview), TRUE); - - g_signal_connect(treeview, "row-activated", G_CALLBACK(on_gotox_row_activated), result); - - g_object_set_data(G_OBJECT(result), "treeview", treeview); - - gtk_widget_show(treeview); - gtk_container_add(GTK_CONTAINER(scrollwnd), treeview); - - /* Cellules d'affichage */ - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Address"), renderer, - "markup", GXC_ADDRESS, - NULL); - gtk_tree_view_column_set_sort_column_id(column, GXC_ADDRESS); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - column = gtk_tree_view_column_new(); - - gtk_tree_view_column_set_title(column, _("Name")); - - renderer = gtk_cell_renderer_pixbuf_new(); - gtk_tree_view_column_pack_start(column, renderer, FALSE); - gtk_tree_view_column_set_attributes(column, renderer, - "surface", GXC_PICTURE, - NULL); - - g_object_set(G_OBJECT(renderer), "xpad", 4, NULL); - - renderer = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_attributes(column, renderer, - "text", GXC_NAME, - NULL); - - gtk_tree_view_column_set_sort_column_id(column, GXC_NAME); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Content"), renderer, - "markup", GXC_CONTENT, - NULL); - gtk_tree_view_column_set_sort_column_id(column, GXC_CONTENT); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - /* Zone de validation */ - - gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(GTK_DIALOG(result), _("_Go"), GTK_RESPONSE_OK); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : parent = fenêtre parente à surpasser. * -* binary = binaire dont les points d'entrée sont à afficher. * -* * -* Description : Construit la fenêtre de sélection des points d'entrée. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *parent, GLoadedBinary *binary) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkTreeStore *store; /* Modèle de gestion */ - GBinFormat *format; /* Format associé au binaire */ - GBinSymbol **symbols; /* Symboles à représenter */ - size_t sym_count; /* Qté de symboles présents */ - bool has_entry_points; /* Présences d'insertions ? */ - size_t i; /* Boucle de parcours */ - vmpa2t addr; /* Localisation de symbole */ - - /* Mise en place de la boîte de dialogue */ - - result = create_gotox_dialog(parent, &store); - - gtk_window_set_title(GTK_WINDOW(result), _("Binary's entry points")); - - /* Affichage de tous les points d'entrées */ - - format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); - - symbols = g_binary_format_get_symbols(format, &sym_count); - - has_entry_points = false; - - for (i = 0; i < sym_count; i++) - { - if (g_binary_symbol_get_target_type(symbols[i]) != STP_ENTRY_POINT) - continue; - - copy_vmpa(&addr, get_mrange_addr(g_binary_symbol_get_range(symbols[i]))); - - add_new_location_to_list(store, binary, &addr, symbols[i]); - - has_entry_points = true; - - } - - g_object_unref(G_OBJECT(store)); - - gtk_dialog_set_response_sensitive(GTK_DIALOG(result), GTK_RESPONSE_OK, has_entry_points); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : parent = fenêtre parente à surpasser. * -* binary = binaire dont les points d'entrée sont à afficher. * -* instr = instruction de référence sur laquelle s'appuyer. * -* back = sens de la récupérations des instructions visées. * -* * -* Description : Construit la fenêtre de sélection des références croisées. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *parent, GLoadedBinary *binary, const GArchInstruction *instr, bool back) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkTreeStore *store; /* Modèle de gestion */ - GArchInstruction **list; /* Liste d'instructions */ - size_t count; /* Nombre d'éléments présents */ - size_t i; /* Boucle de parcours */ - const vmpa2t *addr; /* Adresse à considérer */ - - /* Mise en place de la boîte de dialogue */ - - result = create_gotox_dialog(parent, &store); - - if (back) - gtk_window_set_title(GTK_WINDOW(result), _("List of backward cross references")); - else - gtk_window_set_title(GTK_WINDOW(result), _("List of forward cross references")); - - /* Affichage de toutes les instructions référencées */ - - if (back) - count = g_arch_instruction_get_sources(instr, &list, NULL); - else - count = g_arch_instruction_get_destinations(instr, &list, NULL, NULL); - - for (i = 0; i < count; i++) - { - addr = get_mrange_addr(g_arch_instruction_get_range(list[i])); - - add_new_location_to_list(store, binary, addr, NULL); - - } - - g_object_unref(G_OBJECT(store)); - - gtk_dialog_set_response_sensitive(GTK_DIALOG(result), GTK_RESPONSE_OK, count > 0); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : store = modèle de gestionnaire pour la liste affichée. * -* binary = représentation du binaire chargé en mémoire. * -* addr = localisation à venir ajouter à la liste. * -* hint = éventuel symbole à venir retrouver à l'adresse. * -* * -* Description : Ajoute une nouvelle localisation de destination. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, const vmpa2t *addr, GBinSymbol *hint) -{ - GCodeBuffer *buffer; /* Tampon de désassemblage */ - GBufferLine *line; /* Ligne présente à l'adresse */ - char *virtual; /* Transcription d'adresse */ - const char *label; /* Etiquette de symbole trouvé */ - GBinFormat *format; /* Format associé au binaire */ - GBinSymbol *symbol; /* Symbole associé à l'adresse */ - phys_t diff; /* Décalage vis à vis du début */ - char *name; /* Désignation humaine */ - gchar *filename; /* Chemin d'accès à utiliser */ - cairo_surface_t *icon; /* Image pour les symboles */ - char *content; /* Contenu de la ligne visée */ - GtkTreeIter iter; /* Point d'insertion */ - - /* Adresse en mémoire virtuelle */ - - buffer = g_loaded_binary_get_disassembled_buffer(binary); - line = g_code_buffer_find_line_by_addr(buffer, addr, BLF_HAS_CODE, NULL); - - if (line != NULL) - virtual = g_buffer_line_get_text(line, BLC_VIRTUAL, BLC_VIRTUAL + 1, true); - else - virtual = strdup(_("")); - - /* Désignation humaine de l'adresse */ - - if (hint != NULL) - { - symbol = hint; - g_object_ref(G_OBJECT(symbol)); - - label = g_binary_symbol_get_label(hint); - - name = make_symbol_offset(label, 0); - - } - else - { - format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); - - if (g_binary_format_resolve_symbol(format, addr, &symbol, &diff)) - { - label = g_binary_symbol_get_label(symbol); - - /** - * Un symbole ne possède pas toujours d'étiquette. - * C'est le cas par exemple pour les valeurs chargées par - * les instructions ARM de type 'ldr'. - */ - if (label == NULL) - name = strdup(_("")); - - else - name = make_symbol_offset(label, diff); - - } - else - { - symbol = NULL; - - name = strdup(_("")); - - } - - } - - /* Image de représentation */ - - if (symbol == NULL) - filename = NULL; - - else - switch (g_binary_symbol_get_target_type(symbol)) - { - case STP_ENTRY_POINT: - filename = find_pixmap_file("entrypoint.png"); - break; - - default: - filename = NULL; - break; - - } - - if (filename != NULL) - { - icon = cairo_image_surface_create_from_png(filename); - g_free(filename); - } - else - icon = NULL; - - /* Contenu d'assemblage */ - - if (line != NULL) - content = g_buffer_line_get_text(line, BLC_ASSEMBLY_HEAD, BLC_COUNT, true); - else - content = strdup(_("")); - - /* Insertion finale */ - - gtk_tree_store_append(store, &iter, NULL); - - gtk_tree_store_set(store, &iter, - GXC_PHYSICAL, PHYS_CAST(get_phy_addr(addr)), - GXC_VIRTUAL, VIRT_CAST(get_virt_addr(addr)), - GXC_PICTURE, icon, - GXC_ADDRESS, virtual, - GXC_NAME, name, - GXC_CONTENT, content, - -1); - - if (symbol != NULL) - g_object_unref(G_OBJECT(symbol)); - - if (virtual != NULL) free(virtual); - if (icon != NULL) cairo_surface_destroy(icon); - free(name); - if (content != NULL) free(content); - - if (line != NULL) - g_object_unref(G_OBJECT(line)); - -} - - -/****************************************************************************** -* * -* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * -* * -* Description : Fournit l'adresse obtenue par la saisie de l'utilisateur. * -* * -* Retour : Adresse reccueillie par la boîte de dialogue ou NULL si rien.* -* * -* Remarques : - * -* * -******************************************************************************/ - -vmpa2t *get_address_from_gotox_dialog(GtkWidget *dialog) -{ - vmpa2t *result; /* Adresse à retourner */ - GtkTreeView *treeview; /* Liste d'adresses à lire */ - GtkTreeSelection *selection; /* Sélection courante */ - GtkTreeModel *model; /* Modèle de gestionnaire */ - GList *selected; /* Liste des sélections */ - GtkTreeIter iter; /* Tête de lecture */ - G_TYPE_PHYS phys; /* Position physique */ - G_TYPE_VIRT virt; /* Adresse virtuelle */ - - treeview = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(dialog), "treeview")); - - selection = gtk_tree_view_get_selection(treeview); - - selected = gtk_tree_selection_get_selected_rows(selection, &model); - if (selected == NULL) return NULL; - - if (!gtk_tree_model_get_iter(model, &iter, (GtkTreePath *)selected->data)) - return NULL; - - gtk_tree_model_get(model, &iter, - GXC_PHYSICAL, &phys, - GXC_VIRTUAL, &virt, - -1); - - result = make_vmpa(phys, virt); - - g_list_free_full(selected, (GDestroyNotify)gtk_tree_path_free); - - return result; - -} diff --git a/src/dialogs/gotox.h b/src/dialogs/gotox.h deleted file mode 100644 index 88d1fc9..0000000 --- a/src/dialogs/gotox.h +++ /dev/null @@ -1,47 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * goto.h - prototypes pour la boîte de dialogue pour les sauts à une adresse donnée - * - * Copyright (C) 2012 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_GOTOX_H -#define _DIALOGS_GOTOX_H - - -#include - - -#include "../analysis/binary.h" -#include "../arch/vmpa.h" - - - -/* Construit la fenêtre de sélection des points d'entrée. */ -GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *, GLoadedBinary *); - -/* Construit la fenêtre de sélection des références croisées. */ -GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *, GLoadedBinary *, const GArchInstruction *, bool); - -/* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ -vmpa2t *get_address_from_gotox_dialog(GtkWidget *); - - - -#endif /* _DIALOGS_GOTOX_H */ diff --git a/src/dialogs/plugins.c b/src/dialogs/plugins.c deleted file mode 100644 index 09a3e26..0000000 --- a/src/dialogs/plugins.c +++ /dev/null @@ -1,313 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * plugins.c - boîte de dialogue permettant une sélection des greffons - * - * Copyright (C) 2010-2012 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "plugins.h" - - -#include - - -#include "../gtkext/easygtk.h" - - - - - - - - - - -/****************************************************************************** -* * -* Paramètres : binary = informations sur le binaire actuellement ouvert. * -* parent = fenêtre parente à surpasser. * -* * -* Description : Construit la fenêtre de sélection des sections. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_plugins_selection_dialog(GLoadedBinary *binary, GtkWindow *parent) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GObject *ref; /* Espace de référencements */ - - - - - GtkWidget *vbox1; - GtkWidget *hbox3; - GtkWidget *scrolledwindow1; - GtkWidget *treeview1; - GtkWidget *vbox2; - GtkWidget *vbuttonbox1; - GtkWidget *button7; - GtkWidget *image3; - GtkWidget *button8; - GtkWidget *image4; - GtkWidget *hseparator1; - GtkWidget *vbuttonbox2; - GtkWidget *button9; - GtkWidget *image5; - GtkWidget *button10; - GtkWidget *image6; - GtkWidget *scrolledwindow2; - GtkWidget *treeview2; - GtkWidget *expander1; - GtkWidget *hbox4; - GtkWidget *vbox3; - GtkWidget *label; /* Etiquette d'introduction */ - GtkWidget *label8; - GtkWidget *label9; - GtkWidget *label10; - GtkWidget *frame1; - GtkWidget *label12; - GtkWidget *label11; - GtkWidget *label3; - GtkWidget *hseparator2; - GtkWidget *hbuttonbox1; - GtkWidget *button1; - GtkWidget *hbox1; - GtkWidget *image1; - GtkWidget *label1; - GtkWidget *button2; - GtkWidget *hbox2; - GtkWidget *image2; - GtkWidget *label2; - - result = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_set_size_request(result, 600, 400); - gtk_container_set_border_width(GTK_CONTAINER(result), 8); - gtk_window_set_title(GTK_WINDOW(result), _("Plugins selection")); - gtk_window_set_transient_for(GTK_WINDOW(result), parent); - gtk_window_set_default_size(GTK_WINDOW(result), 600, 400); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - ref= G_OBJECT(result); - g_object_set_data(ref, "binary", binary); - - - - - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox1); - gtk_container_add(GTK_CONTAINER(result), vbox1); - gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8); - - hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox3); - gtk_box_pack_start(GTK_BOX(vbox1), hbox3, TRUE, TRUE, 0); - - scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow1); - gtk_box_pack_start(GTK_BOX(hbox3), scrolledwindow1, TRUE, TRUE, 0); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_SHADOW_IN); - - treeview1 = gtk_tree_view_new(); - gtk_widget_show(treeview1); - gtk_container_add(GTK_CONTAINER(scrolledwindow1), treeview1); - - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox2); - gtk_box_pack_start(GTK_BOX(hbox3), vbox2, FALSE, FALSE, 0); - - vbuttonbox1 = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); - gtk_widget_show(vbuttonbox1); - gtk_box_pack_start(GTK_BOX(vbox2), vbuttonbox1, FALSE, FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox1), 8); - gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox1), GTK_BUTTONBOX_END); - gtk_box_set_spacing(GTK_BOX(vbuttonbox1), 8); - - button7 = gtk_button_new(); - gtk_widget_show(button7); - gtk_container_add(GTK_CONTAINER(vbuttonbox1), button7); - - image3 = gtk_image_new_from_icon_name("gtk-add", GTK_ICON_SIZE_BUTTON); - gtk_widget_show(image3); - gtk_container_add(GTK_CONTAINER(button7), image3); - - button8 = gtk_button_new(); - gtk_widget_show(button8); - gtk_container_add(GTK_CONTAINER(vbuttonbox1), button8); - - image4 = gtk_image_new_from_icon_name("gtk-remove", GTK_ICON_SIZE_BUTTON); - gtk_widget_show(image4); - gtk_container_add(GTK_CONTAINER(button8), image4); - - hseparator1 = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); - gtk_widget_show(hseparator1); - gtk_box_pack_start(GTK_BOX(vbox2), hseparator1, FALSE, FALSE, 0); - - vbuttonbox2 = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); - gtk_widget_show(vbuttonbox2); - gtk_box_pack_start(GTK_BOX(vbox2), vbuttonbox2, FALSE, FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox2), 8); - gtk_box_set_spacing(GTK_BOX(vbuttonbox2), 8); - - button9 = gtk_button_new(); - gtk_widget_show(button9); - gtk_container_add(GTK_CONTAINER(vbuttonbox2), button9); - - image5 = gtk_image_new_from_icon_name("gtk-go-up", GTK_ICON_SIZE_BUTTON); - gtk_widget_show(image5); - gtk_container_add(GTK_CONTAINER(button9), image5); - - button10 = gtk_button_new(); - gtk_widget_show(button10); - gtk_container_add(GTK_CONTAINER(vbuttonbox2), button10); - - image6 = gtk_image_new_from_icon_name("gtk-go-down", GTK_ICON_SIZE_BUTTON); - gtk_widget_show(image6); - gtk_container_add(GTK_CONTAINER(button10), image6); - - scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow2); - gtk_box_pack_start(GTK_BOX(hbox3), scrolledwindow2, TRUE, TRUE, 0); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_SHADOW_IN); - - treeview2 = gtk_tree_view_new(); - gtk_widget_show(treeview2); - gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); - - expander1 = gtk_expander_new(NULL); - gtk_widget_show(expander1); - gtk_box_pack_start(GTK_BOX(vbox1), expander1, FALSE, FALSE, 0); - gtk_expander_set_expanded(GTK_EXPANDER(expander1), TRUE); - - hbox4 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox4); - gtk_container_add(GTK_CONTAINER(expander1), hbox4); - - vbox3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox3); - gtk_box_pack_start(GTK_BOX(hbox4), vbox3, TRUE, TRUE, 0); - - label = qck_create_label(NULL, NULL, _("Author:")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0); - - label8 = gtk_label_new(_("label8")); - gtk_widget_show(label8); - gtk_box_pack_start(GTK_BOX(vbox3), label8, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("Version:")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0); - - label9 = gtk_label_new(_("label9")); - gtk_widget_show(label9); - gtk_box_pack_start(GTK_BOX(vbox3), label9, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("URL:")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0); - - label10 = gtk_label_new(_("label10")); - gtk_widget_show(label10); - gtk_box_pack_start(GTK_BOX(vbox3), label10, FALSE, FALSE, 0); - - frame1 = gtk_frame_new(NULL); - gtk_widget_show(frame1); - gtk_box_pack_start(GTK_BOX(hbox4), frame1, TRUE, TRUE, 0); - gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_NONE); - - label12 = gtk_label_new(_("label12")); - qck_set_alignment(label12, GTK_ALIGN_CENTER, GTK_ALIGN_CENTER); - qck_set_margins(label12, 0, 0, 12, 0); - gtk_widget_show(label12); - gtk_container_add(GTK_CONTAINER(frame1), label12); - - label11 = gtk_label_new(_("Action")); - gtk_widget_show(label11); - gtk_frame_set_label_widget(GTK_FRAME(frame1), label11); - gtk_label_set_use_markup(GTK_LABEL(label11), TRUE); - - label3 = gtk_label_new(_("Details:")); - gtk_widget_show(label3); - gtk_expander_set_label_widget(GTK_EXPANDER(expander1), label3); - gtk_label_set_use_markup(GTK_LABEL(label3), TRUE); - - hseparator2 = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); - gtk_widget_show(hseparator2); - gtk_box_pack_start(GTK_BOX(vbox1), hseparator2, FALSE, FALSE, 0); - - hbuttonbox1 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - gtk_widget_show(hbuttonbox1); - gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox1, FALSE, FALSE, 0); - gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox1), GTK_BUTTONBOX_END); - gtk_box_set_spacing(GTK_BOX(hbuttonbox1), 8); - - button1 = gtk_button_new(); - gtk_widget_show(button1); - gtk_container_add(GTK_CONTAINER(hbuttonbox1), button1); - - hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - qck_set_alignment(hbox1, GTK_ALIGN_CENTER, GTK_ALIGN_CENTER); - gtk_widget_show(hbox1); - gtk_container_add(GTK_CONTAINER(button1), hbox1); - - image1 = gtk_image_new_from_icon_name("gtk-apply", GTK_ICON_SIZE_BUTTON); - gtk_widget_show(image1); - gtk_box_pack_start(GTK_BOX(hbox1), image1, FALSE, FALSE, 0); - - label1 = gtk_label_new_with_mnemonic(_("Apply")); - gtk_widget_show(label1); - gtk_box_pack_start(GTK_BOX(hbox1), label1, FALSE, FALSE, 0); - - button2 = gtk_button_new(); - gtk_widget_show(button2); - gtk_container_add(GTK_CONTAINER(hbuttonbox1), button2); - - hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - qck_set_alignment(hbox2, GTK_ALIGN_CENTER, GTK_ALIGN_CENTER); - gtk_widget_show(hbox2); - gtk_container_add(GTK_CONTAINER(button2), hbox2); - - image2 = gtk_image_new_from_icon_name("gtk-cancel", GTK_ICON_SIZE_BUTTON); - gtk_widget_show(image2); - gtk_box_pack_start(GTK_BOX(hbox2), image2, FALSE, FALSE, 0); - - label2 = gtk_label_new_with_mnemonic(_("Cancel")); - gtk_widget_show(label2); - gtk_box_pack_start(GTK_BOX(hbox2), label2, FALSE, FALSE, 0); - - - - - - - return result; - -} - - - - - - - - diff --git a/src/dialogs/plugins.h b/src/dialogs/plugins.h deleted file mode 100644 index e0a53a6..0000000 --- a/src/dialogs/plugins.h +++ /dev/null @@ -1,40 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * plugins.h - prototypes pour la boîte de dialogue permettant une sélection des greffons - * - * Copyright (C) 2010-2012 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_PLUGINS_H -#define _DIALOGS_PLUGINS_H - - -#include - - -#include "../analysis/binary.h" - - - -/* Construit la fenêtre de sélection des sections. */ -GtkWidget *create_plugins_selection_dialog(GLoadedBinary *, GtkWindow *); - - - -#endif /* _DIALOGS_PLUGINS_H */ diff --git a/src/dialogs/shellcode.c b/src/dialogs/shellcode.c deleted file mode 100644 index 36146d1..0000000 --- a/src/dialogs/shellcode.c +++ /dev/null @@ -1,803 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * export.c - assistant d'exportation de contenu binaire - * - * Copyright (C) 2011-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "shellcode.h" - - -#include - - -#include -#include -#include -#include - - -#include "../gtkext/easygtk.h" - - - - -#include "../analysis/roptions.h" // A garder ? - - - - - - -/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */ - - -/* Ferme l'assistant sans dérouler la procédure. */ -static void export_assistant_cancel(GtkAssistant *, gpointer); - -/* Ferme l'assistant et déroule la procédure. */ -static void export_assistant_close(GtkAssistant *, GObject *); - - - -/* -------------------------- RECUPERATION DU CODE BINAIRE -------------------------- */ - - -/* Ajoute le panneau de consitution du code binaire. */ -static void register_bincode_panel(GtkAssistant *); - -/* Fournit si possible le code binaire utilisateur. */ -static bool extract_shell_code(GObject *, bin_t **, off_t *); - -/* Réagit à une modification du code binaire. */ -static void on_bincode_changed(GtkTextBuffer *, GObject *); - - - -/* ----------------------- DEFINITION DE L'ARCHITECTURE VISEE ----------------------- */ - - -/* Ajoute le panneau de spécification de l'architecture. */ -static void register_archi_panel(GtkAssistant *); - - - - - -/* -------------------- DEFINITION DES REGLAGES DE L'EXPORTATION -------------------- */ - - -/* Ajoute le panneau de choix du type de sortie. */ -static void register_output_panel(GtkAssistant *); - -/* Réagit un changement du nom de fichier pour l'exportation. */ -static void on_export_filename_changed(GtkEntry *, GtkAssistant *); - -/* Sélectionne ou non un nouveau fichier de sortie. */ -static void on_filename_browsing_clicked(GtkButton *, GObject *); - - - -/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */ - - -/* Ajoute le panneau de sélection du contenu à exporter. */ -static void register_content_panel(GtkAssistant *); - - - -/* ---------------------------------------------------------------------------------- */ -/* PARTIE PRINCIPALE DE L'ASSISTANT */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : project = projet courant à compléter. * -* parent = fenêtre principale de l'éditeur. * -* * -* Description : Crée et affiche un assistant d'ajout de binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void run_shellcode_assistant(GStudyProject *project, GtkWindow *parent) -{ - GtkWidget *assistant; /* Fenêtre à afficher */ - GObject *ref; /* Espace de référencement */ - - assistant = gtk_assistant_new(); - gtk_widget_set_size_request(assistant, 450, 300); - gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER); - gtk_window_set_title(GTK_WINDOW(assistant), _("Shellcode assistant")); - - gtk_window_set_modal(GTK_WINDOW(assistant), TRUE); - gtk_window_set_transient_for(GTK_WINDOW(assistant), parent); - - ref = G_OBJECT(assistant); - //g_object_set_data(ref, "binary", binary); - - register_bincode_panel(GTK_ASSISTANT(assistant)); - register_archi_panel(GTK_ASSISTANT(assistant)); - //register_output_panel(GTK_ASSISTANT(assistant)); - //register_content_panel(GTK_ASSISTANT(assistant)); - - g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL); - g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref); - - gtk_widget_show_all(assistant); - -} - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* data = adresse non utilisée ici. * -* * -* Description : Ferme l'assistant sans dérouler la procédure. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void export_assistant_cancel(GtkAssistant *assistant, gpointer data) -{ - gtk_widget_destroy(GTK_WIDGET(assistant)); - -} - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* ref = adresse de l'espace de référencement global. * -* * -* Description : Ferme l'assistant et déroule la procédure. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void export_assistant_close(GtkAssistant *assistant, GObject *ref) -{ - GLoadedBinary *binary; /* Binaire chargé à parcourir */ - GExeFormat *format; /* Format du binaire */ - GRenderingOptions *options; /* Options d'exportation */ - GtkToggleButton *checkbutton; /* Coche à retrouver */ - gboolean state; /* Valeur à prendre en compte */ - GtkEntry *entry; /* Zone de saisie */ - const gchar *filename; /* Chemin d'accès du fichier */ - - //binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); - - format = g_loaded_binary_get_format(binary); - options = g_rendering_options_new(format); - - /* Eléments à afficher */ - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr")); - state = gtk_toggle_button_get_active(checkbutton); - g_rendering_options_show_address(options, MRD_BLOCK, state); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code")); - state = gtk_toggle_button_get_active(checkbutton); - g_rendering_options_show_code(options, MRD_BLOCK, state); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "assembly_code")); - state = gtk_toggle_button_get_active(checkbutton); - - /* Programmation de la tâche */ - /* - entry = GTK_ENTRY(g_object_get_data(ref, "filename")); - filename = gtk_entry_get_text(entry); - - export = g_delayed_export_new(filename, binary, options); - - queue = get_work_queue(); - g_work_queue_schedule_work(queue, G_DELAYED_WORK(export)); - */ - gtk_widget_destroy(GTK_WIDGET(assistant)); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* RECUPERATION DU CODE BINAIRE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de consitution du code binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_bincode_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal */ - GtkWidget *scrolledwindow; /* Support avec défilement */ - GtkWidget *textview; /* Zone de texte */ - GtkWidget *label; /* Etiquette du bilan */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Réception du code */ - - label = qck_create_label(NULL, NULL, _("Paste here the raw C code containing the shellcode.\r\n" - "All content between quotes will be extracted.")); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - scrolledwindow = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow); - gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); - - textview = qck_create_textview(G_OBJECT(assistant), "bincode", - G_CALLBACK(on_bincode_changed), assistant); - gtk_container_add(GTK_CONTAINER(scrolledwindow), textview); - - /* Validation */ - - label = qck_create_label(G_OBJECT(assistant), "status", _("No code")); - gtk_widget_set_halign(label, GTK_ALIGN_CENTER); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - /* Intégration */ - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Code")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_INTRO); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - -} - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* code = code binaire recomposé. [OUT] * -* length = taille de ce code. [OUT] * -* * -* Description : Fournit si possible le code binaire utilisateur. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool extract_shell_code(GObject *ref, bin_t **code, off_t *length) -{ - bool result; /* Bilan à retourner */ - GtkTextView *textview; /* Zone de texte */ - GtkTextBuffer *buffer; /* Tampon gérant le texte */ - GtkTextIter start; /* Début de la zone à traiter */ - GtkTextIter end; /* Fin de la zone à traiter */ - gchar *bincode; /* Code à filtrer */ - regex_t preg; /* Recherche d'un bloc */ - int ret; /* Bilan d'un appel */ - regoff_t pos; /* Point de départ de lecture */ - regmatch_t pmatch[3]; /* Localisation de trouvailles */ - regoff_t i; /* Boucle de parcours */ - char hex[3]; /* Valeur hexadécimale */ - - result = true; - - *code = NULL; - *length = 0; - - /* Détermination des cibles */ - - ret = regcomp(&preg, "[^'\"]*(['\"])([^'\"]*)\\1", REG_EXTENDED); - if (ret != 0) return false; - - /* Constitution du contexte */ - - textview = GTK_TEXT_VIEW(g_object_get_data(ref, "bincode")); - buffer = gtk_text_view_get_buffer(textview); - - gtk_text_buffer_get_bounds(buffer, &start, &end); - bincode = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); - - /* Recomposition du code */ - - pos = 0; - - ret = regexec(&preg, &bincode[pos], 3, pmatch, 0); - - while (ret != REG_NOMATCH && result) - { - bincode[pos + pmatch[2].rm_eo] = '\0'; - - for (i = pos + pmatch[2].rm_so; i < (pos + pmatch[2].rm_eo) && result; i++) - { - *code = (bin_t *)realloc(*code, ++(*length) * sizeof(bin_t)); - - switch (bincode[i]) - { - case '\\': - if (++i >= (pos + pmatch[2].rm_eo)) - { - result = false; - break; - } - - if (bincode[i] == 'x') - { - if (++i >= (pos + pmatch[2].rm_eo)) - { - result = false; - break; - } - - if ((i + 2) > (pos + pmatch[2].rm_eo)) - { - result = false; - break; - } - - memcpy(hex, &bincode[i], 2); - hex[2] = '\0'; - - (*code)[*length - 1] = strtol(hex, NULL, 16); - - i++; - - } - else (*code)[*length - 1] = bincode[i]; - - break; - - default: - (*code)[*length - 1] = bincode[i]; - break; - - } - - } - - if (result) - { - pos += pmatch[2].rm_eo + 1; - ret = regexec(&preg, &bincode[pos], 3, pmatch, 0); - } - - } - - g_free(bincode); - - if (!result && *code != NULL) - { - *length = 0; - free(*code); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : textbuffer = composant concerné par l'action. * -* ref = espace de référencement global. * -* * -* Description : Réagit à une modification du code binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_bincode_changed(GtkTextBuffer *textbuffer, GObject *ref) -{ - bin_t *code; /* Code binaire extrait */ - off_t length; /* Taille des données lues */ - bool status; /* Bilan de l'extraction */ - GtkLabel *label; /* Etiquette à mettre à jour */ - char *markup; /* Affichage étendu */ - GtkAssistant *assistant; /* Assistant en première ligne */ - gint index; /* Indice de la page courante */ - GtkWidget *page; /* Cotenu de la page courante */ - - status = extract_shell_code(ref, &code, &length); - - label = GTK_LABEL(g_object_get_data(ref, "status")); - - if (!status) - gtk_label_set_markup(label, _("Error while decoding")); - - else if (length > 0) - { - markup = g_markup_printf_escaped(_("Decoding OK (" - OFF_FMT " %s)"), - OFF_CAST(length), length > 1 ? _("bytes") : _("byte")); - gtk_label_set_markup(label, markup); - g_free(markup); - } - - else - { - gtk_label_set_markup(label, _("No code")); - status = false; - } - - if (length > 0) - free(code); - - /* Poursuite des opérations ? */ - - assistant = GTK_ASSISTANT(ref); - - index = gtk_assistant_get_current_page(assistant); - page = gtk_assistant_get_nth_page(assistant, index); - - gtk_assistant_set_page_complete(assistant, page, status); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* DEFINITION DE L'ARCHITECTURE VISEE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de spécification de l'architecture. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_archi_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *combobox; /* Sélection du format */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Choix de l'architecture */ - - label = qck_create_label(NULL, NULL, _("Architecture:")); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - combobox = qck_create_combobox(G_OBJECT(assistant), "archi", G_CALLBACK(NULL), NULL); - gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, FALSE, 0); - - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("x86")); - - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); - - /* Taille de registre */ - - label = qck_create_label(NULL, NULL, _("Register size:")); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - combobox = qck_create_combobox(G_OBJECT(assistant), "rsize", G_CALLBACK(NULL), NULL); - gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, FALSE, 0); - - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("32 bits")); - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("16 bits")); - - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); - - /* Intégration */ - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Architecture")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONFIRM); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - -} - - - - - - - - - - -/* ---------------------------------------------------------------------------------- */ -/* DEFINITION DES REGLAGES DE L'EXPORTATION */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de choix du type de sortie. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_output_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal #1 */ - GtkWidget *hbox; /* Support principal #2 */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *combobox; /* Sélection du format */ - GtkWidget *entry; /* Zone de saisie de texte */ - GtkWidget *button; /* Sélection de fichier */ - GLoadedBinary *binary; /* Binaire chargé à parcourir */ - const char *filename; /* Chemin d'accès par défaut */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Format de sortie */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("Format : ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - combobox = qck_create_combobox(NULL, NULL, G_CALLBACK(NULL), NULL); - gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0); - - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("Simple text")); - - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); - - /* Fichier de sortie */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = qck_create_label(NULL, NULL, _("File : ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - - button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - - /* Intégration */ - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Output")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONTENT); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - - /* Choix par défaut */ - /* - binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); - filename = g_loaded_binary_get_name(binary); - - gtk_entry_set_text(GTK_ENTRY(entry), filename); - gtk_entry_append_text(GTK_ENTRY(entry), ".txt"); - - g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); - */ -} - - -/****************************************************************************** -* * -* Paramètres : entry = zone de texte dont le contenu vient de changer. * -* assistant = fenêtre affichée et référencement global. * -* * -* Description : Réagit un changement du nom de fichier pour l'exportation. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant) -{ - const gchar *text; /* Texte saisi dans la zone */ - gint num; /* Etape courante */ - GtkWidget *page; /* Support de cette étape */ - - text = gtk_entry_get_text(entry); - - num = gtk_assistant_get_current_page(assistant); - page = gtk_assistant_get_nth_page(assistant, num); - - gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); - -} - - -/****************************************************************************** -* * -* Paramètres : button = bouton d'édition de la sélection. * -* ref = espace de référencement principal. * -* * -* Description : Sélectionne ou non un nouveau fichier de sortie. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_filename_browsing_clicked(GtkButton *button, GObject *ref) -{ - GtkWidget *dialog; /* Boîte à afficher */ - gchar *filename; /* Nom du fichier à intégrer */ - GtkEntry *entry; /* Zone de saisie à maj. */ - - dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref), - GTK_FILE_CHOOSER_ACTION_SAVE, - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Save"), GTK_RESPONSE_ACCEPT, - NULL); - - entry = GTK_ENTRY(g_object_get_data(ref, "filename")); - gtk_file_chooser_set_filename(dialog, gtk_entry_get_text(entry)); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - { - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - - gtk_entry_set_text(GTK_ENTRY(entry), filename); - - g_free(filename); - - } - - gtk_widget_destroy(dialog); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* SELECTION DU CONTENU A TRAITER */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : assistant = fenêtre à compléter et référencement global. * -* * -* Description : Ajoute le panneau de sélection du contenu à exporter. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void register_content_panel(GtkAssistant *assistant) -{ - GtkWidget *vbox; /* Support principal */ - GtkWidget *frame; /* Support avec encadrement */ - GtkWidget *subvbox; /* Support secondaire */ - GtkWidget *checkbutton; /* Coche pour une option */ - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - qck_set_margins(vbox, 8, 8, 8, 8); - gtk_widget_show(vbox); - - /* Lignes à traiter */ - - subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(subvbox); - - frame = qck_create_frame(_("Lines to process"), subvbox, 0, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "prologue", _("Prologue"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "code", _("Code"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "comments", _("Comments"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - /* Eléments à afficher */ - - subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(subvbox); - - frame = qck_create_frame(_("Items to display"), subvbox, 0, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - checkbutton = qck_create_check_button(G_OBJECT(assistant), "assembly_code", _("Assembly code"), NULL, NULL); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); - - /* Intégration */ - - gtk_assistant_append_page(assistant, vbox); - gtk_assistant_set_page_title(assistant, vbox, _("Exported content")); - gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONFIRM); - - gtk_assistant_set_page_complete(assistant, vbox, TRUE); - -} - - - - - - - - - /* Choix par défaut */ - /* - binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); - filename = g_loaded_binary_get_name(binary); - - gtk_entry_set_text(GTK_ENTRY(entry), filename); - gtk_entry_append_text(GTK_ENTRY(entry), ".txt"); - - g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); - */ - - - diff --git a/src/dialogs/shellcode.h b/src/dialogs/shellcode.h deleted file mode 100644 index d3bb422..0000000 --- a/src/dialogs/shellcode.h +++ /dev/null @@ -1,37 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * export.h - prototypes pour l'assistant d'exportation de contenu binaire - * - * Copyright (C) 2011-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_EXPORT_H -#define _DIALOGS_EXPORT_H - - -#include "../analysis/project.h" - - - -/* Crée et affiche un assistant d'ajout de binaire. */ -void run_shellcode_assistant(GStudyProject *, GtkWindow *); - - - -#endif /* _DIALOGS_EXPORT_H */ diff --git a/src/dialogs/storage.c b/src/dialogs/storage.c deleted file mode 100644 index 2bf1e2e..0000000 --- a/src/dialogs/storage.c +++ /dev/null @@ -1,648 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * storage.c - définition des modes d'enregistrement pour binaires - * - * Copyright (C) 2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#include "storage.h" - - -#include - - -#include "../analysis/db/protocol.h" -#include "../common/cpp.h" -#include "../gtkext/easygtk.h" - - - -/* --------------------------- CORPS PRINCIPAL DU CONTENU --------------------------- */ - - -/* Enumération des colonnes de la liste affichée */ -typedef enum StorageColumnTypes -{ - SCT_FEATURE_ID, /* Désignation interne */ - SCT_FEATURE_NAME, /* Désignation humaine */ - SCT_FEATURE_STORAGE, /* Type d'enregistrement */ - SCT_COMBO_COLUMN, /* Fonctionnement du combo */ - - SCT_COUNT - -} StorageColumnTypes; - - -/* Construit l'affichage en liste des enregistrements. */ -static GtkWidget *build_features_list(void); - -/* Sauvegarde l'état des enregistrements et clôt la fenêtre. */ -static void save_storage_params(GtkButton *, GObject *); - - - -/* ---------------------- NOM D'UTILISATEUR ASSOCIE AU BINAIRE ---------------------- */ - - -/* Charge le nom de l'utilisateur associé au binaire. */ -static void load_storage_username(GLoadedBinary *, GObject *); - -/* Sauvegarde le nom de l'utilisateur associé au binaire. */ -static void save_storage_username(GLoadedBinary *, GObject *); - - - -/* ----------------------- SERVEUR DISTANT ASSOCIE AU BINAIRE ----------------------- */ - - -/* Charge la définition du serveur distant associé au binaire. */ -static void load_storage_remote_server(GLoadedBinary *, GObject *); - -/* Sauvegarde la définition du serveur distant du binaire. */ -static void save_storage_remote_server(GLoadedBinary *, GObject *); - -/* Met à jour l'accès aux paramètres du serveur distant. */ -static void on_server_usage_toggle(GtkToggleButton *, GObject *); - - - -/* ------------------------- TRAITEMENT DES FONCTIONNALITES ------------------------- */ - - -/* Remplit la vue présentant les fonctionnalités à traiter. */ -static void fill_storage_features(GtkTreeView *, GLoadedBinary *); - -/* Sauvegarde les statuts d'enregistrement des fonctionnalités. */ -static void save_storage_features(GLoadedBinary *, GObject *); - -/* Met à jour un type d'enregistrement. */ -static void storage_combo_edited_cb(GtkCellRendererText *, const gchar *, const gchar *, GtkListStore *); - - - -/* ---------------------------------------------------------------------------------- */ -/* CORPS PRINCIPAL DU CONTENU */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Construit l'affichage en liste des enregistrements. * -* * -* Retour : Composant graphique prêt à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GtkWidget *build_features_list(void) -{ - GtkListStore *store; - GtkWidget *view; - GtkCellRenderer *renderer; - GtkListStore *combo_store; - GtkTreeIter iter; - - store = gtk_list_store_new(SCT_COUNT, - G_TYPE_UINT, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_UINT); - - view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); - - g_object_unref(store); - - /* Intitulé des fonctionnalités */ - - renderer = gtk_cell_renderer_text_new(); - - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, - _("Features"), renderer, - "text", SCT_FEATURE_NAME, - NULL); - - /* Type d'enregistrement associé */ - - renderer = gtk_cell_renderer_combo_new(); - - combo_store = gtk_list_store_new(1, G_TYPE_STRING); - gtk_list_store_append(combo_store, &iter); - gtk_list_store_set(combo_store, &iter, 0, _("Local storage"), -1); - gtk_list_store_append(combo_store, &iter); - gtk_list_store_set(combo_store, &iter, 0, _("Remote storage"), -1); - gtk_list_store_append(combo_store, &iter); - gtk_list_store_set(combo_store, &iter, 0, _("Local storage with remote access"), -1); - - g_object_set(G_OBJECT(renderer), "model", combo_store, - "editable", TRUE, "has-entry", FALSE, NULL); - g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(storage_combo_edited_cb), store); - - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, - _("Storage"), renderer, - "text", SCT_FEATURE_STORAGE, - "text-column", SCT_COMBO_COLUMN, - NULL); - - return view; - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* parent = fenêtre principale de l'éditeur. * -* * -* Description : Propose une définition des propriétés d'enregistrement. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkWidget *content; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire #1 */ - GtkWidget *frame; /* Support avec encadrement */ - GtkWidget *hbox; /* Support à construire #2 */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *entry; /* Zone de saisie de texte */ - GtkWidget *checkbutton; /* Activation de la distance */ - GtkWidget *subvbox; /* Support à construire #3 */ - GtkWidget *scrolledwindow; /* Zone de défilement */ - GtkWidget *treeview; /* Liste des fonctionnalités */ - - result = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(result), _("Storage")); - gtk_widget_set_size_request(result, 400, 360); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - gtk_window_set_modal(GTK_WINDOW(result), TRUE); - gtk_window_set_transient_for(GTK_WINDOW(result), parent); - - g_object_ref(G_OBJECT(binary)); - g_object_set_data_full(G_OBJECT(result), "binary", binary, g_object_unref); - - content = gtk_dialog_get_content_area(GTK_DIALOG(result)); - gtk_widget_show(content); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox); - gtk_box_pack_start(GTK_BOX(content), vbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); - - /* Définition de l'identité de l'utilisateur */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); - gtk_widget_show(hbox); - - frame = qck_create_frame(_("Identity"), hbox, 0, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); - - label = qck_create_label(NULL, NULL, _("Username: ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(result), "username", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - - /* Définition du serveur distant */ - - subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show(subvbox); - - frame = qck_create_frame(_("Server to contact"), subvbox, 0, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); - - checkbutton = qck_create_check_button(G_OBJECT(result), "use_remote", - _("Use a remote server:"), - G_CALLBACK(on_server_usage_toggle), result); - gtk_widget_show(checkbutton); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(subvbox), hbox, TRUE, TRUE, 0); - - label = qck_create_label(G_OBJECT(result), "host", _("Host: ")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(result), "remote_host", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); - - label = qck_create_label(G_OBJECT(result), "port", _("Port:")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(result), "remote_port", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); - - /* Affichage des propriétés */ - - scrolledwindow = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow); - gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); - - treeview = build_features_list(); - g_object_set_data(G_OBJECT(result), "treeview", treeview); - gtk_widget_show(treeview); - gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); - - /* Zone de contrôle */ - - gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); - - /* Chargement des données actuelles */ - - load_storage_username(binary, G_OBJECT(result)); - - load_storage_remote_server(binary, G_OBJECT(result)); - - fill_storage_features(GTK_TREE_VIEW(treeview), binary); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : button = bouton 'OK'. * -* ref = espace de référencement principal. * -* * -* Description : Sauvegarde l'état des enregistrements et clôt la fenêtre. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void save_storage_params(GtkButton *button, GObject *ref) -{ - GLoadedBinary *binary; /* Binaire en cours d'édition */ - - binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); - - save_storage_username(binary, ref); - - save_storage_remote_server(binary, ref); - - save_storage_features(binary, ref); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* NOM D'UTILISATEUR ASSOCIE AU BINAIRE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Charge le nom de l'utilisateur associé au binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void load_storage_username(GLoadedBinary *binary, GObject *ref) -{ - GtkEntry *entry; /* Zone de saisie de texte */ - - entry = GTK_ENTRY(g_object_get_data(ref, "username")); - - gtk_entry_set_text(entry, g_loaded_binary_get_username(binary)); - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Sauvegarde le nom de l'utilisateur associé au binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void save_storage_username(GLoadedBinary *binary, GObject *ref) -{ - GtkEntry *entry; /* Zone de saisie de texte */ - const gchar *text; /* Texte à récupérer */ - - entry = GTK_ENTRY(g_object_get_data(ref, "username")); - text = gtk_entry_get_text(entry); - - g_loaded_binary_set_username(binary, text); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* SERVEUR DISTANT ASSOCIE AU BINAIRE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Charge la définition du serveur distant associé au binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void load_storage_remote_server(GLoadedBinary *binary, GObject *ref) -{ - const char *host; /* Hôte à contacter */ - unsigned short port; /* Port de connexion */ - char port_str[sizeof(XSTR(USHRT_MAX)) + 1]; /* Version chaînée */ - bool use_remote; /* Utilisation du serveur ? */ - GtkEntry *entry; /* Zone de saisie de texte */ - GtkToggleButton *checkbutton; /* Activation de la distance */ - - use_remote = g_loaded_binary_get_remote_server(binary, &host, &port); - sprintf(port_str, "%hu", port); - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_host")); - - gtk_entry_set_text(entry, host); - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_port")); - - gtk_entry_set_text(entry, port_str); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "use_remote")); - - gtk_toggle_button_set_active(checkbutton, !use_remote); - gtk_toggle_button_set_active(checkbutton, use_remote); - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Sauvegarde la définition du serveur distant du binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void save_storage_remote_server(GLoadedBinary *binary, GObject *ref) -{ - GtkEntry *entry; /* Zone de saisie de texte */ - const gchar *text; /* Texte à récupérer */ - unsigned short port; /* Port de connexion */ - GtkToggleButton *checkbutton; /* Activation de la distance */ - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_port")); - text = gtk_entry_get_text(entry); - port = atoi(text); - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_host")); - text = gtk_entry_get_text(entry); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "use_remote")); - - g_loaded_binary_set_remote_server(binary, text, port, - gtk_toggle_button_get_active(checkbutton)); - -} - - -/****************************************************************************** -* * -* Paramètres : button = oche dont le status vient de changer. * -* ref = espace de référencement global. * -* * -* Description : Met à jour l'accès aux paramètres du serveur distant. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_server_usage_toggle(GtkToggleButton *button, GObject *ref) -{ - gboolean state; /* Etat du bouton courant */ - GtkWidget *widget; /* Element dont l'accès change */ - - state = gtk_toggle_button_get_active(button); - - widget = GTK_WIDGET(g_object_get_data(ref, "host")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - - widget = GTK_WIDGET(g_object_get_data(ref, "remote_host")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - - widget = GTK_WIDGET(g_object_get_data(ref, "port")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - - widget = GTK_WIDGET(g_object_get_data(ref, "remote_port")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* TRAITEMENT DES FONCTIONNALITES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : treeview = vue à compléter. * -* binary = binaire à manipuler. * -* * -* Description : Remplit la vue présentant les fonctionnalités à traiter. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void fill_storage_features(GtkTreeView *treeview, GLoadedBinary *binary) -{ - GtkListStore *store; /* Gestionnaire de liste */ - DBFeatures i; /* Boucle de parcours */ - DBStorage storage; /* Type d'enregistrement */ - char *human_feature; /* Description humaine #1 */ - char *human_value; /* Description humaine #2 */ - GtkTreeIter iter; /* Point d'insertion */ - - store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); - - for (i = 0; i < DBF_COUNT; i++) - { - storage = g_loaded_binary_get_storage(binary, i); - - switch (i) - { - case DBF_COMMENTS: - human_feature = _("Comments"); - break; - case DBF_DISPLAY_SWITCHERS: - human_feature = _("Segments display"); - break; - case DBF_BOOKMARKS: - human_feature = _("Bookmarks"); - break; - default: /* Pour GCC... */ - break; - } - - switch (storage) - { - case DBS_ALL_LOCAL: - human_value = _("Local storage"); - break; - case DBS_ALL_REMOTE: - human_value = _("Remote storage"); - break; - case DBS_LOCAL_AND_REMOTE: - human_value = _("Local storage with remote access"); - break; - } - - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - SCT_FEATURE_ID, i, - SCT_FEATURE_NAME, human_feature, - SCT_FEATURE_STORAGE, human_value, - -1); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Sauvegarde les statuts d'enregistrement des fonctionnalités. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void save_storage_features(GLoadedBinary *binary, GObject *ref) -{ - GtkTreeView *treeview; /* Liste des fonctionnalités */ - GtkTreeModel *store; /* Gestionnaire de liste */ - GtkTreeIter iter; /* Point de lecture */ - gboolean valid; /* Point courant valide ? */ - DBFeatures feature; /* Fonctionnalité traitée */ - char *human_value; /* Description humaine */ - DBStorage storage; /* Type d'enregistrement */ - - treeview = GTK_TREE_VIEW(g_object_get_data(ref, "treeview")); - store = GTK_TREE_MODEL(gtk_tree_view_get_model(treeview)); - - for (valid = gtk_tree_model_get_iter_first(store, &iter); - valid; - valid = gtk_tree_model_iter_next(store, &iter)) - { - gtk_tree_model_get(store, &iter, - SCT_FEATURE_ID, &feature, - SCT_FEATURE_STORAGE, &human_value, - -1); - - if (g_strcmp0(human_value, _("Remote storage")) == 0) - storage = DBS_ALL_REMOTE; - else if (g_strcmp0(human_value, _("Local storage with remote access")) == 0) - storage = DBS_LOCAL_AND_REMOTE; - else - storage = DBS_ALL_LOCAL; - - g_loaded_binary_set_storage(binary, feature, storage); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : cell = cellule du tableau à mettre à jour. * -* path = chemin d'accès à l'élément concerné. * -* value = nouvelle valeur à prendre en compte. * -* store = gestionnaire de liste sur lequel s'appuyer. * -* * -* Description : Met à jour un type d'enregistrement. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void storage_combo_edited_cb(GtkCellRendererText *cell, const gchar *path, const gchar *value, GtkListStore *store) -{ - GtkTreePath *tpath; /* Chemin instancié */ - GtkTreeIter iter; /* Point d'accès pour la maj */ - - tpath = gtk_tree_path_new_from_string(path); - - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, tpath)) - gtk_list_store_set(store, &iter, SCT_FEATURE_STORAGE, value, -1); - - gtk_tree_path_free(tpath); - -} diff --git a/src/dialogs/storage.h b/src/dialogs/storage.h deleted file mode 100644 index b5b451d..0000000 --- a/src/dialogs/storage.h +++ /dev/null @@ -1,40 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * storage.h - prototypes pour la définition des modes d'enregistrement pour binaires - * - * Copyright (C) 2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _DIALOGS_STORAGE_H -#define _DIALOGS_STORAGE_H - - -#include - - -#include "../analysis/binary.h" - - - -/* Propose une définition des propriétés d'enregistrement. */ -GtkWidget *create_storage_dialog(GLoadedBinary *, GtkWindow *); - - - -#endif /* _DIALOGS_STORAGE_H */ diff --git a/src/editor.c b/src/editor.c deleted file mode 100644 index 63b467b..0000000 --- a/src/editor.c +++ /dev/null @@ -1,446 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * editor.c - fenêtre principale de l'interface graphique - * - * Copyright (C) 2008-2013 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 - */ - - -#include "editor.h" - - -#include - - -#include "analysis/project.h" -#include "core/params.h" -#include "gtkext/easygtk.h" -#include "gtkext/gtkdockstation.h" -#include "gtkext/support.h" -#include "gui/status.h" -#include "gui/menus/menubar.h" -#include "gui/panels/panel.h" -#include "gui/tb/portions.h" -#include "gui/tb/source.h" - - - - - -/* Met en place la liste des icônes de l'éditeur. */ -static GList *build_editor_icons_list(void); - - -/* Construit la fenêtre de l'éditeur. */ -GtkWidget *create_editor(void); - -/* Quitte le programme en sortie de la boucle de GTK. */ -static gboolean on_delete_editor(GtkWidget *, GdkEvent *, gpointer); - -/* Quitte le programme en sortie de la boucle de GTK. */ -static void on_destroy_editor(GtkWidget *, gpointer); - - - - - - -/* Réagit au changement d'onglet d'un panneau quelconque. */ -static void on_dock_item_switch(GtkDockStation *, GtkWidget *, GObject *); - - - - - - -/* ------------------------ INTEGRATION DE LA BARRE D'OUTILS ------------------------ */ - - -/* Construit la barre d'outils de l'éditeur. */ -static GtkWidget *build_editor_toolbar(GObject *); - - - - - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Met en place la liste des icônes de l'éditeur. * -* * -* Retour : Liste d'images dimensionnées. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GList *build_editor_icons_list(void) -{ - GList *result; /* Liste à retourner */ - GdkPixbuf *pixbuf; /* Image chargée en mémoire */ - - result = NULL; - - pixbuf = get_pixbuf_from_file("chrysalide-32.png"); - if (pixbuf != NULL) - result = g_list_append(result, pixbuf); - - pixbuf = get_pixbuf_from_file("chrysalide-64.png"); - if (pixbuf != NULL) - result = g_list_append(result, pixbuf); - - pixbuf = get_pixbuf_from_file("chrysalide-128.png"); - if (pixbuf != NULL) - result = g_list_append(result, pixbuf); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Construit la fenêtre de l'éditeur. * -* * -* Retour : Adresse de la fenêtre mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *create_editor(void) -{ - GtkWidget *result; /* Fenêtre à renvoyer */ - bool hide; /* Cachette de la barre ? */ - bool maximized; /* Affichage en plein écran ? */ - GList *icons; /* Liste d'images dimensionnées*/ - GObject *ref; /* Version de référence */ - GEditorItem *editem; /* Menus réactifs principaux */ - GtkWidget *menuboard; /* Barre de menus principale */ - - GtkWidget *toolbar; /* Barre d'outils */ - - GtkWidget *vbox1; - - - GtkAccelGroup *accgroup; - - - GtkWidget *widget; /* Composant à intégrer */ - - - - - result = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_set_size_request(result, 1024, 800); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_container_set_border_width(GTK_CONTAINER(result), 4); - gtk_window_set_title(GTK_WINDOW(result), _("Chrysalide")); - - g_generic_config_get_value(get_main_configuration(), MPK_TITLE_BAR, &hide); - gtk_window_set_hide_titlebar_when_maximized(GTK_WINDOW(result), hide); - - g_generic_config_get_value(get_main_configuration(), MPK_MAXIMIZED, &maximized); - gtk_window_maximize(GTK_WINDOW(result)); - - icons = build_editor_icons_list(); - gtk_window_set_icon_list(GTK_WINDOW(result), icons); - g_list_free_full(icons, (GDestroyNotify)g_object_unref); - - g_signal_connect(G_OBJECT(result), "delete-event", G_CALLBACK(on_delete_editor), NULL); - g_signal_connect(G_OBJECT(result), "destroy", G_CALLBACK(on_destroy_editor), NULL); - - ref = G_OBJECT(result); - - accgroup = gtk_accel_group_new(); - gtk_window_add_accel_group(GTK_WINDOW(result), accgroup); - - - - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox1); - gtk_container_add(GTK_CONTAINER(result), vbox1); - - - /* Intégration des menus */ - - editem = g_menu_bar_new(ref, accgroup); - register_editor_item(editem); - - menuboard = g_editor_item_get_widget(editem); - gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0); - - - - - - - - /* Barre d'outils */ - - toolbar = build_editor_toolbar(G_OBJECT(result)); - gtk_box_pack_start(GTK_BOX(vbox1), toolbar, FALSE, FALSE, 0); - - do - { - GtkWidget *support; - - support = init_panels2(G_CALLBACK(on_dock_item_switch), ref); - gtk_box_pack_start(GTK_BOX(vbox1), support, TRUE, TRUE, 0); - - load_main_panels(ref); - - - } while(0); - - - - - /* Barre de statut générale */ - - editem = g_status_info_new(ref); - register_editor_item(editem); - - widget = g_editor_item_get_widget(editem); - gtk_box_pack_start(GTK_BOX(vbox1), widget, FALSE, FALSE, 0); - - - - - - - - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : widget = fenêtre de l'éditeur de préférences. * -* event = informations liées à l'événement. * -* data = adresse non utilisée ici. * -* * -* Description : Quitte le programme en sortie de la boucle de GTK. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - gboolean result; /* Continuation à retourner */ - GStudyProject *project; /* Projet courant */ - GtkWidget *dialog; /* Boîte à afficher */ - - result = FALSE; - - project = get_current_project(); - if (project == NULL) goto ode_no_project; - - if (g_study_project_get_filename(project) == NULL) - { - dialog = gtk_message_dialog_new(GTK_WINDOW(widget), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - _("The current project will be lost. Do you you want to save it ?")); - - gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Yes"), GTK_RESPONSE_YES); - gtk_dialog_add_button(GTK_DIALOG(dialog), _("_No"), GTK_RESPONSE_NO); - gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Cancel"), GTK_RESPONSE_CANCEL); - - switch (gtk_dialog_run(GTK_DIALOG(dialog))) - { - case GTK_RESPONSE_YES: - //mcb_file_save_project_as(NULL, widget); /* FIXME */ - break; - - case GTK_RESPONSE_NO: - break; - - case GTK_RESPONSE_CANCEL: - result = TRUE; - break; - - } - - gtk_widget_destroy(dialog); - - } - - ode_no_project: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : widget = fenêtre de l'éditeur de préférences. * -* event = informations liées à l'événement. * -* data = adresse non utilisée ici. * -* * -* Description : Quitte le programme en sortie de la boucle de GTK. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_destroy_editor(GtkWidget *widget, gpointer data) -{ - GStudyProject *project; /* Projet courant */ - - project = get_current_project(); - if (project != NULL) g_object_unref(G_OBJECT(project)); - - /* Fermeture propre */ - - /* ... */ - - gtk_main_quit(); - -} - - - - - - - - - - - - - - - - - - - - - - - - - -/****************************************************************************** -* * -* Paramètres : station = panneau de support des éléments concerné. * -* item = nouvel élément présenté à l'affichage. * -* ref = adresse de l'espace de référencement global. * -* * -* Description : Réagit au changement d'onglet d'un panneau quelconque. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, GObject *ref) -{ - GLoadedBinary *old_binary; /* Ancien binaire édité */ - GLoadedBinary *binary; /* Binaire en cours d'édition */ - - if (GTK_IS_SCROLLED_WINDOW(widget)) - widget = gtk_bin_get_child(GTK_BIN(widget)); - - if (GTK_IS_VIEWPORT(widget)) - widget = gtk_bin_get_child(GTK_BIN(widget)); - - if (GTK_IS_VIEW_PANEL(widget)) - { - /* Changement de binaire ? */ - - old_binary = G_LOADED_BINARY(g_object_get_data(ref, "current_binary")); - binary = gtk_view_panel_get_binary(GTK_VIEW_PANEL(widget)); - - if (old_binary != binary) - { - //notify_panels_of_binary_change(binary); - change_editor_items_current_binary(ref, binary); - } - - change_editor_items_current_view(ref, GTK_VIEW_PANEL(widget)); - - //notify_panels_of_view_change(GTK_VIEW_PANEL(widget), false); - - } - -} - - - - - - - - - - -/* ---------------------------------------------------------------------------------- */ -/* INTEGRATION DE LA BARRE D'OUTILS */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* * -* Description : Construit la barre d'outils de l'éditeur. * -* * -* Retour : Adresse du composant mis en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GtkWidget *build_editor_toolbar(GObject *ref) -{ - GtkWidget *result; /* Support à retourner */ - GEditorItem *item; /* Elément de barre d'outils */ - - result = gtk_toolbar_new(); - gtk_widget_show(result); - g_object_set_data(ref, "toolbar", result); - - - item = create_source_tb_item(ref); - register_editor_item(item); - - item = create_portions_tb_item(ref); - register_editor_item(item); - - - return result; - -} diff --git a/src/editor.h b/src/editor.h deleted file mode 100644 index c9feb67..0000000 --- a/src/editor.h +++ /dev/null @@ -1,38 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * editor.h - prototypes pour la fenêtre principale de l'interface graphique - * - * Copyright (C) 2009-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 _EDITOR_H -#define _EDITOR_H - - -#include - - - -/* Construit la fenêtre de l'éditeur. */ -GtkWidget *create_editor(void); - - - -#endif /* _EDITOR_H */ diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 196bb87..8c6311b 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -4,9 +4,11 @@ noinst_LTLIBRARIES = libgui.la libgui_la_SOURCES = \ editem-int.h \ editem.h editem.c \ + editor.h editor.c \ status.h status.c libgui_la_LIBADD = \ + dialogs/libdialogs.la \ menus/libguimenus.la \ panels/libguipanels.la \ tb/libguitb.la @@ -18,4 +20,4 @@ AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -SUBDIRS = menus panels tb +SUBDIRS = dialogs menus panels tb diff --git a/src/gui/dialogs/Makefile.am b/src/gui/dialogs/Makefile.am new file mode 100644 index 0000000..1fe821a --- /dev/null +++ b/src/gui/dialogs/Makefile.am @@ -0,0 +1,21 @@ + +noinst_LTLIBRARIES = libdialogs.la + +libdialogs_la_SOURCES = \ + about.h about.c \ + bookmark.h bookmark.c \ + export.h export.c \ + goto.h goto.c \ + gotox.h gotox.c \ + plugins.h plugins.c \ + shellcode.h shellcode.c \ + storage.h storage.c + +libdialogs_la_LDFLAGS = + + +AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) + +SUBDIRS = diff --git a/src/gui/dialogs/about.c b/src/gui/dialogs/about.c new file mode 100644 index 0000000..0605b39 --- /dev/null +++ b/src/gui/dialogs/about.c @@ -0,0 +1,166 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * about.h - boîte de dialogue d'information sur le programme + * + * Copyright (C) 2010-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "about.h" + + +#include +#include +#include + + +#include +#include + + +#include "../../gtkext/easygtk.h" +#include "../../gtkext/support.h" + + + +/* Réagit à l'appui d'une touche sur la fenêtre 'A propos'. */ +static gboolean close_about_window_on_escape(GtkWidget *, GdkEventKey *, gpointer); + + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* * +* Description : Construit la fenêtre d'informations sur le logiciel. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_about_dialog(GtkWindow *parent) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GdkRGBA color; /* Couleur de fond noire */ + GtkWidget *fixed; /* Support global */ + gchar *filename; /* Chemin d'accès au fichier */ + GtkWidget *image; /* Image chargée */ + unsigned int revision; /* Numéro de révision */ + unsigned int max; /* Nbre. de boucles à effectuer*/ + unsigned int i; /* Boucle de parcours */ + unsigned int level; /* Unité la plus importante */ + char buffer[16]; /* Nom d'image à forger */ + GtkWidget *label; /* Etiquette inférieure */ + + result = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request(result, 350, 430); + gtk_container_set_border_width(GTK_CONTAINER(result), 0); + gtk_window_set_title(GTK_WINDOW(result), _("About")); + gtk_window_set_transient_for(GTK_WINDOW(result), parent); + gtk_window_set_default_size(GTK_WINDOW(result), 350, 430); + gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); + + g_signal_connect(result, "key_press_event", G_CALLBACK(close_about_window_on_escape), NULL); + + gdk_rgba_parse(&color, "black"); + gtk_widget_override_background_color(GTK_WIDGET(result), GTK_STATE_FLAG_NORMAL, &color); + + fixed = gtk_fixed_new(); + gtk_widget_show(fixed); + gtk_container_add(GTK_CONTAINER(result), fixed); + + /* Images principales */ + + filename = find_pixmap_file("chrysalide-full.png"); + image = qck_create_image(NULL, NULL, filename); + gtk_fixed_put(GTK_FIXED(fixed), image, 10, 10); + gtk_widget_set_size_request(image, 330, 300); + + filename = find_pixmap_file("chrysalide_text.png"); + image = qck_create_image(NULL, NULL, filename); + gtk_fixed_put(GTK_FIXED(fixed), image, 48, 324); + gtk_widget_set_size_request(image, 253, 42); + + /* Numéro de révision */ + + filename = find_pixmap_file("revision.png"); + image = qck_create_image(NULL, NULL, filename); + gtk_fixed_put(GTK_FIXED(fixed), image, 149, 360); + gtk_widget_set_size_request(image, 14, 18); + + revision = REVISION; + max = log(revision) / log(10); + + for (i = 0; i <= max; i++) + { + level = pow(10, max - i); + + snprintf(buffer, 16, "revision_%u.png", revision / level); + + filename = find_pixmap_file(buffer); + image = qck_create_image(NULL, NULL, filename); + gtk_fixed_put(GTK_FIXED(fixed), image, 163 + i * 14, 360); + gtk_widget_set_size_request(image, 14, 18); + + revision %= level; + + } + + /* Copyright */ + + label = qck_create_label(NULL, NULL, "Copyright (C) 2010-2014 Cyrille Bagard"); + gtk_widget_set_halign(label, GTK_ALIGN_CENTER); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_fixed_put(GTK_FIXED(fixed), label, 0, 400); + gtk_widget_set_size_request(label, 350, 20); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : window = fenêtre visée par la procédure. * +* event = informations liées à l'événement. * +* dummy = donnée non utilisée ici. * +* * +* Description : Réagit à l'appui d'une touche sur la fenêtre 'A propos'. * +* * +* Retour : TRUE pour poursuivre la propagation, FALSE autrement. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean close_about_window_on_escape(GtkWidget *widget, GdkEventKey *event, gpointer dummy) +{ + gboolean result; /* Ordre à retourner */ + + if (event->keyval == GDK_KEY_Escape) + { + gtk_widget_destroy(widget); + result = TRUE; + } + else result = FALSE; + + return result; + +} diff --git a/src/gui/dialogs/about.h b/src/gui/dialogs/about.h new file mode 100644 index 0000000..6be0560 --- /dev/null +++ b/src/gui/dialogs/about.h @@ -0,0 +1,37 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * about.h - prototypes pour la boîte de dialogue d'information sur le programme + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_ABOUT_H +#define _GUI_DIALOGS_ABOUT_H + + +#include + + + +/* Construit la fenêtre d'informations sur le logiciel. */ +GtkWidget *create_about_dialog(GtkWindow *); + + + +#endif /* _GUI_DIALOGS_ABOUT_H */ diff --git a/src/gui/dialogs/bookmark.c b/src/gui/dialogs/bookmark.c new file mode 100644 index 0000000..4a5757a --- /dev/null +++ b/src/gui/dialogs/bookmark.c @@ -0,0 +1,328 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * bookmark.c - boîte de dialogue pour les sauts à une adresse donnée + * + * Copyright (C) 2012-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "bookmark.h" + + +#include +#include + + +#include + + +#include "../../analysis/db/items/bookmark.h" +#include "../../gtkext/easygtk.h" + + + +/* Filtre les adresses en hexadécimal pendant l'édition. */ +static void filter_addresses(GtkEntry *, const gchar *, gint, gint *, gpointer); + +/* Clôture l'édition d'une adresse. */ +static void validate_addresses(GtkEntry *, GtkDialog *); + + + +/****************************************************************************** +* * +* Paramètres : entry = composant GTK concerné par la procédure. * +* text = nouveau texte inséré. * +* length = taille de ce texte. * +* position = point d'insertion. * +* data = adresse non utilisée ici. * +* * +* Description : Filtre les adresses en hexadécimal pendant l'édition. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void filter_addresses(GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) +{ + gboolean has_hex; /* Préfixe '0x' déjà présent ? */ + gchar *filtered; /* Contenu nouveau approuvé */ + gint count; /* Nouvelle taille validée */ + gint i; /* Boucle de parcours */ + + /** + * On cherche à empêcher l'édition avant un '0x' présent, + * ce qui viendrait fausser le fitrage. + */ + has_hex = g_str_has_prefix(gtk_entry_get_text(entry), "0x"); + + filtered = g_new(gchar, length); + + count = 0; + + for (i = 0; i < length; i++) + switch (text[i]) + { + case '0' ... '9': + case 'a' ... 'f': + if (!has_hex || ((i + *position) >= 2)) + filtered[count++] = text[i]; + break; + case 'A' ... 'F': + if (!has_hex || ((i + *position) >= 2)) + filtered[count++] = tolower(text[i]); + break; + case 'x': + case 'X': + if ((i + *position) == 1) + filtered[count++] = 'x'; + break; + } + + if (count > 0) + { + g_signal_handlers_block_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); + gtk_editable_insert_text(GTK_EDITABLE(entry), filtered, count, position); + g_signal_handlers_unblock_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); + } + + g_signal_stop_emission_by_name(G_OBJECT(entry), "insert_text"); + + g_free(filtered); + +} + + +/****************************************************************************** +* * +* Paramètres : entry = composant GTK concerné par la procédure. * +* dialog = boîte de dialogue à valider. * +* * +* Description : Clôture l'édition d'une adresse. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void validate_addresses(GtkEntry *entry, GtkDialog *dialog) +{ + gtk_dialog_response(dialog, GTK_RESPONSE_OK); + +} + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* addr = localisation du point à consigner. * +* * +* Description : Construit la fenêtre de création de signet. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_bookmark_dialog(GtkWindow *parent, const vmpa2t *addr) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkWidget *dlgvbox; /* Zone principale de la boîte */ + GtkWidget *vbox; /* Support à construire #1 */ + GtkWidget *frame; /* Support avec encadrement */ + GtkWidget *sub_vbox; /* Support à construire #2 */ + GtkWidget *hbox; /* Support à construire #3 */ + GtkWidget *label; /* Message d'introduction */ + GtkWidget *entry; /* Zone de saisie principale */ + GtkWidget *radio; /* Définition de localisation */ + VMPA_BUFFER(target); /* Désignation humaine de cible*/ + + result = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(result), _("Add a bookmark")); + gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(result), TRUE); + gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); + + dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); + gtk_widget_show(dlgvbox); + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); + + /* Localisation dans l'espace */ + + sub_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(sub_vbox); + + frame = qck_create_frame(_("Localisation"), sub_vbox, 8, 0, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + /* 1) Adresse */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(sub_vbox), hbox, FALSE, TRUE, 0); + + label = qck_create_label(NULL, NULL, _("Target:")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(result), "addr", NULL); + //g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_text_empty_entry), assistant); + gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); + + /* 2) Type d'adresse */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 8); + + radio = qck_create_radio_button(G_OBJECT(result), "phys", _("Value is physical offset"), + NULL, NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); + + radio = qck_create_radio_button(G_OBJECT(result), "virt", _("Value is virtual address"), + GTK_RADIO_BUTTON(radio), NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); + + /* Commentaire éventuel */ + + entry = qck_create_entry(G_OBJECT(result), "comment", NULL); + + frame = qck_create_frame(_("Optional comment"), entry, 8, 0, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + /* Zone de validation */ + + gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); + + /* Remplissage avec les valeurs fournies */ + + entry = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "addr")); + + if (addr != NULL && has_virt_addr(addr)) + { + vmpa2_virt_to_string(addr, MDS_UNDEFINED, target, NULL); + radio = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "virt")); + } + + else if (addr != NULL && has_phys_addr(addr)) + { + vmpa2_virt_to_string(addr, MDS_UNDEFINED, target, NULL); + radio = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "virt")); + } + + else + radio = NULL; + + if (radio == NULL) + { + gtk_entry_set_text(GTK_ENTRY(entry), "0x"); + gtk_editable_set_position(GTK_EDITABLE(entry), -1); + gtk_widget_grab_focus(entry); + } + + else + { + gtk_entry_set_text(GTK_ENTRY(entry), target); + gtk_editable_set_position(GTK_EDITABLE(entry), -1); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); + + } + + if (radio != NULL) + { + entry = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "comment")); + gtk_widget_grab_focus(entry); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * +* * +* Description : Fournit le signet conçu via la saisie de l'utilisateur. * +* * +* Retour : Adresse reccueillie par la boîte de dialogue. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GDbItem *get_item_from_bookmark_dialog(GtkWidget *dialog) +{ + GDbItem *result; /* Signet nouveau à retourner */ + GObject *ref; /* Espace de référencements */ + vmpa2t *orig; /* Copie de valeur originale */ + vmpa2t addr; /* Localisation finale utilisée*/ + GtkWidget *entry; /* Zone de saisie principale */ + const gchar *text; /* Adresse en version texte */ + GtkToggleButton *radio; /* Définition de localisation */ + + ref = G_OBJECT(dialog); + + /* Si la valeur d'origine a été conservée intacte... */ + + orig = (vmpa2t *)g_object_get_data(ref, "orig"); + + if (orig == NULL) + { + entry = GTK_WIDGET(g_object_get_data(ref, "addr")); + text = gtk_entry_get_text(GTK_ENTRY(entry)); + + radio = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "phys")); + + if (gtk_toggle_button_get_active(radio)) + orig = string_to_vmpa_phy(text); + else + orig = string_to_vmpa_virt(text); + + + + } + + copy_vmpa(&addr, orig); + delete_vmpa(orig); + + /* Récupération du commentaire éventuel */ + + entry = GTK_WIDGET(g_object_get_data(ref, "comment")); + text = gtk_entry_get_text(GTK_ENTRY(entry)); + + /* Mise en place du signet défini */ + + if (strlen(text) > 0) + result = G_DB_ITEM(g_db_bookmark_new(&addr, text)); + else + result = G_DB_ITEM(g_db_bookmark_new(&addr, NULL)); + + return result; + +} diff --git a/src/gui/dialogs/bookmark.h b/src/gui/dialogs/bookmark.h new file mode 100644 index 0000000..78ce45e --- /dev/null +++ b/src/gui/dialogs/bookmark.h @@ -0,0 +1,44 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * bookmark.h - prototypes pour la boîte de dialogue pour les sauts à une adresse donnée + * + * Copyright (C) 2012 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_BOOKMARK_H +#define _GUI_DIALOGS_BOOKMARK_H + + +#include + + +#include "../../arch/vmpa.h" +#include "../../analysis/db/item.h" + + + +/* Construit la fenêtre de création de signet. */ +GtkWidget *create_bookmark_dialog(GtkWindow *, const vmpa2t *); + +/* Fournit le signet conçu via la saisie de l'utilisateur. */ +GDbItem *get_item_from_bookmark_dialog(GtkWidget *); + + + +#endif /* _GUI_DIALOGS_BOOKMARK_H */ diff --git a/src/gui/dialogs/export.c b/src/gui/dialogs/export.c new file mode 100644 index 0000000..33fd0c5 --- /dev/null +++ b/src/gui/dialogs/export.c @@ -0,0 +1,790 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * export.c - assistant d'exportation de contenu binaire + * + * Copyright (C) 2010-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "export.h" + + +#include +#include +#include +#include +#include + + +#include + + +#include "../../common/extstr.h" +#include "../../gtkext/easygtk.h" + + + +/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */ + + +/* Ferme l'assistant sans dérouler la procédure. */ +static void export_assistant_cancel(GtkAssistant *, gpointer); + +/* Ferme l'assistant et déroule la procédure. */ +static void export_assistant_close(GtkAssistant *, GObject *); + + + +/* ----------------------- DEFINITION DU FORMAT D'EXPORTATION ----------------------- */ + + +/* Ajoute le panneau de choix du format d'exportation. */ +static void register_format_panel(GtkAssistant *); + +/* Réagit un changement du format pour l'exportation. */ +static void on_export_format_changed(GtkComboBox *, GtkAssistant *); + +/* Interdit un champ de texte vide pour les options de texte. */ +static void forbid_text_empty_entry(GtkEntry *, GtkAssistant *); + +/* Interdit un champ de texte vide pour les options HTML. */ +static void forbid_html_empty_entry(GtkEntry *, GtkAssistant *); + + + +/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */ + + +/* Ajoute le panneau de sélection du contenu à exporter. */ +static void register_content_panel(GtkAssistant *); + + + +/* ------------------------ DEFINITION DE LA SORTIE ATTENDUE ------------------------ */ + + +/* Ajoute le panneau de choix du type de sortie. */ +static void register_output_panel(GtkAssistant *); + +/* Réagit un changement du nom de fichier pour l'exportation. */ +static void on_export_filename_changed(GtkEntry *, GtkAssistant *); + +/* Sélectionne ou non un nouveau fichier de sortie. */ +static void on_filename_browsing_clicked(GtkButton *, GObject *); + + + +/* ---------------------------------------------------------------------------------- */ +/* PARTIE PRINCIPALE DE L'ASSISTANT */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* parent = fenêtre principale de l'éditeur. * +* * +* Description : Crée et affiche un assistant d'aide à l'exportation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void run_export_assistant(GLoadedBinary *binary, GtkWindow *parent) +{ + GtkWidget *assistant; /* Fenêtre à afficher */ + GObject *ref; /* Espace de référencement */ + + assistant = gtk_assistant_new(); + gtk_widget_set_size_request(assistant, 500, 350); + gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(assistant), _("Export assistant")); + + gtk_window_set_modal(GTK_WINDOW(assistant), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(assistant), parent); + + ref = G_OBJECT(assistant); + g_object_set_data(ref, "binary", binary); + + register_format_panel(GTK_ASSISTANT(assistant)); + register_content_panel(GTK_ASSISTANT(assistant)); + register_output_panel(GTK_ASSISTANT(assistant)); + + g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL); + g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref); + + gtk_widget_show_all(assistant); + +} + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* data = adresse non utilisée ici. * +* * +* Description : Ferme l'assistant sans dérouler la procédure. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void export_assistant_cancel(GtkAssistant *assistant, gpointer data) +{ + GObject *support; /* Support interne à supprimer */ + + support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "text_options")); + if (support != NULL) g_object_unref(support); + + support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "html_options")); + if (support != NULL) g_object_unref(support); + + gtk_widget_destroy(GTK_WIDGET(assistant)); + +} + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* ref = adresse de l'espace de référencement global. * +* * +* Description : Ferme l'assistant et déroule la procédure. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void export_assistant_close(GtkAssistant *assistant, GObject *ref) +{ + GtkComboBox *combo; /* Selection du format */ + BufferExportType type; /* Type d'exportation requise */ + buffer_export_context ctx; /* Contexte à constituer */ + GtkEntry *entry; /* Zone de saisie */ + const gchar *filename; /* Chemin d'accès du fichier */ + GtkToggleButton *checkbutton; /* Coche à retrouver */ + bool display[BLC_DISPLAY]; /* Affichage à garantir */ + GLoadedBinary *binary; /* Binaire chargé à parcourir */ + GCodeBuffer *buffer; /* Tampon de code à traiter */ + GBufferView *view; /* Vue à exporter */ + GObject *support; /* Support interne à supprimer */ + + /* Type d'exportation */ + + combo = GTK_COMBO_BOX(g_object_get_data(ref, "format")); + + type = (BufferExportType)gtk_combo_box_get_active(combo); + + /* Fichier de sortie */ + + entry = GTK_ENTRY(g_object_get_data(ref, "filename")); + filename = gtk_entry_get_text(entry); + + switch (type) + { + case BET_TEXT: + case BET_HTML: + ctx.fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR); + if (ctx.fd == -1) + { + perror("open"); + return; + } + break; + + default: + assert(false); + break; + + } + + /* Eléments à afficher */ + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "physical_off")); + display[BLC_PHYSICAL] = gtk_toggle_button_get_active(checkbutton); + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr")); + display[BLC_VIRTUAL] = gtk_toggle_button_get_active(checkbutton); + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code")); + display[BLC_BINARY] = gtk_toggle_button_get_active(checkbutton); + + /* Options éventuelles */ + + switch (type) + { + case BET_TEXT: + entry = GTK_ENTRY(g_object_get_data(ref, "text_separator")); + ctx.sep = gtk_entry_get_text(entry); + if (strcmp(ctx.sep, "\\t") == 0) ctx.sep = "\t"; + break; + + case BET_HTML: + entry = GTK_ENTRY(g_object_get_data(ref, "html_font_name")); + ctx.font_name = gtk_entry_get_text(entry); + + entry = GTK_ENTRY(g_object_get_data(ref, "html_bg_color")); + ctx.bg_color = gtk_entry_get_text(entry); + + break; + + default: + break; + + } + + /* Programmation de la tâche */ + + binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); + + buffer = g_loaded_binary_get_disassembled_buffer(binary); + view = g_buffer_view_new(buffer, NULL); + + g_buffer_view_export(view, &ctx, type, display); + + /* Conclusion */ + + switch (type) + { + case BET_TEXT: + case BET_HTML: + close(ctx.fd); + break; + + default: + break; + + } + + g_object_unref(view); + + support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "text_options")); + if (support != NULL) g_object_unref(support); + + support = G_OBJECT(g_object_get_data(G_OBJECT(assistant), "html_options")); + if (support != NULL) g_object_unref(support); + + gtk_widget_destroy(GTK_WIDGET(assistant)); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION DU FORMAT D'EXPORTATION */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de choix du format d'exportation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_format_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal #1 */ + GtkWidget *hbox; /* Support principal #2 */ + GtkWidget *label; /* Etiquette d'indication */ + GtkWidget *combobox; /* Sélection du format */ + GtkWidget *options; /* Zone d'options */ + GtkWidget *content; /* Accueil desdites options */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Format de sortie */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("Format: ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + combobox = qck_create_combobox(G_OBJECT(assistant), "format", G_CALLBACK(on_export_format_changed), assistant); + gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0); + + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("Simple text")); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("HTML")); + + /* Eventuelles options */ + + content = gtk_event_box_new(); + gtk_widget_show(content); + + options = qck_create_frame(_("Options"), content, 0, 12, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), options, FALSE, FALSE, 0); + + g_object_set_data(G_OBJECT(assistant), "options", content); + + /* Intégration */ + + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 1); + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Format")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_INTRO); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + +} + + +/****************************************************************************** +* * +* Paramètres : combo = liste dont la sélection vient de changer. * +* assistant = fenêtre affichée et référencement global. * +* * +* Description : Réagit un changement du format pour l'exportation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_export_format_changed(GtkComboBox *combo, GtkAssistant *assistant) +{ + BufferExportType selected; /* Format attendu */ + GtkContainer *content; /* Accueil des options */ + GtkWidget *old; /* Ancien support à remplacer */ + GtkWidget *vbox; /* Support principal #1 */ + GtkWidget *hbox; /* Support principal #2 */ + GtkWidget *label; /* Etiquette d'indication */ + GtkWidget *entry; /* Zone de saisie de valeur */ + char *filename; /* Chemin à venir modifier */ + char *dot; /* Dernière occurence de point */ + + selected = (BufferExportType)gtk_combo_box_get_active(combo); + + content = GTK_CONTAINER(g_object_get_data(G_OBJECT(assistant), "options")); + + old = gtk_bin_get_child(GTK_BIN(content)); + if (old != NULL) + { + g_object_ref(G_OBJECT(old)); + gtk_container_remove(content, old); + } + + switch (selected) + { + case BET_TEXT: + + hbox = GTK_WIDGET(g_object_get_data(G_OBJECT(assistant), "text_options")); + + if (hbox == NULL) + { + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + g_object_ref(G_OBJECT(hbox)); + gtk_widget_show(hbox); + g_object_set_data(G_OBJECT(assistant), "text_options", hbox); + + label = qck_create_label(NULL, NULL, _("String between columns: ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(assistant), "text_separator", NULL); + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_text_empty_entry), assistant); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + gtk_entry_set_text(GTK_ENTRY(entry), "\\t"); + + } + + gtk_container_add(content, hbox); + + break; + + case BET_HTML: + + vbox = GTK_WIDGET(g_object_get_data(G_OBJECT(assistant), "html_options")); + + if (vbox == NULL) + { + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + g_object_ref(G_OBJECT(vbox)); + gtk_widget_show(vbox); + g_object_set_data(G_OBJECT(assistant), "html_options", vbox); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("HTML table font name: ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(assistant), "html_font_name", NULL); + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_html_empty_entry), assistant); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + gtk_entry_set_text(GTK_ENTRY(entry), "monospace"); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("HTML table background color: ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(assistant), "html_bg_color", NULL); + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_html_empty_entry), assistant); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + gtk_entry_set_text(GTK_ENTRY(entry), "#2c2c2c"); + + } + + gtk_container_add(content, vbox); + + break; + + default: + break; + + } + + /* Mise à jour de l'extension du fichier de sortie, si possible */ + + entry = GTK_WIDGET(g_object_get_data(G_OBJECT(assistant), "filename")); + + if (entry != NULL) + { + filename = strdup(gtk_entry_get_text(GTK_ENTRY(entry))); + + dot = strrchr(filename, '.'); + if (dot == NULL) goto oefc_no_dot; + + *dot = '\0'; + + switch (selected) + { + case BET_TEXT: + filename = stradd(filename, ".txt"); + break; + case BET_HTML: + filename = stradd(filename, ".html"); + break; + default: + break; + } + + gtk_entry_set_text(GTK_ENTRY(entry), filename); + + oefc_no_dot: + + free(filename); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : entry = zone de texte dont le contenu vient de changer. * +* assistant = fenêtre affichée et référencement global. * +* * +* Description : Interdit un champ de texte vide pour les options HTML. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void forbid_text_empty_entry(GtkEntry *entry, GtkAssistant *assistant) +{ + const gchar *text; /* Texte saisi dans la zone */ + gint num; /* Etape courante */ + GtkWidget *page; /* Support de cette étape */ + + text = gtk_entry_get_text(entry); + + num = gtk_assistant_get_current_page(assistant); + page = gtk_assistant_get_nth_page(assistant, num); + + gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); + +} + + +/****************************************************************************** +* * +* Paramètres : _entry = zone de texte dont le contenu vient de changer. * +* assistant = fenêtre affichée et référencement global. * +* * +* Description : Interdit un champ de texte vide pour les options de texte. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void forbid_html_empty_entry(GtkEntry *_entry, GtkAssistant *assistant) +{ + bool status; /* Etat final à remonter */ + GtkEntry *entry; /* Zone de texte générique */ + const gchar *text; /* Texte saisi dans la zone */ + gint num; /* Etape courante */ + GtkWidget *page; /* Support de cette étape */ + + status = true; + + /* Police de caractère */ + + entry = GTK_ENTRY(g_object_get_data(G_OBJECT(assistant), "html_font_name")); + text = gtk_entry_get_text(entry); + + status &= (strlen(text) > 0); + + /* Couleur de fond */ + + entry = GTK_ENTRY(g_object_get_data(G_OBJECT(assistant), "html_bg_color")); + + if (entry != NULL) + { + text = gtk_entry_get_text(entry); + + status &= (strlen(text) > 0); + + } + + /* Mise à jour graphique */ + + num = gtk_assistant_get_current_page(assistant); + + if (num != -1) + { + page = gtk_assistant_get_nth_page(assistant, num); + + gtk_assistant_set_page_complete(assistant, page, status); + + } + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* SELECTION DU CONTENU A TRAITER */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de sélection du contenu à exporter. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_content_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal */ + GtkWidget *frame; /* Support avec encadrement */ + GtkWidget *sub_vbox; /* Division verticale */ + GtkWidget *checkbutton; /* Coche pour une option */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Eléments à afficher */ + + sub_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(sub_vbox); + + frame = qck_create_frame(_("Items to display"), sub_vbox, 0, 12, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "physical_off", _("Physical offset"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(sub_vbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(sub_vbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(sub_vbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + /* Intégration */ + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Exported content")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONTENT); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION DE LA SORTIE ATTENDUE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de choix du type de sortie. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_output_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal #1 */ + GtkWidget *label; /* Etiquette d'indication */ + GtkWidget *hbox; /* Support principal #2 */ + GtkWidget *entry; /* Zone de saisie de texte */ + GtkWidget *button; /* Sélection de fichier */ + GLoadedBinary *binary; /* Binaire chargé à parcourir */ + const char *filename; /* Chemin d'accès par défaut */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Fichier de sortie */ + + label = qck_create_label(NULL, NULL, _("File: ")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + + button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + /* Intégration */ + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Output")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONFIRM); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + + /* Choix par défaut */ + + binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); + filename = g_loaded_binary_get_name(binary, true); + + gtk_entry_set_text(GTK_ENTRY(entry), filename); + gtk_editable_insert_text(GTK_EDITABLE(entry), ".html", -1, (gint []) { strlen(filename) }); + + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); + +} + + +/****************************************************************************** +* * +* Paramètres : entry = zone de texte dont le contenu vient de changer. * +* assistant = fenêtre affichée et référencement global. * +* * +* Description : Réagit un changement du nom de fichier pour l'exportation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant) +{ + const gchar *text; /* Texte saisi dans la zone */ + gint num; /* Etape courante */ + GtkWidget *page; /* Support de cette étape */ + + text = gtk_entry_get_text(entry); + + num = gtk_assistant_get_current_page(assistant); + page = gtk_assistant_get_nth_page(assistant, num); + + gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); + +} + + +/****************************************************************************** +* * +* Paramètres : button = bouton d'édition de la sélection. * +* ref = espace de référencement principal. * +* * +* Description : Sélectionne ou non un nouveau fichier de sortie. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_filename_browsing_clicked(GtkButton *button, GObject *ref) +{ + GtkWidget *dialog; /* Boîte à afficher */ + gchar *filename; /* Nom du fichier à intégrer */ + GtkEntry *entry; /* Zone de saisie à maj. */ + + dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref), + GTK_FILE_CHOOSER_ACTION_SAVE, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_ACCEPT, + NULL); + + entry = GTK_ENTRY(g_object_get_data(ref, "filename")); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), gtk_entry_get_text(entry)); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + gtk_entry_set_text(GTK_ENTRY(entry), filename); + + g_free(filename); + + } + + gtk_widget_destroy(dialog); + +} diff --git a/src/gui/dialogs/export.h b/src/gui/dialogs/export.h new file mode 100644 index 0000000..9989971 --- /dev/null +++ b/src/gui/dialogs/export.h @@ -0,0 +1,40 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * export.h - prototypes pour l'assistant d'exportation de contenu binaire + * + * Copyright (C) 2010-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_EXPORT_H +#define _GUI_DIALOGS_EXPORT_H + + +#include + + +#include "../../analysis/binary.h" + + + +/* Crée et affiche un assistant d'aide à l'exportation. */ +void run_export_assistant(GLoadedBinary *, GtkWindow *); + + + +#endif /* _GUI_DIALOGS_EXPORT_H */ diff --git a/src/gui/dialogs/goto.c b/src/gui/dialogs/goto.c new file mode 100644 index 0000000..8eb6411 --- /dev/null +++ b/src/gui/dialogs/goto.c @@ -0,0 +1,251 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * goto.c - boîte de dialogue pour les sauts à une adresse donnée + * + * Copyright (C) 2012-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "goto.h" + + +#include + + +#include + + +#include "../../gtkext/easygtk.h" + + + +/* Filtre les adresses en hexadécimal pendant l'édition. */ +static void filter_addresses(GtkEntry *, const gchar *, gint, gint *, gpointer); + +/* Clôture l'édition d'une adresse. */ +static void validate_addresses(GtkEntry *, GtkDialog *); + + + +/****************************************************************************** +* * +* Paramètres : entry = composant GTK concerné par la procédure. * +* text = nouveau texte inséré. * +* length = taille de ce texte. * +* position = point d'insertion. * +* data = adresse non utilisée ici. * +* * +* Description : Filtre les adresses en hexadécimal pendant l'édition. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void filter_addresses(GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) +{ + gboolean has_hex; /* Préfixe '0x' déjà présent ? */ + gchar *filtered; /* Contenu nouveau approuvé */ + gint count; /* Nouvelle taille validée */ + gint i; /* Boucle de parcours */ + + /** + * On cherche à empêcher l'édition avant un '0x' présent, + * ce qui viendrait fausser le fitrage. + */ + has_hex = g_str_has_prefix(gtk_entry_get_text(entry), "0x"); + + filtered = g_new(gchar, length); + + count = 0; + + for (i = 0; i < length; i++) + switch (text[i]) + { + case '0' ... '9': + case 'a' ... 'f': + if (!has_hex || ((i + *position) >= 2)) + filtered[count++] = text[i]; + break; + case 'A' ... 'F': + if (!has_hex || ((i + *position) >= 2)) + filtered[count++] = tolower(text[i]); + break; + case 'x': + case 'X': + if ((i + *position) == 1) + filtered[count++] = 'x'; + break; + } + + if (count > 0) + { + g_signal_handlers_block_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); + gtk_editable_insert_text(GTK_EDITABLE(entry), filtered, count, position); + g_signal_handlers_unblock_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); + } + + g_signal_stop_emission_by_name(G_OBJECT(entry), "insert_text"); + + g_free(filtered); + +} + + +/****************************************************************************** +* * +* Paramètres : entry = composant GTK concerné par la procédure. * +* dialog = boîte de dialogue à valider. * +* * +* Description : Clôture l'édition d'une adresse. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void validate_addresses(GtkEntry *entry, GtkDialog *dialog) +{ + gtk_dialog_response(dialog, GTK_RESPONSE_OK); + +} + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* * +* Description : Construit la fenêtre de sélection des sections. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_goto_dialog(GtkWindow *parent) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkWidget *dlgvbox; /* Zone principale de la boîte */ + GtkWidget *vbox; /* Support à construire #1 */ + GtkWidget *label; /* Message d'introduction */ + GtkWidget *combobox; /* Liste de sélection */ + GtkWidget *entry; /* Zone de saisie principale */ + GtkWidget *hbox; /* Support à construire #2 */ + GtkWidget *radio; /* Définition de localisation */ + + result = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(result), _("Go to address")); + gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(result), TRUE); + gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); + + dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); + gtk_widget_show(dlgvbox); + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); + + /* Zone de saisie principale */ + + label = qck_create_label(NULL, NULL, _("Enter the value of the target address:")); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + + combobox = qck_create_combobox_with_entry(G_OBJECT(result), "combobox", NULL, NULL); + gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, TRUE, 0); + + entry = gtk_bin_get_child(GTK_BIN(combobox)); + + g_signal_connect(G_OBJECT(entry), "insert_text", + G_CALLBACK(filter_addresses), NULL); + g_signal_connect(G_OBJECT(entry), "activate", + G_CALLBACK(validate_addresses), GTK_DIALOG(result)); + + + /* TODO */ + //gtk_combo_box_append_text(combobox, "test"); + + + /* Propriétés de la localisation */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 8); + + radio = qck_create_radio_button(G_OBJECT(result), "phy", _("Address is physical"), + NULL, NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); + + radio = qck_create_radio_button(G_OBJECT(result), "virt", _("Address is virtual"), + GTK_RADIO_BUTTON(radio), NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); + + /* Zone de validation */ + + gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); + + gtk_entry_set_text(GTK_ENTRY(entry), "0x"); + gtk_widget_grab_focus (entry); + gtk_editable_set_position(GTK_EDITABLE(entry), -1); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * +* * +* Description : Fournit l'adresse obtenue par la saisie de l'utilisateur. * +* * +* Retour : Adresse reccueillie par la boîte de dialogue. * +* * +* Remarques : - * +* * +******************************************************************************/ + +vmpa2t *get_address_from_goto_dialog(GtkWidget *dialog) +{ + vmpa2t *result; /* Adresse à retourner */ + GtkWidget *combobox; /* Liste de sélection */ + GtkWidget *entry; /* Zone de saisie principale */ + const gchar *text; /* Adresse en version texte */ + GtkToggleButton *radio; /* Définition de localisation */ + + combobox = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), "combobox")); + entry = gtk_bin_get_child(GTK_BIN(combobox)); + + text = gtk_entry_get_text(GTK_ENTRY(entry)); + + radio = GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "phy")); + + if (gtk_toggle_button_get_active(radio)) + result = string_to_vmpa_phy(text); + else + result = string_to_vmpa_virt(text); + + return result; + +} diff --git a/src/gui/dialogs/goto.h b/src/gui/dialogs/goto.h new file mode 100644 index 0000000..7d8cd54 --- /dev/null +++ b/src/gui/dialogs/goto.h @@ -0,0 +1,43 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * goto.h - prototypes pour la boîte de dialogue pour les sauts à une adresse donnée + * + * Copyright (C) 2012 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_GOTO_H +#define _GUI_DIALOGS_GOTO_H + + +#include + + +#include "../../arch/vmpa.h" + + + +/* Construit la fenêtre de saut à une adresse. */ +GtkWidget *create_goto_dialog(GtkWindow *); + +/* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ +vmpa2t *get_address_from_goto_dialog(GtkWidget *); + + + +#endif /* _GUI_DIALOGS_GOTO_H */ diff --git a/src/gui/dialogs/gotox.c b/src/gui/dialogs/gotox.c new file mode 100644 index 0000000..fd05100 --- /dev/null +++ b/src/gui/dialogs/gotox.c @@ -0,0 +1,500 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * goto.c - boîte de dialogue pour les sauts à une adresse donnée + * + * Copyright (C) 2012-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "gotox.h" + + +#include +#include + + +#include + + +#include "../../gtkext/easygtk.h" +#include "../../gtkext/support.h" + + + +/* Colonnes de la liste des symboles */ +typedef enum _GotoXColumn +{ + GXC_PHYSICAL, /* Correspondance physique */ + GXC_VIRTUAL, /* Correspondance virtuelle */ + + GXC_PICTURE, /* Image de représentation */ + GXC_ADDRESS, /* Adresse mémoire du symbole */ + GXC_NAME, /* Désignation humaine */ + GXC_CONTENT, /* Contenu de la ligne visée */ + + GXC_COUNT /* Nombre de colonnes */ + +} GotoXColumn; + + +/* Réagit à une validation d'une ligne affichée. */ +static void on_gotox_row_activated(GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, GtkDialog *); + +/* Construit la fenêtre de sélection d'adresses. */ +static GtkWidget *create_gotox_dialog(GtkWindow *, GtkTreeStore **); + +/* Ajoute une nouvelle localisation de destination. */ +static void add_new_location_to_list(GtkTreeStore *, GLoadedBinary *, const vmpa2t *, GBinSymbol *); + + + +/****************************************************************************** +* * +* Paramètres : treeview = composant graphique manipulé par l'utilisateur. * +* path = chemin d'accès à la ligne activée. * +* column = colonne impactée par l'action. * +* dialog = boîte de dialogue affichant la liste éditée. * +* * +* Description : Réagit à une validation d'une ligne affichée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_gotox_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, GtkDialog *dialog) +{ + gtk_dialog_response(dialog, GTK_RESPONSE_OK); + +} + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* store = modèle de gestion pour les éléments de liste. [OUT] * +* * +* Description : Construit la fenêtre de sélection d'adresses. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GtkWidget *create_gotox_dialog(GtkWindow *parent, GtkTreeStore **store) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkWidget *dlgvbox; /* Zone principale de la boîte */ + GtkWidget *vbox; /* Support à construire #1 */ + GtkWidget *scrollwnd; /* Support défilant */ + GtkWidget *treeview; /* Affichage de la liste */ + GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ + GtkTreeViewColumn *column; /* Colonne de la liste */ + + result = gtk_dialog_new(); + gtk_window_set_default_size(GTK_WINDOW(result), 600, 350); + gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); + gtk_window_set_modal(GTK_WINDOW(result), TRUE); + gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); + + dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); + gtk_widget_show(dlgvbox); + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); + + /* Liste arborescente ou linéaire */ + + scrollwnd = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrollwnd); + gtk_box_pack_start(GTK_BOX(vbox), scrollwnd, TRUE, TRUE, 0); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); + + *store = gtk_tree_store_new(GXC_COUNT, + G_TYPE_UINT64, G_TYPE_UINT64, + CAIRO_GOBJECT_TYPE_SURFACE, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(*store)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(treeview), TRUE); + + g_signal_connect(treeview, "row-activated", G_CALLBACK(on_gotox_row_activated), result); + + g_object_set_data(G_OBJECT(result), "treeview", treeview); + + gtk_widget_show(treeview); + gtk_container_add(GTK_CONTAINER(scrollwnd), treeview); + + /* Cellules d'affichage */ + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Address"), renderer, + "markup", GXC_ADDRESS, + NULL); + gtk_tree_view_column_set_sort_column_id(column, GXC_ADDRESS); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + column = gtk_tree_view_column_new(); + + gtk_tree_view_column_set_title(column, _("Name")); + + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "surface", GXC_PICTURE, + NULL); + + g_object_set(G_OBJECT(renderer), "xpad", 4, NULL); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", GXC_NAME, + NULL); + + gtk_tree_view_column_set_sort_column_id(column, GXC_NAME); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Content"), renderer, + "markup", GXC_CONTENT, + NULL); + gtk_tree_view_column_set_sort_column_id(column, GXC_CONTENT); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + /* Zone de validation */ + + gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_add_button(GTK_DIALOG(result), _("_Go"), GTK_RESPONSE_OK); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* binary = binaire dont les points d'entrée sont à afficher. * +* * +* Description : Construit la fenêtre de sélection des points d'entrée. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *parent, GLoadedBinary *binary) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkTreeStore *store; /* Modèle de gestion */ + GBinFormat *format; /* Format associé au binaire */ + GBinSymbol **symbols; /* Symboles à représenter */ + size_t sym_count; /* Qté de symboles présents */ + bool has_entry_points; /* Présences d'insertions ? */ + size_t i; /* Boucle de parcours */ + vmpa2t addr; /* Localisation de symbole */ + + /* Mise en place de la boîte de dialogue */ + + result = create_gotox_dialog(parent, &store); + + gtk_window_set_title(GTK_WINDOW(result), _("Binary's entry points")); + + /* Affichage de tous les points d'entrées */ + + format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + + symbols = g_binary_format_get_symbols(format, &sym_count); + + has_entry_points = false; + + for (i = 0; i < sym_count; i++) + { + if (g_binary_symbol_get_target_type(symbols[i]) != STP_ENTRY_POINT) + continue; + + copy_vmpa(&addr, get_mrange_addr(g_binary_symbol_get_range(symbols[i]))); + + add_new_location_to_list(store, binary, &addr, symbols[i]); + + has_entry_points = true; + + } + + g_object_unref(G_OBJECT(store)); + + gtk_dialog_set_response_sensitive(GTK_DIALOG(result), GTK_RESPONSE_OK, has_entry_points); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* binary = binaire dont les points d'entrée sont à afficher. * +* instr = instruction de référence sur laquelle s'appuyer. * +* back = sens de la récupérations des instructions visées. * +* * +* Description : Construit la fenêtre de sélection des références croisées. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *parent, GLoadedBinary *binary, const GArchInstruction *instr, bool back) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkTreeStore *store; /* Modèle de gestion */ + GArchInstruction **list; /* Liste d'instructions */ + size_t count; /* Nombre d'éléments présents */ + size_t i; /* Boucle de parcours */ + const vmpa2t *addr; /* Adresse à considérer */ + + /* Mise en place de la boîte de dialogue */ + + result = create_gotox_dialog(parent, &store); + + if (back) + gtk_window_set_title(GTK_WINDOW(result), _("List of backward cross references")); + else + gtk_window_set_title(GTK_WINDOW(result), _("List of forward cross references")); + + /* Affichage de toutes les instructions référencées */ + + if (back) + count = g_arch_instruction_get_sources(instr, &list, NULL); + else + count = g_arch_instruction_get_destinations(instr, &list, NULL, NULL); + + for (i = 0; i < count; i++) + { + addr = get_mrange_addr(g_arch_instruction_get_range(list[i])); + + add_new_location_to_list(store, binary, addr, NULL); + + } + + g_object_unref(G_OBJECT(store)); + + gtk_dialog_set_response_sensitive(GTK_DIALOG(result), GTK_RESPONSE_OK, count > 0); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : store = modèle de gestionnaire pour la liste affichée. * +* binary = représentation du binaire chargé en mémoire. * +* addr = localisation à venir ajouter à la liste. * +* hint = éventuel symbole à venir retrouver à l'adresse. * +* * +* Description : Ajoute une nouvelle localisation de destination. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, const vmpa2t *addr, GBinSymbol *hint) +{ + GCodeBuffer *buffer; /* Tampon de désassemblage */ + GBufferLine *line; /* Ligne présente à l'adresse */ + char *virtual; /* Transcription d'adresse */ + const char *label; /* Etiquette de symbole trouvé */ + GBinFormat *format; /* Format associé au binaire */ + GBinSymbol *symbol; /* Symbole associé à l'adresse */ + phys_t diff; /* Décalage vis à vis du début */ + char *name; /* Désignation humaine */ + gchar *filename; /* Chemin d'accès à utiliser */ + cairo_surface_t *icon; /* Image pour les symboles */ + char *content; /* Contenu de la ligne visée */ + GtkTreeIter iter; /* Point d'insertion */ + + /* Adresse en mémoire virtuelle */ + + buffer = g_loaded_binary_get_disassembled_buffer(binary); + line = g_code_buffer_find_line_by_addr(buffer, addr, BLF_HAS_CODE, NULL); + + if (line != NULL) + virtual = g_buffer_line_get_text(line, BLC_VIRTUAL, BLC_VIRTUAL + 1, true); + else + virtual = strdup(_("")); + + /* Désignation humaine de l'adresse */ + + if (hint != NULL) + { + symbol = hint; + g_object_ref(G_OBJECT(symbol)); + + label = g_binary_symbol_get_label(hint); + + name = make_symbol_offset(label, 0); + + } + else + { + format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + + if (g_binary_format_resolve_symbol(format, addr, &symbol, &diff)) + { + label = g_binary_symbol_get_label(symbol); + + /** + * Un symbole ne possède pas toujours d'étiquette. + * C'est le cas par exemple pour les valeurs chargées par + * les instructions ARM de type 'ldr'. + */ + if (label == NULL) + name = strdup(_("")); + + else + name = make_symbol_offset(label, diff); + + } + else + { + symbol = NULL; + + name = strdup(_("")); + + } + + } + + /* Image de représentation */ + + if (symbol == NULL) + filename = NULL; + + else + switch (g_binary_symbol_get_target_type(symbol)) + { + case STP_ENTRY_POINT: + filename = find_pixmap_file("entrypoint.png"); + break; + + default: + filename = NULL; + break; + + } + + if (filename != NULL) + { + icon = cairo_image_surface_create_from_png(filename); + g_free(filename); + } + else + icon = NULL; + + /* Contenu d'assemblage */ + + if (line != NULL) + content = g_buffer_line_get_text(line, BLC_ASSEMBLY_HEAD, BLC_COUNT, true); + else + content = strdup(_("")); + + /* Insertion finale */ + + gtk_tree_store_append(store, &iter, NULL); + + gtk_tree_store_set(store, &iter, + GXC_PHYSICAL, PHYS_CAST(get_phy_addr(addr)), + GXC_VIRTUAL, VIRT_CAST(get_virt_addr(addr)), + GXC_PICTURE, icon, + GXC_ADDRESS, virtual, + GXC_NAME, name, + GXC_CONTENT, content, + -1); + + if (symbol != NULL) + g_object_unref(G_OBJECT(symbol)); + + if (virtual != NULL) free(virtual); + if (icon != NULL) cairo_surface_destroy(icon); + free(name); + if (content != NULL) free(content); + + if (line != NULL) + g_object_unref(G_OBJECT(line)); + +} + + +/****************************************************************************** +* * +* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * +* * +* Description : Fournit l'adresse obtenue par la saisie de l'utilisateur. * +* * +* Retour : Adresse reccueillie par la boîte de dialogue ou NULL si rien.* +* * +* Remarques : - * +* * +******************************************************************************/ + +vmpa2t *get_address_from_gotox_dialog(GtkWidget *dialog) +{ + vmpa2t *result; /* Adresse à retourner */ + GtkTreeView *treeview; /* Liste d'adresses à lire */ + GtkTreeSelection *selection; /* Sélection courante */ + GtkTreeModel *model; /* Modèle de gestionnaire */ + GList *selected; /* Liste des sélections */ + GtkTreeIter iter; /* Tête de lecture */ + G_TYPE_PHYS phys; /* Position physique */ + G_TYPE_VIRT virt; /* Adresse virtuelle */ + + treeview = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(dialog), "treeview")); + + selection = gtk_tree_view_get_selection(treeview); + + selected = gtk_tree_selection_get_selected_rows(selection, &model); + if (selected == NULL) return NULL; + + if (!gtk_tree_model_get_iter(model, &iter, (GtkTreePath *)selected->data)) + return NULL; + + gtk_tree_model_get(model, &iter, + GXC_PHYSICAL, &phys, + GXC_VIRTUAL, &virt, + -1); + + result = make_vmpa(phys, virt); + + g_list_free_full(selected, (GDestroyNotify)gtk_tree_path_free); + + return result; + +} diff --git a/src/gui/dialogs/gotox.h b/src/gui/dialogs/gotox.h new file mode 100644 index 0000000..ab17d42 --- /dev/null +++ b/src/gui/dialogs/gotox.h @@ -0,0 +1,47 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * goto.h - prototypes pour la boîte de dialogue pour les sauts à une adresse donnée + * + * Copyright (C) 2012 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_GOTOX_H +#define _GUI_DIALOGS_GOTOX_H + + +#include + + +#include "../../analysis/binary.h" +#include "../../arch/vmpa.h" + + + +/* Construit la fenêtre de sélection des points d'entrée. */ +GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *, GLoadedBinary *); + +/* Construit la fenêtre de sélection des références croisées. */ +GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *, GLoadedBinary *, const GArchInstruction *, bool); + +/* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ +vmpa2t *get_address_from_gotox_dialog(GtkWidget *); + + + +#endif /* _GUI_DIALOGS_GOTOX_H */ diff --git a/src/gui/dialogs/plugins.c b/src/gui/dialogs/plugins.c new file mode 100644 index 0000000..68e6011 --- /dev/null +++ b/src/gui/dialogs/plugins.c @@ -0,0 +1,313 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * plugins.c - boîte de dialogue permettant une sélection des greffons + * + * Copyright (C) 2010-2012 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "plugins.h" + + +#include + + +#include "../../gtkext/easygtk.h" + + + + + + + + + + +/****************************************************************************** +* * +* Paramètres : binary = informations sur le binaire actuellement ouvert. * +* parent = fenêtre parente à surpasser. * +* * +* Description : Construit la fenêtre de sélection des sections. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_plugins_selection_dialog(GLoadedBinary *binary, GtkWindow *parent) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GObject *ref; /* Espace de référencements */ + + + + + GtkWidget *vbox1; + GtkWidget *hbox3; + GtkWidget *scrolledwindow1; + GtkWidget *treeview1; + GtkWidget *vbox2; + GtkWidget *vbuttonbox1; + GtkWidget *button7; + GtkWidget *image3; + GtkWidget *button8; + GtkWidget *image4; + GtkWidget *hseparator1; + GtkWidget *vbuttonbox2; + GtkWidget *button9; + GtkWidget *image5; + GtkWidget *button10; + GtkWidget *image6; + GtkWidget *scrolledwindow2; + GtkWidget *treeview2; + GtkWidget *expander1; + GtkWidget *hbox4; + GtkWidget *vbox3; + GtkWidget *label; /* Etiquette d'introduction */ + GtkWidget *label8; + GtkWidget *label9; + GtkWidget *label10; + GtkWidget *frame1; + GtkWidget *label12; + GtkWidget *label11; + GtkWidget *label3; + GtkWidget *hseparator2; + GtkWidget *hbuttonbox1; + GtkWidget *button1; + GtkWidget *hbox1; + GtkWidget *image1; + GtkWidget *label1; + GtkWidget *button2; + GtkWidget *hbox2; + GtkWidget *image2; + GtkWidget *label2; + + result = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request(result, 600, 400); + gtk_container_set_border_width(GTK_CONTAINER(result), 8); + gtk_window_set_title(GTK_WINDOW(result), _("Plugins selection")); + gtk_window_set_transient_for(GTK_WINDOW(result), parent); + gtk_window_set_default_size(GTK_WINDOW(result), 600, 400); + gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); + + ref= G_OBJECT(result); + g_object_set_data(ref, "binary", binary); + + + + + vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox1); + gtk_container_add(GTK_CONTAINER(result), vbox1); + gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8); + + hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox3); + gtk_box_pack_start(GTK_BOX(vbox1), hbox3, TRUE, TRUE, 0); + + scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow1); + gtk_box_pack_start(GTK_BOX(hbox3), scrolledwindow1, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_SHADOW_IN); + + treeview1 = gtk_tree_view_new(); + gtk_widget_show(treeview1); + gtk_container_add(GTK_CONTAINER(scrolledwindow1), treeview1); + + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox2); + gtk_box_pack_start(GTK_BOX(hbox3), vbox2, FALSE, FALSE, 0); + + vbuttonbox1 = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); + gtk_widget_show(vbuttonbox1); + gtk_box_pack_start(GTK_BOX(vbox2), vbuttonbox1, FALSE, FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox1), 8); + gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox1), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(vbuttonbox1), 8); + + button7 = gtk_button_new(); + gtk_widget_show(button7); + gtk_container_add(GTK_CONTAINER(vbuttonbox1), button7); + + image3 = gtk_image_new_from_icon_name("gtk-add", GTK_ICON_SIZE_BUTTON); + gtk_widget_show(image3); + gtk_container_add(GTK_CONTAINER(button7), image3); + + button8 = gtk_button_new(); + gtk_widget_show(button8); + gtk_container_add(GTK_CONTAINER(vbuttonbox1), button8); + + image4 = gtk_image_new_from_icon_name("gtk-remove", GTK_ICON_SIZE_BUTTON); + gtk_widget_show(image4); + gtk_container_add(GTK_CONTAINER(button8), image4); + + hseparator1 = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show(hseparator1); + gtk_box_pack_start(GTK_BOX(vbox2), hseparator1, FALSE, FALSE, 0); + + vbuttonbox2 = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); + gtk_widget_show(vbuttonbox2); + gtk_box_pack_start(GTK_BOX(vbox2), vbuttonbox2, FALSE, FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbuttonbox2), 8); + gtk_box_set_spacing(GTK_BOX(vbuttonbox2), 8); + + button9 = gtk_button_new(); + gtk_widget_show(button9); + gtk_container_add(GTK_CONTAINER(vbuttonbox2), button9); + + image5 = gtk_image_new_from_icon_name("gtk-go-up", GTK_ICON_SIZE_BUTTON); + gtk_widget_show(image5); + gtk_container_add(GTK_CONTAINER(button9), image5); + + button10 = gtk_button_new(); + gtk_widget_show(button10); + gtk_container_add(GTK_CONTAINER(vbuttonbox2), button10); + + image6 = gtk_image_new_from_icon_name("gtk-go-down", GTK_ICON_SIZE_BUTTON); + gtk_widget_show(image6); + gtk_container_add(GTK_CONTAINER(button10), image6); + + scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow2); + gtk_box_pack_start(GTK_BOX(hbox3), scrolledwindow2, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_SHADOW_IN); + + treeview2 = gtk_tree_view_new(); + gtk_widget_show(treeview2); + gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); + + expander1 = gtk_expander_new(NULL); + gtk_widget_show(expander1); + gtk_box_pack_start(GTK_BOX(vbox1), expander1, FALSE, FALSE, 0); + gtk_expander_set_expanded(GTK_EXPANDER(expander1), TRUE); + + hbox4 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox4); + gtk_container_add(GTK_CONTAINER(expander1), hbox4); + + vbox3 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox3); + gtk_box_pack_start(GTK_BOX(hbox4), vbox3, TRUE, TRUE, 0); + + label = qck_create_label(NULL, NULL, _("Author:")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0); + + label8 = gtk_label_new(_("label8")); + gtk_widget_show(label8); + gtk_box_pack_start(GTK_BOX(vbox3), label8, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("Version:")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0); + + label9 = gtk_label_new(_("label9")); + gtk_widget_show(label9); + gtk_box_pack_start(GTK_BOX(vbox3), label9, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("URL:")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox3), label, FALSE, FALSE, 0); + + label10 = gtk_label_new(_("label10")); + gtk_widget_show(label10); + gtk_box_pack_start(GTK_BOX(vbox3), label10, FALSE, FALSE, 0); + + frame1 = gtk_frame_new(NULL); + gtk_widget_show(frame1); + gtk_box_pack_start(GTK_BOX(hbox4), frame1, TRUE, TRUE, 0); + gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_NONE); + + label12 = gtk_label_new(_("label12")); + qck_set_alignment(label12, GTK_ALIGN_CENTER, GTK_ALIGN_CENTER); + qck_set_margins(label12, 0, 0, 12, 0); + gtk_widget_show(label12); + gtk_container_add(GTK_CONTAINER(frame1), label12); + + label11 = gtk_label_new(_("Action")); + gtk_widget_show(label11); + gtk_frame_set_label_widget(GTK_FRAME(frame1), label11); + gtk_label_set_use_markup(GTK_LABEL(label11), TRUE); + + label3 = gtk_label_new(_("Details:")); + gtk_widget_show(label3); + gtk_expander_set_label_widget(GTK_EXPANDER(expander1), label3); + gtk_label_set_use_markup(GTK_LABEL(label3), TRUE); + + hseparator2 = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show(hseparator2); + gtk_box_pack_start(GTK_BOX(vbox1), hseparator2, FALSE, FALSE, 0); + + hbuttonbox1 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show(hbuttonbox1); + gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox1, FALSE, FALSE, 0); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox1), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(hbuttonbox1), 8); + + button1 = gtk_button_new(); + gtk_widget_show(button1); + gtk_container_add(GTK_CONTAINER(hbuttonbox1), button1); + + hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + qck_set_alignment(hbox1, GTK_ALIGN_CENTER, GTK_ALIGN_CENTER); + gtk_widget_show(hbox1); + gtk_container_add(GTK_CONTAINER(button1), hbox1); + + image1 = gtk_image_new_from_icon_name("gtk-apply", GTK_ICON_SIZE_BUTTON); + gtk_widget_show(image1); + gtk_box_pack_start(GTK_BOX(hbox1), image1, FALSE, FALSE, 0); + + label1 = gtk_label_new_with_mnemonic(_("Apply")); + gtk_widget_show(label1); + gtk_box_pack_start(GTK_BOX(hbox1), label1, FALSE, FALSE, 0); + + button2 = gtk_button_new(); + gtk_widget_show(button2); + gtk_container_add(GTK_CONTAINER(hbuttonbox1), button2); + + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + qck_set_alignment(hbox2, GTK_ALIGN_CENTER, GTK_ALIGN_CENTER); + gtk_widget_show(hbox2); + gtk_container_add(GTK_CONTAINER(button2), hbox2); + + image2 = gtk_image_new_from_icon_name("gtk-cancel", GTK_ICON_SIZE_BUTTON); + gtk_widget_show(image2); + gtk_box_pack_start(GTK_BOX(hbox2), image2, FALSE, FALSE, 0); + + label2 = gtk_label_new_with_mnemonic(_("Cancel")); + gtk_widget_show(label2); + gtk_box_pack_start(GTK_BOX(hbox2), label2, FALSE, FALSE, 0); + + + + + + + return result; + +} + + + + + + + + diff --git a/src/gui/dialogs/plugins.h b/src/gui/dialogs/plugins.h new file mode 100644 index 0000000..44e1d48 --- /dev/null +++ b/src/gui/dialogs/plugins.h @@ -0,0 +1,40 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * plugins.h - prototypes pour la boîte de dialogue permettant une sélection des greffons + * + * Copyright (C) 2010-2012 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_PLUGINS_H +#define _GUI_DIALOGS_PLUGINS_H + + +#include + + +#include "../../analysis/binary.h" + + + +/* Construit la fenêtre de sélection des sections. */ +GtkWidget *create_plugins_selection_dialog(GLoadedBinary *, GtkWindow *); + + + +#endif /* _GUI_DIALOGS_PLUGINS_H */ diff --git a/src/gui/dialogs/shellcode.c b/src/gui/dialogs/shellcode.c new file mode 100644 index 0000000..8466ab2 --- /dev/null +++ b/src/gui/dialogs/shellcode.c @@ -0,0 +1,803 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * export.c - assistant d'exportation de contenu binaire + * + * Copyright (C) 2011-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "shellcode.h" + + +#include + + +#include +#include +#include +#include + + +#include "../../gtkext/easygtk.h" + + + + +#include "../../analysis/roptions.h" // A garder ? + + + + + + +/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */ + + +/* Ferme l'assistant sans dérouler la procédure. */ +static void export_assistant_cancel(GtkAssistant *, gpointer); + +/* Ferme l'assistant et déroule la procédure. */ +static void export_assistant_close(GtkAssistant *, GObject *); + + + +/* -------------------------- RECUPERATION DU CODE BINAIRE -------------------------- */ + + +/* Ajoute le panneau de consitution du code binaire. */ +static void register_bincode_panel(GtkAssistant *); + +/* Fournit si possible le code binaire utilisateur. */ +static bool extract_shell_code(GObject *, bin_t **, off_t *); + +/* Réagit à une modification du code binaire. */ +static void on_bincode_changed(GtkTextBuffer *, GObject *); + + + +/* ----------------------- DEFINITION DE L'ARCHITECTURE VISEE ----------------------- */ + + +/* Ajoute le panneau de spécification de l'architecture. */ +static void register_archi_panel(GtkAssistant *); + + + + + +/* -------------------- DEFINITION DES REGLAGES DE L'EXPORTATION -------------------- */ + + +/* Ajoute le panneau de choix du type de sortie. */ +static void register_output_panel(GtkAssistant *); + +/* Réagit un changement du nom de fichier pour l'exportation. */ +static void on_export_filename_changed(GtkEntry *, GtkAssistant *); + +/* Sélectionne ou non un nouveau fichier de sortie. */ +static void on_filename_browsing_clicked(GtkButton *, GObject *); + + + +/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */ + + +/* Ajoute le panneau de sélection du contenu à exporter. */ +static void register_content_panel(GtkAssistant *); + + + +/* ---------------------------------------------------------------------------------- */ +/* PARTIE PRINCIPALE DE L'ASSISTANT */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : project = projet courant à compléter. * +* parent = fenêtre principale de l'éditeur. * +* * +* Description : Crée et affiche un assistant d'ajout de binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void run_shellcode_assistant(GStudyProject *project, GtkWindow *parent) +{ + GtkWidget *assistant; /* Fenêtre à afficher */ + GObject *ref; /* Espace de référencement */ + + assistant = gtk_assistant_new(); + gtk_widget_set_size_request(assistant, 450, 300); + gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(assistant), _("Shellcode assistant")); + + gtk_window_set_modal(GTK_WINDOW(assistant), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(assistant), parent); + + ref = G_OBJECT(assistant); + //g_object_set_data(ref, "binary", binary); + + register_bincode_panel(GTK_ASSISTANT(assistant)); + register_archi_panel(GTK_ASSISTANT(assistant)); + //register_output_panel(GTK_ASSISTANT(assistant)); + //register_content_panel(GTK_ASSISTANT(assistant)); + + g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL); + g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref); + + gtk_widget_show_all(assistant); + +} + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* data = adresse non utilisée ici. * +* * +* Description : Ferme l'assistant sans dérouler la procédure. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void export_assistant_cancel(GtkAssistant *assistant, gpointer data) +{ + gtk_widget_destroy(GTK_WIDGET(assistant)); + +} + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* ref = adresse de l'espace de référencement global. * +* * +* Description : Ferme l'assistant et déroule la procédure. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void export_assistant_close(GtkAssistant *assistant, GObject *ref) +{ + GLoadedBinary *binary; /* Binaire chargé à parcourir */ + GExeFormat *format; /* Format du binaire */ + GRenderingOptions *options; /* Options d'exportation */ + GtkToggleButton *checkbutton; /* Coche à retrouver */ + gboolean state; /* Valeur à prendre en compte */ + GtkEntry *entry; /* Zone de saisie */ + const gchar *filename; /* Chemin d'accès du fichier */ + + //binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); + + format = g_loaded_binary_get_format(binary); + options = g_rendering_options_new(format); + + /* Eléments à afficher */ + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr")); + state = gtk_toggle_button_get_active(checkbutton); + g_rendering_options_show_address(options, MRD_BLOCK, state); + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code")); + state = gtk_toggle_button_get_active(checkbutton); + g_rendering_options_show_code(options, MRD_BLOCK, state); + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "assembly_code")); + state = gtk_toggle_button_get_active(checkbutton); + + /* Programmation de la tâche */ + /* + entry = GTK_ENTRY(g_object_get_data(ref, "filename")); + filename = gtk_entry_get_text(entry); + + export = g_delayed_export_new(filename, binary, options); + + queue = get_work_queue(); + g_work_queue_schedule_work(queue, G_DELAYED_WORK(export)); + */ + gtk_widget_destroy(GTK_WIDGET(assistant)); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* RECUPERATION DU CODE BINAIRE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de consitution du code binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_bincode_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal */ + GtkWidget *scrolledwindow; /* Support avec défilement */ + GtkWidget *textview; /* Zone de texte */ + GtkWidget *label; /* Etiquette du bilan */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Réception du code */ + + label = qck_create_label(NULL, NULL, _("Paste here the raw C code containing the shellcode.\r\n" + "All content between quotes will be extracted.")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + scrolledwindow = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow); + gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); + + textview = qck_create_textview(G_OBJECT(assistant), "bincode", + G_CALLBACK(on_bincode_changed), assistant); + gtk_container_add(GTK_CONTAINER(scrolledwindow), textview); + + /* Validation */ + + label = qck_create_label(G_OBJECT(assistant), "status", _("No code")); + gtk_widget_set_halign(label, GTK_ALIGN_CENTER); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + /* Intégration */ + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Code")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_INTRO); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + +} + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global. * +* code = code binaire recomposé. [OUT] * +* length = taille de ce code. [OUT] * +* * +* Description : Fournit si possible le code binaire utilisateur. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool extract_shell_code(GObject *ref, bin_t **code, off_t *length) +{ + bool result; /* Bilan à retourner */ + GtkTextView *textview; /* Zone de texte */ + GtkTextBuffer *buffer; /* Tampon gérant le texte */ + GtkTextIter start; /* Début de la zone à traiter */ + GtkTextIter end; /* Fin de la zone à traiter */ + gchar *bincode; /* Code à filtrer */ + regex_t preg; /* Recherche d'un bloc */ + int ret; /* Bilan d'un appel */ + regoff_t pos; /* Point de départ de lecture */ + regmatch_t pmatch[3]; /* Localisation de trouvailles */ + regoff_t i; /* Boucle de parcours */ + char hex[3]; /* Valeur hexadécimale */ + + result = true; + + *code = NULL; + *length = 0; + + /* Détermination des cibles */ + + ret = regcomp(&preg, "[^'\"]*(['\"])([^'\"]*)\\1", REG_EXTENDED); + if (ret != 0) return false; + + /* Constitution du contexte */ + + textview = GTK_TEXT_VIEW(g_object_get_data(ref, "bincode")); + buffer = gtk_text_view_get_buffer(textview); + + gtk_text_buffer_get_bounds(buffer, &start, &end); + bincode = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); + + /* Recomposition du code */ + + pos = 0; + + ret = regexec(&preg, &bincode[pos], 3, pmatch, 0); + + while (ret != REG_NOMATCH && result) + { + bincode[pos + pmatch[2].rm_eo] = '\0'; + + for (i = pos + pmatch[2].rm_so; i < (pos + pmatch[2].rm_eo) && result; i++) + { + *code = (bin_t *)realloc(*code, ++(*length) * sizeof(bin_t)); + + switch (bincode[i]) + { + case '\\': + if (++i >= (pos + pmatch[2].rm_eo)) + { + result = false; + break; + } + + if (bincode[i] == 'x') + { + if (++i >= (pos + pmatch[2].rm_eo)) + { + result = false; + break; + } + + if ((i + 2) > (pos + pmatch[2].rm_eo)) + { + result = false; + break; + } + + memcpy(hex, &bincode[i], 2); + hex[2] = '\0'; + + (*code)[*length - 1] = strtol(hex, NULL, 16); + + i++; + + } + else (*code)[*length - 1] = bincode[i]; + + break; + + default: + (*code)[*length - 1] = bincode[i]; + break; + + } + + } + + if (result) + { + pos += pmatch[2].rm_eo + 1; + ret = regexec(&preg, &bincode[pos], 3, pmatch, 0); + } + + } + + g_free(bincode); + + if (!result && *code != NULL) + { + *length = 0; + free(*code); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : textbuffer = composant concerné par l'action. * +* ref = espace de référencement global. * +* * +* Description : Réagit à une modification du code binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_bincode_changed(GtkTextBuffer *textbuffer, GObject *ref) +{ + bin_t *code; /* Code binaire extrait */ + off_t length; /* Taille des données lues */ + bool status; /* Bilan de l'extraction */ + GtkLabel *label; /* Etiquette à mettre à jour */ + char *markup; /* Affichage étendu */ + GtkAssistant *assistant; /* Assistant en première ligne */ + gint index; /* Indice de la page courante */ + GtkWidget *page; /* Cotenu de la page courante */ + + status = extract_shell_code(ref, &code, &length); + + label = GTK_LABEL(g_object_get_data(ref, "status")); + + if (!status) + gtk_label_set_markup(label, _("Error while decoding")); + + else if (length > 0) + { + markup = g_markup_printf_escaped(_("Decoding OK (" + OFF_FMT " %s)"), + OFF_CAST(length), length > 1 ? _("bytes") : _("byte")); + gtk_label_set_markup(label, markup); + g_free(markup); + } + + else + { + gtk_label_set_markup(label, _("No code")); + status = false; + } + + if (length > 0) + free(code); + + /* Poursuite des opérations ? */ + + assistant = GTK_ASSISTANT(ref); + + index = gtk_assistant_get_current_page(assistant); + page = gtk_assistant_get_nth_page(assistant, index); + + gtk_assistant_set_page_complete(assistant, page, status); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION DE L'ARCHITECTURE VISEE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de spécification de l'architecture. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_archi_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal */ + GtkWidget *label; /* Etiquette d'indication */ + GtkWidget *combobox; /* Sélection du format */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Choix de l'architecture */ + + label = qck_create_label(NULL, NULL, _("Architecture:")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + combobox = qck_create_combobox(G_OBJECT(assistant), "archi", G_CALLBACK(NULL), NULL); + gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, FALSE, 0); + + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("x86")); + + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + + /* Taille de registre */ + + label = qck_create_label(NULL, NULL, _("Register size:")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + combobox = qck_create_combobox(G_OBJECT(assistant), "rsize", G_CALLBACK(NULL), NULL); + gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, FALSE, 0); + + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("32 bits")); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("16 bits")); + + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + + /* Intégration */ + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Architecture")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONFIRM); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + +} + + + + + + + + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION DES REGLAGES DE L'EXPORTATION */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de choix du type de sortie. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_output_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal #1 */ + GtkWidget *hbox; /* Support principal #2 */ + GtkWidget *label; /* Etiquette d'indication */ + GtkWidget *combobox; /* Sélection du format */ + GtkWidget *entry; /* Zone de saisie de texte */ + GtkWidget *button; /* Sélection de fichier */ + GLoadedBinary *binary; /* Binaire chargé à parcourir */ + const char *filename; /* Chemin d'accès par défaut */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Format de sortie */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("Format : ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + combobox = qck_create_combobox(NULL, NULL, G_CALLBACK(NULL), NULL); + gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0); + + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("Simple text")); + + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + + /* Fichier de sortie */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + label = qck_create_label(NULL, NULL, _("File : ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + + button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + /* Intégration */ + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Output")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONTENT); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + + /* Choix par défaut */ + /* + binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); + filename = g_loaded_binary_get_name(binary); + + gtk_entry_set_text(GTK_ENTRY(entry), filename); + gtk_entry_append_text(GTK_ENTRY(entry), ".txt"); + + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); + */ +} + + +/****************************************************************************** +* * +* Paramètres : entry = zone de texte dont le contenu vient de changer. * +* assistant = fenêtre affichée et référencement global. * +* * +* Description : Réagit un changement du nom de fichier pour l'exportation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant) +{ + const gchar *text; /* Texte saisi dans la zone */ + gint num; /* Etape courante */ + GtkWidget *page; /* Support de cette étape */ + + text = gtk_entry_get_text(entry); + + num = gtk_assistant_get_current_page(assistant); + page = gtk_assistant_get_nth_page(assistant, num); + + gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); + +} + + +/****************************************************************************** +* * +* Paramètres : button = bouton d'édition de la sélection. * +* ref = espace de référencement principal. * +* * +* Description : Sélectionne ou non un nouveau fichier de sortie. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_filename_browsing_clicked(GtkButton *button, GObject *ref) +{ + GtkWidget *dialog; /* Boîte à afficher */ + gchar *filename; /* Nom du fichier à intégrer */ + GtkEntry *entry; /* Zone de saisie à maj. */ + + dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref), + GTK_FILE_CHOOSER_ACTION_SAVE, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_ACCEPT, + NULL); + + entry = GTK_ENTRY(g_object_get_data(ref, "filename")); + gtk_file_chooser_set_filename(dialog, gtk_entry_get_text(entry)); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + gtk_entry_set_text(GTK_ENTRY(entry), filename); + + g_free(filename); + + } + + gtk_widget_destroy(dialog); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* SELECTION DU CONTENU A TRAITER */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : assistant = fenêtre à compléter et référencement global. * +* * +* Description : Ajoute le panneau de sélection du contenu à exporter. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void register_content_panel(GtkAssistant *assistant) +{ + GtkWidget *vbox; /* Support principal */ + GtkWidget *frame; /* Support avec encadrement */ + GtkWidget *subvbox; /* Support secondaire */ + GtkWidget *checkbutton; /* Coche pour une option */ + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + qck_set_margins(vbox, 8, 8, 8, 8); + gtk_widget_show(vbox); + + /* Lignes à traiter */ + + subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(subvbox); + + frame = qck_create_frame(_("Lines to process"), subvbox, 0, 0, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "prologue", _("Prologue"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "code", _("Code"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "comments", _("Comments"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + /* Eléments à afficher */ + + subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(subvbox); + + frame = qck_create_frame(_("Items to display"), subvbox, 0, 0, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + checkbutton = qck_create_check_button(G_OBJECT(assistant), "assembly_code", _("Assembly code"), NULL, NULL); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + + /* Intégration */ + + gtk_assistant_append_page(assistant, vbox); + gtk_assistant_set_page_title(assistant, vbox, _("Exported content")); + gtk_assistant_set_page_type(assistant, vbox, GTK_ASSISTANT_PAGE_CONFIRM); + + gtk_assistant_set_page_complete(assistant, vbox, TRUE); + +} + + + + + + + + + /* Choix par défaut */ + /* + binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); + filename = g_loaded_binary_get_name(binary); + + gtk_entry_set_text(GTK_ENTRY(entry), filename); + gtk_entry_append_text(GTK_ENTRY(entry), ".txt"); + + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); + */ + + + diff --git a/src/gui/dialogs/shellcode.h b/src/gui/dialogs/shellcode.h new file mode 100644 index 0000000..776b7a6 --- /dev/null +++ b/src/gui/dialogs/shellcode.h @@ -0,0 +1,37 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * export.h - prototypes pour l'assistant d'exportation de contenu binaire + * + * Copyright (C) 2011-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_EXPORT_H +#define _GUI_DIALOGS_EXPORT_H + + +#include "../../analysis/project.h" + + + +/* Crée et affiche un assistant d'ajout de binaire. */ +void run_shellcode_assistant(GStudyProject *, GtkWindow *); + + + +#endif /* _GUI_DIALOGS_EXPORT_H */ diff --git a/src/gui/dialogs/storage.c b/src/gui/dialogs/storage.c new file mode 100644 index 0000000..2e97ca2 --- /dev/null +++ b/src/gui/dialogs/storage.c @@ -0,0 +1,648 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * storage.c - définition des modes d'enregistrement pour binaires + * + * Copyright (C) 2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#include "storage.h" + + +#include + + +#include "../../analysis/db/protocol.h" +#include "../../common/cpp.h" +#include "../../gtkext/easygtk.h" + + + +/* --------------------------- CORPS PRINCIPAL DU CONTENU --------------------------- */ + + +/* Enumération des colonnes de la liste affichée */ +typedef enum StorageColumnTypes +{ + SCT_FEATURE_ID, /* Désignation interne */ + SCT_FEATURE_NAME, /* Désignation humaine */ + SCT_FEATURE_STORAGE, /* Type d'enregistrement */ + SCT_COMBO_COLUMN, /* Fonctionnement du combo */ + + SCT_COUNT + +} StorageColumnTypes; + + +/* Construit l'affichage en liste des enregistrements. */ +static GtkWidget *build_features_list(void); + +/* Sauvegarde l'état des enregistrements et clôt la fenêtre. */ +static void save_storage_params(GtkButton *, GObject *); + + + +/* ---------------------- NOM D'UTILISATEUR ASSOCIE AU BINAIRE ---------------------- */ + + +/* Charge le nom de l'utilisateur associé au binaire. */ +static void load_storage_username(GLoadedBinary *, GObject *); + +/* Sauvegarde le nom de l'utilisateur associé au binaire. */ +static void save_storage_username(GLoadedBinary *, GObject *); + + + +/* ----------------------- SERVEUR DISTANT ASSOCIE AU BINAIRE ----------------------- */ + + +/* Charge la définition du serveur distant associé au binaire. */ +static void load_storage_remote_server(GLoadedBinary *, GObject *); + +/* Sauvegarde la définition du serveur distant du binaire. */ +static void save_storage_remote_server(GLoadedBinary *, GObject *); + +/* Met à jour l'accès aux paramètres du serveur distant. */ +static void on_server_usage_toggle(GtkToggleButton *, GObject *); + + + +/* ------------------------- TRAITEMENT DES FONCTIONNALITES ------------------------- */ + + +/* Remplit la vue présentant les fonctionnalités à traiter. */ +static void fill_storage_features(GtkTreeView *, GLoadedBinary *); + +/* Sauvegarde les statuts d'enregistrement des fonctionnalités. */ +static void save_storage_features(GLoadedBinary *, GObject *); + +/* Met à jour un type d'enregistrement. */ +static void storage_combo_edited_cb(GtkCellRendererText *, const gchar *, const gchar *, GtkListStore *); + + + +/* ---------------------------------------------------------------------------------- */ +/* CORPS PRINCIPAL DU CONTENU */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Construit l'affichage en liste des enregistrements. * +* * +* Retour : Composant graphique prêt à emploi. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GtkWidget *build_features_list(void) +{ + GtkListStore *store; + GtkWidget *view; + GtkCellRenderer *renderer; + GtkListStore *combo_store; + GtkTreeIter iter; + + store = gtk_list_store_new(SCT_COUNT, + G_TYPE_UINT, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_UINT); + + view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + + g_object_unref(store); + + /* Intitulé des fonctionnalités */ + + renderer = gtk_cell_renderer_text_new(); + + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, + _("Features"), renderer, + "text", SCT_FEATURE_NAME, + NULL); + + /* Type d'enregistrement associé */ + + renderer = gtk_cell_renderer_combo_new(); + + combo_store = gtk_list_store_new(1, G_TYPE_STRING); + gtk_list_store_append(combo_store, &iter); + gtk_list_store_set(combo_store, &iter, 0, _("Local storage"), -1); + gtk_list_store_append(combo_store, &iter); + gtk_list_store_set(combo_store, &iter, 0, _("Remote storage"), -1); + gtk_list_store_append(combo_store, &iter); + gtk_list_store_set(combo_store, &iter, 0, _("Local storage with remote access"), -1); + + g_object_set(G_OBJECT(renderer), "model", combo_store, + "editable", TRUE, "has-entry", FALSE, NULL); + g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(storage_combo_edited_cb), store); + + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, + _("Storage"), renderer, + "text", SCT_FEATURE_STORAGE, + "text-column", SCT_COMBO_COLUMN, + NULL); + + return view; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* parent = fenêtre principale de l'éditeur. * +* * +* Description : Propose une définition des propriétés d'enregistrement. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkWidget *content; /* Zone principale de la boîte */ + GtkWidget *vbox; /* Support à construire #1 */ + GtkWidget *frame; /* Support avec encadrement */ + GtkWidget *hbox; /* Support à construire #2 */ + GtkWidget *label; /* Etiquette d'indication */ + GtkWidget *entry; /* Zone de saisie de texte */ + GtkWidget *checkbutton; /* Activation de la distance */ + GtkWidget *subvbox; /* Support à construire #3 */ + GtkWidget *scrolledwindow; /* Zone de défilement */ + GtkWidget *treeview; /* Liste des fonctionnalités */ + + result = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(result), _("Storage")); + gtk_widget_set_size_request(result, 400, 360); + gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); + gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); + + gtk_window_set_modal(GTK_WINDOW(result), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(result), parent); + + g_object_ref(G_OBJECT(binary)); + g_object_set_data_full(G_OBJECT(result), "binary", binary, g_object_unref); + + content = gtk_dialog_get_content_area(GTK_DIALOG(result)); + gtk_widget_show(content); + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(content), vbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); + + /* Définition de l'identité de l'utilisateur */ + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); + gtk_widget_show(hbox); + + frame = qck_create_frame(_("Identity"), hbox, 0, 0, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); + + label = qck_create_label(NULL, NULL, _("Username: ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(result), "username", NULL); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + + /* Définition du serveur distant */ + + subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_show(subvbox); + + frame = qck_create_frame(_("Server to contact"), subvbox, 0, 0, 12, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); + + checkbutton = qck_create_check_button(G_OBJECT(result), "use_remote", + _("Use a remote server:"), + G_CALLBACK(on_server_usage_toggle), result); + gtk_widget_show(checkbutton); + gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(subvbox), hbox, TRUE, TRUE, 0); + + label = qck_create_label(G_OBJECT(result), "host", _("Host: ")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(result), "remote_host", NULL); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + + label = qck_create_label(G_OBJECT(result), "port", _("Port:")); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + entry = qck_create_entry(G_OBJECT(result), "remote_port", NULL); + gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); + + /* Affichage des propriétés */ + + scrolledwindow = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow); + gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); + + treeview = build_features_list(); + g_object_set_data(G_OBJECT(result), "treeview", treeview); + gtk_widget_show(treeview); + gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); + + /* Zone de contrôle */ + + gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); + gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); + + /* Chargement des données actuelles */ + + load_storage_username(binary, G_OBJECT(result)); + + load_storage_remote_server(binary, G_OBJECT(result)); + + fill_storage_features(GTK_TREE_VIEW(treeview), binary); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : button = bouton 'OK'. * +* ref = espace de référencement principal. * +* * +* Description : Sauvegarde l'état des enregistrements et clôt la fenêtre. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void save_storage_params(GtkButton *button, GObject *ref) +{ + GLoadedBinary *binary; /* Binaire en cours d'édition */ + + binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); + + save_storage_username(binary, ref); + + save_storage_remote_server(binary, ref); + + save_storage_features(binary, ref); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* NOM D'UTILISATEUR ASSOCIE AU BINAIRE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* ref = espace de référencement global. * +* * +* Description : Charge le nom de l'utilisateur associé au binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void load_storage_username(GLoadedBinary *binary, GObject *ref) +{ + GtkEntry *entry; /* Zone de saisie de texte */ + + entry = GTK_ENTRY(g_object_get_data(ref, "username")); + + gtk_entry_set_text(entry, g_loaded_binary_get_username(binary)); + +} + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* ref = espace de référencement global. * +* * +* Description : Sauvegarde le nom de l'utilisateur associé au binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void save_storage_username(GLoadedBinary *binary, GObject *ref) +{ + GtkEntry *entry; /* Zone de saisie de texte */ + const gchar *text; /* Texte à récupérer */ + + entry = GTK_ENTRY(g_object_get_data(ref, "username")); + text = gtk_entry_get_text(entry); + + g_loaded_binary_set_username(binary, text); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* SERVEUR DISTANT ASSOCIE AU BINAIRE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* ref = espace de référencement global. * +* * +* Description : Charge la définition du serveur distant associé au binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void load_storage_remote_server(GLoadedBinary *binary, GObject *ref) +{ + const char *host; /* Hôte à contacter */ + unsigned short port; /* Port de connexion */ + char port_str[sizeof(XSTR(USHRT_MAX)) + 1]; /* Version chaînée */ + bool use_remote; /* Utilisation du serveur ? */ + GtkEntry *entry; /* Zone de saisie de texte */ + GtkToggleButton *checkbutton; /* Activation de la distance */ + + use_remote = g_loaded_binary_get_remote_server(binary, &host, &port); + sprintf(port_str, "%hu", port); + + entry = GTK_ENTRY(g_object_get_data(ref, "remote_host")); + + gtk_entry_set_text(entry, host); + + entry = GTK_ENTRY(g_object_get_data(ref, "remote_port")); + + gtk_entry_set_text(entry, port_str); + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "use_remote")); + + gtk_toggle_button_set_active(checkbutton, !use_remote); + gtk_toggle_button_set_active(checkbutton, use_remote); + +} + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* ref = espace de référencement global. * +* * +* Description : Sauvegarde la définition du serveur distant du binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void save_storage_remote_server(GLoadedBinary *binary, GObject *ref) +{ + GtkEntry *entry; /* Zone de saisie de texte */ + const gchar *text; /* Texte à récupérer */ + unsigned short port; /* Port de connexion */ + GtkToggleButton *checkbutton; /* Activation de la distance */ + + entry = GTK_ENTRY(g_object_get_data(ref, "remote_port")); + text = gtk_entry_get_text(entry); + port = atoi(text); + + entry = GTK_ENTRY(g_object_get_data(ref, "remote_host")); + text = gtk_entry_get_text(entry); + + checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "use_remote")); + + g_loaded_binary_set_remote_server(binary, text, port, + gtk_toggle_button_get_active(checkbutton)); + +} + + +/****************************************************************************** +* * +* Paramètres : button = oche dont le status vient de changer. * +* ref = espace de référencement global. * +* * +* Description : Met à jour l'accès aux paramètres du serveur distant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_server_usage_toggle(GtkToggleButton *button, GObject *ref) +{ + gboolean state; /* Etat du bouton courant */ + GtkWidget *widget; /* Element dont l'accès change */ + + state = gtk_toggle_button_get_active(button); + + widget = GTK_WIDGET(g_object_get_data(ref, "host")); + if (widget != NULL) + gtk_widget_set_sensitive(widget, state); + + widget = GTK_WIDGET(g_object_get_data(ref, "remote_host")); + if (widget != NULL) + gtk_widget_set_sensitive(widget, state); + + widget = GTK_WIDGET(g_object_get_data(ref, "port")); + if (widget != NULL) + gtk_widget_set_sensitive(widget, state); + + widget = GTK_WIDGET(g_object_get_data(ref, "remote_port")); + if (widget != NULL) + gtk_widget_set_sensitive(widget, state); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* TRAITEMENT DES FONCTIONNALITES */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : treeview = vue à compléter. * +* binary = binaire à manipuler. * +* * +* Description : Remplit la vue présentant les fonctionnalités à traiter. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void fill_storage_features(GtkTreeView *treeview, GLoadedBinary *binary) +{ + GtkListStore *store; /* Gestionnaire de liste */ + DBFeatures i; /* Boucle de parcours */ + DBStorage storage; /* Type d'enregistrement */ + char *human_feature; /* Description humaine #1 */ + char *human_value; /* Description humaine #2 */ + GtkTreeIter iter; /* Point d'insertion */ + + store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); + + for (i = 0; i < DBF_COUNT; i++) + { + storage = g_loaded_binary_get_storage(binary, i); + + switch (i) + { + case DBF_COMMENTS: + human_feature = _("Comments"); + break; + case DBF_DISPLAY_SWITCHERS: + human_feature = _("Segments display"); + break; + case DBF_BOOKMARKS: + human_feature = _("Bookmarks"); + break; + default: /* Pour GCC... */ + break; + } + + switch (storage) + { + case DBS_ALL_LOCAL: + human_value = _("Local storage"); + break; + case DBS_ALL_REMOTE: + human_value = _("Remote storage"); + break; + case DBS_LOCAL_AND_REMOTE: + human_value = _("Local storage with remote access"); + break; + } + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + SCT_FEATURE_ID, i, + SCT_FEATURE_NAME, human_feature, + SCT_FEATURE_STORAGE, human_value, + -1); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : binary = binaire chargé en mémoire à traiter. * +* ref = espace de référencement global. * +* * +* Description : Sauvegarde les statuts d'enregistrement des fonctionnalités. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void save_storage_features(GLoadedBinary *binary, GObject *ref) +{ + GtkTreeView *treeview; /* Liste des fonctionnalités */ + GtkTreeModel *store; /* Gestionnaire de liste */ + GtkTreeIter iter; /* Point de lecture */ + gboolean valid; /* Point courant valide ? */ + DBFeatures feature; /* Fonctionnalité traitée */ + char *human_value; /* Description humaine */ + DBStorage storage; /* Type d'enregistrement */ + + treeview = GTK_TREE_VIEW(g_object_get_data(ref, "treeview")); + store = GTK_TREE_MODEL(gtk_tree_view_get_model(treeview)); + + for (valid = gtk_tree_model_get_iter_first(store, &iter); + valid; + valid = gtk_tree_model_iter_next(store, &iter)) + { + gtk_tree_model_get(store, &iter, + SCT_FEATURE_ID, &feature, + SCT_FEATURE_STORAGE, &human_value, + -1); + + if (g_strcmp0(human_value, _("Remote storage")) == 0) + storage = DBS_ALL_REMOTE; + else if (g_strcmp0(human_value, _("Local storage with remote access")) == 0) + storage = DBS_LOCAL_AND_REMOTE; + else + storage = DBS_ALL_LOCAL; + + g_loaded_binary_set_storage(binary, feature, storage); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : cell = cellule du tableau à mettre à jour. * +* path = chemin d'accès à l'élément concerné. * +* value = nouvelle valeur à prendre en compte. * +* store = gestionnaire de liste sur lequel s'appuyer. * +* * +* Description : Met à jour un type d'enregistrement. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void storage_combo_edited_cb(GtkCellRendererText *cell, const gchar *path, const gchar *value, GtkListStore *store) +{ + GtkTreePath *tpath; /* Chemin instancié */ + GtkTreeIter iter; /* Point d'accès pour la maj */ + + tpath = gtk_tree_path_new_from_string(path); + + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, tpath)) + gtk_list_store_set(store, &iter, SCT_FEATURE_STORAGE, value, -1); + + gtk_tree_path_free(tpath); + +} diff --git a/src/gui/dialogs/storage.h b/src/gui/dialogs/storage.h new file mode 100644 index 0000000..5cca73b --- /dev/null +++ b/src/gui/dialogs/storage.h @@ -0,0 +1,40 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * storage.h - prototypes pour la définition des modes d'enregistrement pour binaires + * + * Copyright (C) 2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _GUI_DIALOGS_STORAGE_H +#define _GUI_DIALOGS_STORAGE_H + + +#include + + +#include "../../analysis/binary.h" + + + +/* Propose une définition des propriétés d'enregistrement. */ +GtkWidget *create_storage_dialog(GLoadedBinary *, GtkWindow *); + + + +#endif /* _GUI_DIALOGS_STORAGE_H */ diff --git a/src/gui/editor.c b/src/gui/editor.c new file mode 100644 index 0000000..1742596 --- /dev/null +++ b/src/gui/editor.c @@ -0,0 +1,446 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * editor.c - fenêtre principale de l'interface graphique + * + * Copyright (C) 2008-2013 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 + */ + + +#include "editor.h" + + +#include + + +#include "status.h" +#include "menus/menubar.h" +#include "panels/panel.h" +#include "tb/portions.h" +#include "tb/source.h" +#include "../analysis/project.h" +#include "../core/params.h" +#include "../gtkext/easygtk.h" +#include "../gtkext/gtkdockstation.h" +#include "../gtkext/support.h" + + + + + +/* Met en place la liste des icônes de l'éditeur. */ +static GList *build_editor_icons_list(void); + + +/* Construit la fenêtre de l'éditeur. */ +GtkWidget *create_editor(void); + +/* Quitte le programme en sortie de la boucle de GTK. */ +static gboolean on_delete_editor(GtkWidget *, GdkEvent *, gpointer); + +/* Quitte le programme en sortie de la boucle de GTK. */ +static void on_destroy_editor(GtkWidget *, gpointer); + + + + + + +/* Réagit au changement d'onglet d'un panneau quelconque. */ +static void on_dock_item_switch(GtkDockStation *, GtkWidget *, GObject *); + + + + + + +/* ------------------------ INTEGRATION DE LA BARRE D'OUTILS ------------------------ */ + + +/* Construit la barre d'outils de l'éditeur. */ +static GtkWidget *build_editor_toolbar(GObject *); + + + + + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Met en place la liste des icônes de l'éditeur. * +* * +* Retour : Liste d'images dimensionnées. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GList *build_editor_icons_list(void) +{ + GList *result; /* Liste à retourner */ + GdkPixbuf *pixbuf; /* Image chargée en mémoire */ + + result = NULL; + + pixbuf = get_pixbuf_from_file("chrysalide-32.png"); + if (pixbuf != NULL) + result = g_list_append(result, pixbuf); + + pixbuf = get_pixbuf_from_file("chrysalide-64.png"); + if (pixbuf != NULL) + result = g_list_append(result, pixbuf); + + pixbuf = get_pixbuf_from_file("chrysalide-128.png"); + if (pixbuf != NULL) + result = g_list_append(result, pixbuf); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Construit la fenêtre de l'éditeur. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_editor(void) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + bool hide; /* Cachette de la barre ? */ + bool maximized; /* Affichage en plein écran ? */ + GList *icons; /* Liste d'images dimensionnées*/ + GObject *ref; /* Version de référence */ + GEditorItem *editem; /* Menus réactifs principaux */ + GtkWidget *menuboard; /* Barre de menus principale */ + + GtkWidget *toolbar; /* Barre d'outils */ + + GtkWidget *vbox1; + + + GtkAccelGroup *accgroup; + + + GtkWidget *widget; /* Composant à intégrer */ + + + + + result = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request(result, 1024, 800); + gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); + gtk_container_set_border_width(GTK_CONTAINER(result), 4); + gtk_window_set_title(GTK_WINDOW(result), _("Chrysalide")); + + g_generic_config_get_value(get_main_configuration(), MPK_TITLE_BAR, &hide); + gtk_window_set_hide_titlebar_when_maximized(GTK_WINDOW(result), hide); + + g_generic_config_get_value(get_main_configuration(), MPK_MAXIMIZED, &maximized); + gtk_window_maximize(GTK_WINDOW(result)); + + icons = build_editor_icons_list(); + gtk_window_set_icon_list(GTK_WINDOW(result), icons); + g_list_free_full(icons, (GDestroyNotify)g_object_unref); + + g_signal_connect(G_OBJECT(result), "delete-event", G_CALLBACK(on_delete_editor), NULL); + g_signal_connect(G_OBJECT(result), "destroy", G_CALLBACK(on_destroy_editor), NULL); + + ref = G_OBJECT(result); + + accgroup = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(result), accgroup); + + + + vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_widget_show(vbox1); + gtk_container_add(GTK_CONTAINER(result), vbox1); + + + /* Intégration des menus */ + + editem = g_menu_bar_new(ref, accgroup); + register_editor_item(editem); + + menuboard = g_editor_item_get_widget(editem); + gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0); + + + + + + + + /* Barre d'outils */ + + toolbar = build_editor_toolbar(G_OBJECT(result)); + gtk_box_pack_start(GTK_BOX(vbox1), toolbar, FALSE, FALSE, 0); + + do + { + GtkWidget *support; + + support = init_panels2(G_CALLBACK(on_dock_item_switch), ref); + gtk_box_pack_start(GTK_BOX(vbox1), support, TRUE, TRUE, 0); + + load_main_panels(ref); + + + } while(0); + + + + + /* Barre de statut générale */ + + editem = g_status_info_new(ref); + register_editor_item(editem); + + widget = g_editor_item_get_widget(editem); + gtk_box_pack_start(GTK_BOX(vbox1), widget, FALSE, FALSE, 0); + + + + + + + + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : widget = fenêtre de l'éditeur de préférences. * +* event = informations liées à l'événement. * +* data = adresse non utilisée ici. * +* * +* Description : Quitte le programme en sortie de la boucle de GTK. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gboolean result; /* Continuation à retourner */ + GStudyProject *project; /* Projet courant */ + GtkWidget *dialog; /* Boîte à afficher */ + + result = FALSE; + + project = get_current_project(); + if (project == NULL) goto ode_no_project; + + if (g_study_project_get_filename(project) == NULL) + { + dialog = gtk_message_dialog_new(GTK_WINDOW(widget), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("The current project will be lost. Do you you want to save it ?")); + + gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Yes"), GTK_RESPONSE_YES); + gtk_dialog_add_button(GTK_DIALOG(dialog), _("_No"), GTK_RESPONSE_NO); + gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Cancel"), GTK_RESPONSE_CANCEL); + + switch (gtk_dialog_run(GTK_DIALOG(dialog))) + { + case GTK_RESPONSE_YES: + //mcb_file_save_project_as(NULL, widget); /* FIXME */ + break; + + case GTK_RESPONSE_NO: + break; + + case GTK_RESPONSE_CANCEL: + result = TRUE; + break; + + } + + gtk_widget_destroy(dialog); + + } + + ode_no_project: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : widget = fenêtre de l'éditeur de préférences. * +* event = informations liées à l'événement. * +* data = adresse non utilisée ici. * +* * +* Description : Quitte le programme en sortie de la boucle de GTK. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_destroy_editor(GtkWidget *widget, gpointer data) +{ + GStudyProject *project; /* Projet courant */ + + project = get_current_project(); + if (project != NULL) g_object_unref(G_OBJECT(project)); + + /* Fermeture propre */ + + /* ... */ + + gtk_main_quit(); + +} + + + + + + + + + + + + + + + + + + + + + + + + + +/****************************************************************************** +* * +* Paramètres : station = panneau de support des éléments concerné. * +* item = nouvel élément présenté à l'affichage. * +* ref = adresse de l'espace de référencement global. * +* * +* Description : Réagit au changement d'onglet d'un panneau quelconque. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, GObject *ref) +{ + GLoadedBinary *old_binary; /* Ancien binaire édité */ + GLoadedBinary *binary; /* Binaire en cours d'édition */ + + if (GTK_IS_SCROLLED_WINDOW(widget)) + widget = gtk_bin_get_child(GTK_BIN(widget)); + + if (GTK_IS_VIEWPORT(widget)) + widget = gtk_bin_get_child(GTK_BIN(widget)); + + if (GTK_IS_VIEW_PANEL(widget)) + { + /* Changement de binaire ? */ + + old_binary = G_LOADED_BINARY(g_object_get_data(ref, "current_binary")); + binary = gtk_view_panel_get_binary(GTK_VIEW_PANEL(widget)); + + if (old_binary != binary) + { + //notify_panels_of_binary_change(binary); + change_editor_items_current_binary(ref, binary); + } + + change_editor_items_current_view(ref, GTK_VIEW_PANEL(widget)); + + //notify_panels_of_view_change(GTK_VIEW_PANEL(widget), false); + + } + +} + + + + + + + + + + +/* ---------------------------------------------------------------------------------- */ +/* INTEGRATION DE LA BARRE D'OUTILS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global. * +* * +* Description : Construit la barre d'outils de l'éditeur. * +* * +* Retour : Adresse du composant mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GtkWidget *build_editor_toolbar(GObject *ref) +{ + GtkWidget *result; /* Support à retourner */ + GEditorItem *item; /* Elément de barre d'outils */ + + result = gtk_toolbar_new(); + gtk_widget_show(result); + g_object_set_data(ref, "toolbar", result); + + + item = create_source_tb_item(ref); + register_editor_item(item); + + item = create_portions_tb_item(ref); + register_editor_item(item); + + + return result; + +} diff --git a/src/gui/editor.h b/src/gui/editor.h new file mode 100644 index 0000000..c9feb67 --- /dev/null +++ b/src/gui/editor.h @@ -0,0 +1,38 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * editor.h - prototypes pour la fenêtre principale de l'interface graphique + * + * Copyright (C) 2009-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 _EDITOR_H +#define _EDITOR_H + + +#include + + + +/* Construit la fenêtre de l'éditeur. */ +GtkWidget *create_editor(void); + + + +#endif /* _EDITOR_H */ diff --git a/src/gui/menus/Makefile.am b/src/gui/menus/Makefile.am index d932141..014f098 100644 --- a/src/gui/menus/Makefile.am +++ b/src/gui/menus/Makefile.am @@ -14,8 +14,7 @@ libguimenus_la_SOURCES = \ libguimenus_la_LDFLAGS = -libguimenus_la_LIBADD = $(LIBINTL) \ - ../../dialogs/libdialogs.la +libguimenus_la_LIBADD = $(LIBINTL) AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c index c93ad57..8058799 100644 --- a/src/gui/menus/binary.c +++ b/src/gui/menus/binary.c @@ -29,9 +29,9 @@ #include "../editem-int.h" -#include "../../dialogs/export.h" -#include "../../dialogs/gotox.h" -#include "../../dialogs/storage.h" +#include "../dialogs/export.h" +#include "../dialogs/gotox.h" +#include "../dialogs/storage.h" #include "../../gtkext/easygtk.h" diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index bc55478..9e4077d 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -31,11 +31,11 @@ #include +#include "../dialogs/bookmark.h" +#include "../dialogs/goto.h" +#include "../dialogs/gotox.h" #include "../../analysis/db/items/switcher.h" #include "../../arch/target.h" -#include "../../dialogs/bookmark.h" -#include "../../dialogs/goto.h" -#include "../../dialogs/gotox.h" #include "../../gtkext/easygtk.h" #include "../../gtkext/gtkbufferview.h" diff --git a/src/gui/menus/help.c b/src/gui/menus/help.c index 45e68a3..321311c 100644 --- a/src/gui/menus/help.c +++ b/src/gui/menus/help.c @@ -28,7 +28,7 @@ #include -#include "../../dialogs/about.h" +#include "../dialogs/about.h" #include "../../gtkext/easygtk.h" diff --git a/src/gui/menus/project.c b/src/gui/menus/project.c index a85e78f..f4f6233 100644 --- a/src/gui/menus/project.c +++ b/src/gui/menus/project.c @@ -32,8 +32,8 @@ #include "../editem-int.h" +#include "../dialogs/shellcode.h" #include "../../analysis/contents/file.h" -#include "../../dialogs/shellcode.h" #include "../../gtkext/easygtk.h" diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c index ff6bf05..a6ff7ca 100644 --- a/src/gui/panels/strings.c +++ b/src/gui/panels/strings.c @@ -29,9 +29,9 @@ #include "panel-int.h" +#include "../dialogs/gotox.h" #include "../../common/extstr.h" #include "../../core/params.h" -#include "../../dialogs/gotox.h" #include "../../gtkext/easygtk.h" #include "../../gtkext/gtkdockable-int.h" diff --git a/src/main.c b/src/main.c index 2ab0c5c..67feabc 100644 --- a/src/main.c +++ b/src/main.c @@ -29,7 +29,6 @@ #include #include -#include "editor.h" #include "analysis/project.h" #include "analysis/db/server.h" #include "core/core.h" @@ -37,6 +36,7 @@ #include "glibext/delayed.h" #include "glibext/gbinportion.h" #include "gtkext/theme.h" +#include "gui/editor.h" #include "plugins/pglist.h" -- cgit v0.11.2-87-g4458