diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-10-28 15:59:12 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-10-28 15:59:12 (GMT) |
commit | c3aba0893c29cc098c029306fd7a4c8c1fa2eee2 (patch) | |
tree | 49432db1af3115758a216ac5bfd92d5935929858 /src/gui/panels/strings.c | |
parent | 55866b34f5cff022a465d58f808450f25f354218 (diff) |
Updated the code of the old panel and displayed found strings again.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@276 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gui/panels/strings.c')
-rw-r--r-- | src/gui/panels/strings.c | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c new file mode 100644 index 0000000..605a700 --- /dev/null +++ b/src/gui/panels/strings.c @@ -0,0 +1,392 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * strings.c - panneau d'affichage des chaînes de caractères + * + * Copyright (C) 2008-2012 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "strings.h" + + +#include <inttypes.h> + + +#include "panel-int.h" +#include "../../common/extstr.h" +#include "../../gtkext/easygtk.h" + + + +/* -------------------------- PARTIE PRINCIPALE DU PANNEAU -------------------------- */ + + +/* Panneau d'aperçu de graphiques (instance) */ +struct _GStringsPanel +{ + GPanelItem parent; /* A laisser en premier */ + + GtkTreeView *treeview; /* Composant d'affichage */ + GtkTreeStore *store; /* Modèle de gestion */ + + GLoadedBinary *binary; /* Binaire à prendre en compte */ + + GtkWidget *menubar; /* Support pour l'édition */ + +}; + + +/* Panneau d'aperçu de graphiques (classe) */ +struct _GStringsPanelClass +{ + GPanelItemClass parent; /* A laisser en premier */ + +}; + + +/* Colonnes de la liste des symboles */ +typedef enum _StringsColumn +{ + STC_ADDRESS, /* Adresse mémoire du symbole */ + STC_STRING, /* Désignation humaine */ + STC_RAW, /* Données non retouchées */ + + STC_COUNT /* Nombre de colonnes */ + +} StringsColumn; + + +/* Réagit à un changement d'affichage principal de contenu. */ +static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *); + + + +/* ------------------------- GESTIONS DES MENUS CONTEXTUELS ------------------------- */ + + +/* Affiche le menu d'édition propre aux chaînes trouvées. */ +static gboolean on_strings_button_press_event(GtkTreeView *, GdkEventButton *, GStringsPanel *); + +/* Réagit avec le menu "--- -> Copier". */ +static void mcb_strings_copy(GtkMenuItem *, GtkTreeView *); + + + +/* ---------------------------------------------------------------------------------- */ +/* PARTIE PRINCIPALE DU PANNEAU */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type définit pour un panneau d'aperçu de graphiques. */ +G_DEFINE_TYPE(GStringsPanel, g_strings_panel, G_TYPE_PANEL_ITEM); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des panneaux d'aperçu de graphiques. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_strings_panel_class_init(GStringsPanelClass *klass) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : panel = instance à initialiser. * +* * +* Description : Initialise une instance de panneau d'aperçu de graphiques. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_strings_panel_init(GStringsPanel *panel) +{ + GEditorItem *base; /* Version basique d'instance */ + GObject *ref; /* Espace de référencement */ + GtkWidget *scrollwnd; /* Support défilant */ + GtkTreeStore *store; /* Modèle de gestion */ + GtkWidget *treeview; /* Affichage de la liste */ + GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ + GtkTreeViewColumn *column; /* Colonne de la liste */ + GtkWidget *submenuitem; /* Sous-élément de menu */ + + base = G_EDITOR_ITEM(panel); + + base->widget = gtk_vbox_new(FALSE, 0); + gtk_widget_show(base->widget); + + ref = G_OBJECT(base->widget); + g_object_set_data(ref, "panel", panel); + + /* Liste des chaînes */ + + scrollwnd = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrollwnd); + gtk_box_pack_start(GTK_BOX(base->widget), 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(STC_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + g_object_set_data(G_OBJECT(panel), "store", store); + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + gtk_widget_show(treeview); + gtk_container_add(GTK_CONTAINER(scrollwnd), treeview); + + g_object_unref(G_OBJECT(store)); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Address"), renderer, + "text", STC_ADDRESS, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("String"), renderer, + "markup", STC_STRING, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + /* Menu contextuel */ + + panel->menubar = gtk_menu_new(); + + submenuitem = qck_create_menu_item_with_stock_img(NULL, NULL, GTK_STOCK_COPY, + G_CALLBACK(mcb_strings_copy), treeview); + gtk_container_add(GTK_CONTAINER(panel->menubar), submenuitem); + + submenuitem = qck_create_menu_item(NULL, NULL, _("Find references..."), NULL, NULL); + gtk_container_add(GTK_CONTAINER(panel->menubar), submenuitem); + + g_signal_connect(G_OBJECT(treeview), "button_release_event", + G_CALLBACK(on_strings_button_press_event), panel); + +} + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global. * +* * +* Description : Crée un panneau d'affichage des symboles. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GEditorItem *g_strings_panel_new(GObject *ref) +{ + GEditorItem *result; /* Structure à retourner */ + + result = g_object_new(G_TYPE_STRINGS_PANEL, NULL); + + g_panel_item_init_ext(G_PANEL_ITEM(result), ref, PANEL_STRINGS_ID, + _("Strings"), G_EDITOR_ITEM(result)->widget, "SE"); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global. * +* * +* Description : Construit et intègre un panneau d'affichage des symboles. * +* * +* Retour : Adresse du panneau mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GPanelItem *create_strings_panel(GObject *ref) +{ + GEditorItem *result; /* Elément réactif à renvoyer */ + + result = g_strings_panel_new(ref); + + /* Enregistre correctement le tout */ + result->update_binary = (update_item_binary_fc)change_strings_panel_current_binary; + register_editor_item(result); + + return G_PANEL_ITEM(result); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = panneau à mettre à jour. * +* binary = nouvelle instance de binaire analysé. * +* * +* Description : Réagit à un changement d'affichage principal de contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void change_strings_panel_current_binary(GStringsPanel *panel, GLoadedBinary *binary) +{ + GtkTreeStore *store; /* Modèle de gestion */ + GExeFormat *format; /* Format de travail */ + size_t count; /* Nombre des chaînes */ + GBinSymbol **symbols; /* Liste des chaînes trouvées */ + size_t i; /* Boucle de parcours */ + char address[VMPA_MAX_SIZE]; /* Conversion de l'adresse */ + const char *raw; /* Texte brut trouvé */ + char *text; /* Version imprimable du texte */ + GtkTreeIter iter; /* Point d'insertion */ + + store = g_object_get_data(G_OBJECT(panel), "store"); + + format = g_loaded_binary_get_format(binary); + symbols = g_binary_format_get_symbols(G_BIN_FORMAT(format), &count); + + for (i = 0; i < count; i++) + { + if (g_binary_symbol_get_target_type(symbols[i]) != STP_STRING) continue; + + /* FIXME : adresses autres que 32 bits */ + snprintf(address, VMPA_MAX_SIZE, "0x%08" PRIx64, g_binary_symbol_get_address(symbols[i])); + + raw = g_binary_symbol_to_string(symbols[i]); + + text = strdup(raw); + text = strrpl(text, "&", "&"); + text = strrpl(text, "<", "<"); + text = strrpl(text, ">", ">"); + text = strrpl(text, "\r", "<b>\\r</b>"); + text = strrpl(text, "\n", "<b>\\n</b>"); + + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, + STC_ADDRESS, address, + STC_STRING, text, + STC_RAW, raw, + -1); + + free(text); + + } + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTIONS DES MENUS CONTEXTUELS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : treeview = composant GTK visé par l'opération. * +* event = informations liées à l'événement. * +* data = référence vers le panneau contenant le menu. * +* * +* Description : Affiche le menu d'édition propre aux chaînes trouvées. * +* * +* Retour : FALSE pour poursuivre la propagation de l'événement. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean on_strings_button_press_event(GtkTreeView *treeview, GdkEventButton *event, GStringsPanel *panel) +{ + gboolean result; /* Bilan d'action à renvoyer */ + + result = FALSE; + + if (event->type == GDK_BUTTON_RELEASE && event->button == 3) + { + gtk_menu_popup(GTK_MENU(panel->menubar), + NULL, NULL, NULL, NULL, + event->button, event->time); + + result = TRUE; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* treeview = arbre contenant la sélection à exporter. * +* * +* Description : Réagit avec le menu "--- -> Copier". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_strings_copy(GtkMenuItem *menuitem, GtkTreeView *treeview) +{ + GtkTreeSelection *selection; /* Sélection de l'arbre */ + GtkTreeIter iter; /* Point de sélection */ + GtkTreeModel *model; /* Modèle de gestion */ + gchar *string; /* Chaîne sélectionnée */ + GtkClipboard *clipboard; /* Presse-papiers d'arrivée */ + + selection = gtk_tree_view_get_selection(treeview); + + if (gtk_tree_selection_get_selected(selection, &model, &iter)) + { + gtk_tree_model_get(model, &iter, STC_RAW, &string, -1); + + if (string != NULL) + { + clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), + GDK_SELECTION_PRIMARY); + + gtk_clipboard_set_text(clipboard, string, strlen(string)); + g_free(string); + + } + + } + +} |