From 8599cd772627ed8f7c923615fe991808d3f5c882 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 31 Dec 2017 17:16:20 +0100 Subject: Updated the ROP gadgets finder. --- ChangeLog | 16 ++++++++++++++++ plugins/ropgadgets/select.c | 42 ++++++++++++++++++++++++++++-------------- src/analysis/loading.c | 7 ++++++- src/core/global.c | 4 ++++ src/gui/editor.c | 8 +------- src/gui/menus/file.c | 6 ++++++ src/gui/menus/project.c | 11 +++++++++-- 7 files changed, 70 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41fb56a..63cedf9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 17-12-31 Cyrille Bagard + * plugins/ropgadgets/select.c: + Update the ROP gadgets finder. + + * src/analysis/loading.c: + Update code. + + * src/core/global.c: + Increase the reference counter when providing the current project. + + * src/gui/editor.c: + * src/gui/menus/file.c: + * src/gui/menus/project.c: + Update code. + +17-12-31 Cyrille Bagard + * plugins/elf/elf_def.h: Typo. diff --git a/plugins/ropgadgets/select.c b/plugins/ropgadgets/select.c index 2294a9c..021a2fa 100644 --- a/plugins/ropgadgets/select.c +++ b/plugins/ropgadgets/select.c @@ -35,8 +35,8 @@ #include -#include #include +#include #include #include #include @@ -502,16 +502,20 @@ static void register_input_output_panel(GtkAssistant *assistant, GObject *ref) static GtkWidget *load_and_populate_current_project_binaries(GObject *ref) { GtkWidget *result; /* Composant à retourner */ + GStudyProject *project; /* Projet courant */ GLoadedBinary *current; /* Binaire actif courant */ gint selected; /* Indice à sélectionner */ GtkListStore *store; /* Modèle de gestion en liste */ - GLoadedBinary **binaries; /* Liste de binaires */ + GLoadedContent **contents; /* Liste de contenus chargés */ size_t count; /* Taille de cette liste */ size_t i; /* Boucle de parcours */ + GLoadedBinary *binary; /* Contenu de code binaire */ GtkTreeIter iter; /* Point d'insertion */ GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ - /* Récupération du binaire courant */ + /* Récupération des éléments courants */ + + project = get_current_project(); current = get_current_binary(); @@ -521,26 +525,32 @@ static GtkWidget *load_and_populate_current_project_binaries(GObject *ref) store = gtk_list_store_new(CPB_COUNT, G_TYPE_OBJECT, G_TYPE_STRING); - binaries = g_study_project_get_binaries(get_current_project(), &count); + contents = g_study_project_get_contents(project, &count); - if (binaries != NULL) + if (contents != NULL) { for (i = 0; i < count; i++) { - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - CPB_BINARY, binaries[i], - CPB_FILENAME, g_loaded_binary_get_name(binaries[i], true), - -1); + if (G_IS_LOADED_BINARY(contents[i])) + { + binary = G_LOADED_BINARY(contents[i]); - if (binaries[i] == current) - selected = i; + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + CPB_BINARY, binary, + CPB_FILENAME, g_loaded_binary_get_name(binary, true), + -1); - g_object_unref(G_OBJECT(binaries[i])); + if (binary == current) + selected = i; + + } + + g_object_unref(G_OBJECT(contents[i])); } - free(binaries); + free(contents); } @@ -563,8 +573,12 @@ static GtkWidget *load_and_populate_current_project_binaries(GObject *ref) g_object_unref(G_OBJECT(store)); + /* Sortie propre */ + g_object_unref(G_OBJECT(current)); + g_object_unref(G_OBJECT(project)); + return result; } diff --git a/src/analysis/loading.c b/src/analysis/loading.c index 700a03f..f8dc2c3 100644 --- a/src/analysis/loading.c +++ b/src/analysis/loading.c @@ -368,9 +368,14 @@ void g_delayed_study_preload_only(GDelayedStudy *dstudy) void qck_study_new_content(GBinContent *content, ProjectContentState state) { + GStudyProject *project; /* Projet courant */ GDelayedStudy *dstudy; /* Etude à conduire */ - dstudy = g_delayed_study_new(get_current_project(), content, state); + project = get_current_project(); + + dstudy = g_delayed_study_new(project, content, state); + + g_object_unref(G_OBJECT(project)); study_new_content(dstudy); diff --git a/src/core/global.c b/src/core/global.c index c5f25c1..2185c3a 100644 --- a/src/core/global.c +++ b/src/core/global.c @@ -121,6 +121,10 @@ void set_current_project(GStudyProject *project) GStudyProject *get_current_project(void) { + assert(_project != NULL); + + g_object_ref(G_OBJECT(_project)); + return _project; } diff --git a/src/gui/editor.c b/src/gui/editor.c index d1f90d5..11c7f06 100644 --- a/src/gui/editor.c +++ b/src/gui/editor.c @@ -421,7 +421,6 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da result = FALSE; project = get_current_project(); - if (project == NULL) goto ode_no_project; if (g_study_project_get_filename(project) == NULL) { @@ -454,7 +453,7 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da } - ode_no_project: + g_object_unref(G_OBJECT(project)); return result; @@ -476,11 +475,6 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da static void on_destroy_editor(GtkWidget *widget, GObject *ref) { - GStudyProject *project; /* Projet courant */ - - project = get_current_project(); - if (project != NULL) g_object_unref(G_OBJECT(project)); - /* Fermeture propre */ /* ... */ diff --git a/src/gui/menus/file.c b/src/gui/menus/file.c index c0c031c..9c0b218 100644 --- a/src/gui/menus/file.c +++ b/src/gui/menus/file.c @@ -185,6 +185,8 @@ static void mcb_file_open_project(GtkMenuItem *menuitem, gpointer unused) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), g_study_project_get_filename(project)); + g_object_unref(G_OBJECT(project)); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); @@ -235,6 +237,8 @@ static void mcb_file_save_project(GtkMenuItem *menuitem, gpointer unused) else mcb_file_save_project_as(menuitem, NULL); + g_object_unref(G_OBJECT(project)); + } @@ -280,6 +284,8 @@ static void mcb_file_save_project_as(GtkMenuItem *menuitem, gpointer unused) } + g_object_unref(G_OBJECT(project)); + gtk_widget_destroy(dialog); } diff --git a/src/gui/menus/project.c b/src/gui/menus/project.c index 5d027a0..424a506 100644 --- a/src/gui/menus/project.c +++ b/src/gui/menus/project.c @@ -202,6 +202,8 @@ static void mcb_project_add_shellcode(GtkMenuItem *menuitem, GMenuBar *bar) } + g_object_unref(G_OBJECT(project)); + #if 0 GtkWidget *dialog; /* Boîte à afficher */ char *dir; /* Répertoire courant */ @@ -262,6 +264,7 @@ static void mcb_project_add_shellcode(GtkMenuItem *menuitem, GMenuBar *bar) static void mcb_project_add_binary_file(GtkMenuItem *menuitem, GMenuBar *bar) { GtkWidget *dialog; /* Boîte à afficher */ + GStudyProject *project; /* Projet courant */ char *dir; /* Répertoire courant */ gchar *filename; /* Nom du fichier à intégrer */ GBinContent *content; /* Contenu binaire à charger */ @@ -273,14 +276,18 @@ static void mcb_project_add_binary_file(GtkMenuItem *menuitem, GMenuBar *bar) _("_Open"), GTK_RESPONSE_ACCEPT, NULL); - if (g_study_project_get_filename(get_current_project()) != NULL) + project = get_current_project(); + + if (g_study_project_get_filename(project) != NULL) { - dir = strdup(g_study_project_get_filename(get_current_project())); + dir = strdup(g_study_project_get_filename(project)); dir = dirname(dir); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir); free(dir); } + g_object_unref(G_OBJECT(project)); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); -- cgit v0.11.2-87-g4458