diff options
Diffstat (limited to 'src/dialogs')
-rw-r--r-- | src/dialogs/Makefile.am | 1 | ||||
-rw-r--r-- | src/dialogs/gotox.c | 367 | ||||
-rw-r--r-- | src/dialogs/gotox.h | 44 |
3 files changed, 412 insertions, 0 deletions
diff --git a/src/dialogs/Makefile.am b/src/dialogs/Makefile.am index 54b6fa2..1fe821a 100644 --- a/src/dialogs/Makefile.am +++ b/src/dialogs/Makefile.am @@ -6,6 +6,7 @@ libdialogs_la_SOURCES = \ 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 diff --git a/src/dialogs/gotox.c b/src/dialogs/gotox.c new file mode 100644 index 0000000..653a969 --- /dev/null +++ b/src/dialogs/gotox.c @@ -0,0 +1,367 @@ + +/* 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 <http://www.gnu.org/licenses/>. + */ + + +#include "gotox.h" + + +#include <cairo-gobject.h> +#include <malloc.h> + + +#include <i18n.h> + + +#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; + + + +/* Ajoute une nouvelle localisation de destination. */ +static void add_new_location_to_list(GtkTreeStore *, GLoadedBinary *, const vmpa2t *, GBinSymbol *); + + + +/****************************************************************************** +* * +* 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 sections. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_gotox_dialog(GtkWindow *parent, GLoadedBinary *binary) +{ + 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 */ + 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 */ + size_t i; /* Boucle de parcours */ + vmpa2t addr; /* Localisation de symbole */ + + result = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(result), _("Binary's entry points")); + 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_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); + + /* 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); + + 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]); + + } + + g_object_unref(G_OBJECT(store)); + + 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); + + if (line != NULL) + virtual = g_buffer_line_get_text(line, BLC_VIRTUAL, BLC_VIRTUAL + 1, true); + else + virtual = strdup(_("<line address not found>")); + + /* 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); + + name = make_symbol_offset(label, diff); + + } + else + { + symbol = NULL; + + name = strdup(_("<no symbol found>")); + + } + + } + + /* Image de représentation */ + + 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(_("<assembly line not found>")); + + /* 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 new file mode 100644 index 0000000..1153478 --- /dev/null +++ b/src/dialogs/gotox.h @@ -0,0 +1,44 @@ + +/* 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 <http://www.gnu.org/licenses/>. + */ + + +#ifndef _DIALOGS_GOTOX_H +#define _DIALOGS_GOTOX_H + + +#include <gtk/gtk.h> + + +#include "../analysis/binary.h" +#include "../arch/vmpa.h" + + + +/* Construit la fenêtre de saut à une adresse. */ +GtkWidget *create_gotox_dialog(GtkWindow *, GLoadedBinary *); + +/* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ +vmpa2t *get_address_from_gotox_dialog(GtkWidget *); + + + +#endif /* _DIALOGS_GOTOX_H */ |