summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/analysis/binary.c14
-rw-r--r--src/analysis/line_code.c19
-rw-r--r--src/analysis/line_comment.c19
-rw-r--r--src/analysis/prototype.c19
-rw-r--r--src/analysis/prototype.h3
-rw-r--r--src/arch/jvm/processor.c1
-rw-r--r--src/arch/mips/processor.c1
-rw-r--r--src/arch/processor-int.h1
-rw-r--r--src/arch/processor.c60
-rw-r--r--src/arch/processor.h29
-rw-r--r--src/arch/x86/processor.c1
-rw-r--r--src/editor.c12
-rw-r--r--src/format/exe_format.c20
-rw-r--r--src/gtkext/gtksnippet.h2
-rwxr-xr-xsrc/panel/Makefile.am3
-rw-r--r--src/panel/log.c7
-rw-r--r--src/panel/panels.c8
-rw-r--r--src/panel/panels.h3
-rw-r--r--src/panel/symbols.c (renamed from src/pan_symbols.c)68
-rw-r--r--src/panel/symbols.h (renamed from src/pan_symbols.h)4
21 files changed, 195 insertions, 100 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index dd5d1ea..c47f5e7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -64,7 +64,6 @@ openida_SOURCES = \
dlg_sections.h dlg_sections.c \
editor.c \
pan_strings.h pan_strings.c \
- pan_symbols.h pan_symbols.c \
project.h project.c \
shell.h shell.c \
xdg.h xdg.c \
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index 88201ac..01ccfdd 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -39,6 +39,7 @@
#include "line_comment.h"
#include "line_prologue.h"
#include "prototype.h"
+#include "../panel/log.h"
#include "../plugins/pglist.h"
@@ -117,23 +118,22 @@ openida_binary *load_binary_file(const char *filename)
switch (get_exe_target_machine(result->format))
{
case FTM_JVM:
- result->proc = get_arch_processor_for_type(APT_JVM);
+ log_simple_message(LMT_INFO, _("Detected architecture: Java Virtual Machine"));
break;
-
case FTM_MIPS:
- result->proc = get_arch_processor_for_type(APT_MIPS);
+ log_simple_message(LMT_INFO, _("Detected architecture: Microprocessor without Interlocked Pipeline Stages"));
break;
-
case FTM_386:
- result->proc = get_arch_processor_for_type(APT_386);
+ log_simple_message(LMT_INFO, _("Detected architecture: i386"));
break;
-
default:
+ log_simple_message(LMT_INFO, _("Unknown architecture"));
goto lbf_error;
break;
-
}
+ result->proc = get_arch_processor_from_format(result->format);
+
result->options.show_address = true;
result->options.show_code = true;
diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c
index a234055..cd7eba6 100644
--- a/src/analysis/line_code.c
+++ b/src/analysis/line_code.c
@@ -174,15 +174,28 @@ void g_code_line_refresh_markup(GCodeLine *line)
if (line->options->show_address)
{
- switch (ADM_32BITS /* FIXME */)
+ switch (g_arch_processor_get_memory_size(line->options->proc))
{
- case ADM_32BITS:
+ case MDS_8_BITS:
+ snprintf(buffer, CODE_BUFFER_LEN,
+ "<span foreground='#333333'>0x%02llx</span>",
+ G_RENDERING_LINE(line)->offset);
+ break;
+
+ case MDS_16_BITS:
+ snprintf(buffer, CODE_BUFFER_LEN,
+ "<span foreground='#333333'>0x%04llx</span>",
+ G_RENDERING_LINE(line)->offset);
+ break;
+
+ case MDS_32_BITS:
snprintf(buffer, CODE_BUFFER_LEN,
"<span foreground='#333333'>0x%08llx</span>",
G_RENDERING_LINE(line)->offset);
break;
- case ADM_64BITS:
+ default:
+ case MDS_64_BITS:
snprintf(buffer, CODE_BUFFER_LEN,
"<span foreground='#333333'>0x%16llx</span>",
G_RENDERING_LINE(line)->offset);
diff --git a/src/analysis/line_comment.c b/src/analysis/line_comment.c
index ea6d6d6..1d37613 100644
--- a/src/analysis/line_comment.c
+++ b/src/analysis/line_comment.c
@@ -137,15 +137,28 @@ void g_comment_line_refresh_markup(GCommentLine *line)
if (line->options->show_address)
{
- switch (ADM_32BITS /* FIXME */)
+ switch (g_arch_processor_get_memory_size(line->options->proc))
{
- case ADM_32BITS:
+ case MDS_8_BITS:
+ snprintf(buffer, CODE_BUFFER_LEN,
+ "<span foreground='#333333'>0x%02llx</span>",
+ G_RENDERING_LINE(line)->offset);
+ break;
+
+ case MDS_16_BITS:
+ snprintf(buffer, CODE_BUFFER_LEN,
+ "<span foreground='#333333'>0x%04llx</span>",
+ G_RENDERING_LINE(line)->offset);
+ break;
+
+ case MDS_32_BITS:
snprintf(buffer, CODE_BUFFER_LEN,
"<span foreground='#333333'>0x%08llx</span>",
G_RENDERING_LINE(line)->offset);
break;
- case ADM_64BITS:
+ default:
+ case MDS_64_BITS:
snprintf(buffer, CODE_BUFFER_LEN,
"<span foreground='#333333'>0x%16llx</span>",
G_RENDERING_LINE(line)->offset);
diff --git a/src/analysis/prototype.c b/src/analysis/prototype.c
index 1e27f2c..78854f9 100644
--- a/src/analysis/prototype.c
+++ b/src/analysis/prototype.c
@@ -245,6 +245,25 @@ void g_binary_routine_set_name(GBinRoutine *routine, char *name)
/******************************************************************************
* *
* Paramètres : routine = routine à mettre à jour. *
+* *
+* Description : Fournit le nom humain d'une routine. *
+* *
+* Retour : Désignation humainement lisible ou NULL si non définie. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *g_binary_routine_get_name(const GBinRoutine *routine)
+{
+ return routine->name;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à mettre à jour. *
* var = variable représentant un type de retour. *
* *
* Description : Définit le type de retour d'une routine. *
diff --git a/src/analysis/prototype.h b/src/analysis/prototype.h
index 3fd822e..299cce6 100644
--- a/src/analysis/prototype.h
+++ b/src/analysis/prototype.h
@@ -75,6 +75,9 @@ void g_binary_routine_set_type(GBinRoutine *, RoutineType);
/* Définit le nom humain d'une routine. */
void g_binary_routine_set_name(GBinRoutine *, char *);
+/* Désignation humainement lisible ou NULL si non définie. */
+const char *g_binary_routine_get_name(const GBinRoutine *);
+
/* Définit le type de retour d'une routine. */
void g_binary_routine_set_return_type(GBinRoutine *, variable *);
diff --git a/src/arch/jvm/processor.c b/src/arch/jvm/processor.c
index 8226afc..034b864 100644
--- a/src/arch/jvm/processor.c
+++ b/src/arch/jvm/processor.c
@@ -98,6 +98,7 @@ static void g_jvm_processor_init(GJvmProcessor *proc)
parent = G_ARCH_PROCESSOR(proc);
parent->endianness = SRE_BIG;
+ parent->memsize = MDS_32_BITS;
parent->decode = (decode_instruction_fc)g_jvm_processor_decode_instruction;
diff --git a/src/arch/mips/processor.c b/src/arch/mips/processor.c
index c28c7b4..7e921c1 100644
--- a/src/arch/mips/processor.c
+++ b/src/arch/mips/processor.c
@@ -97,6 +97,7 @@ static void g_mips_processor_init(GMipsProcessor *proc)
parent = G_ARCH_PROCESSOR(proc);
parent->endianness = SRE_BIG;
+ parent->memsize = MDS_32_BITS;
parent->decode = (decode_instruction_fc)g_mips_processor_decode_instruction;
diff --git a/src/arch/processor-int.h b/src/arch/processor-int.h
index bbe2384..fc9097e 100644
--- a/src/arch/processor-int.h
+++ b/src/arch/processor-int.h
@@ -58,6 +58,7 @@ struct _GArchProcessor
GObject parent; /* A laisser en premier */
SourceEndian endianness; /* Boutisme de l'architecture */
+ MemoryDataSize memsize; /* Taille de l'espace mémoire */
decode_instruction_fc decode; /* Traduction en instructions */
diff --git a/src/arch/processor.c b/src/arch/processor.c
index 317e893..c8630d7 100644
--- a/src/arch/processor.c
+++ b/src/arch/processor.c
@@ -132,6 +132,25 @@ SourceEndian g_arch_processor_get_endianness(const GArchProcessor *proc)
/******************************************************************************
* *
+* Paramètres : proc = processeur d'architecture à consulter. *
+* *
+* Description : Fournit la taille de l'espace mémoire d'une architecture. *
+* *
+* Retour : Taille de l'espace mémoire. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+MemoryDataSize g_arch_processor_get_memory_size(const GArchProcessor *proc)
+{
+ return proc->memsize;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : proc = architecture visée par la procédure. *
* data = flux de données à analyser. *
* pos = position courante dans ce flux. [OUT] *
@@ -216,3 +235,44 @@ GArchProcessor *get_arch_processor_for_type(ArchProcessorType type)
return _processors_list[type];
}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = exécutable d'origine. *
+* *
+* Description : Fournit le processeur d'architecture lié à un format. *
+* *
+* Retour : Processeur d'architecture trouvé. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GArchProcessor *get_arch_processor_from_format(const exe_format *format)
+{
+ GArchProcessor *result; /* Conversion à retourner */
+
+ switch (get_exe_target_machine(format))
+ {
+ case FTM_JVM:
+ result = get_arch_processor_for_type(APT_JVM);
+ break;
+
+ case FTM_MIPS:
+ result = get_arch_processor_for_type(APT_MIPS);
+ break;
+
+ case FTM_386:
+ result = get_arch_processor_for_type(APT_386);
+ break;
+
+ default:
+ result = NULL;
+ break;
+
+ }
+
+ return result;
+
+}
diff --git a/src/arch/processor.h b/src/arch/processor.h
index 5726197..8529d50 100644
--- a/src/arch/processor.h
+++ b/src/arch/processor.h
@@ -25,31 +25,10 @@
#define _ARCH_PROCESSOR_H
-#include <sys/types.h>
-
-
-#include "operand.h" /* AsmSyntax */
-#include "instruction.h"
-
-
-
-/* FIXME : lieu de définition temporaire */
-
-/* Mode d'adressage à utiliser */
-typedef enum _AdressMode
-{
- ADM_32BITS, /* Adresses sur 32 bits */
- ADM_64BITS /* Adresses sur 64 bits */
-
-} AdressMode;
-
-
-
-
-
#include <glib-object.h>
+#include "instruction.h"
#include "../common/endianness.h"
@@ -73,6 +52,9 @@ GType g_arch_processor_get_type(void);
/* Fournit le boustime du processeur d'une architecture. */
SourceEndian g_arch_processor_get_endianness(const GArchProcessor *);
+/* Fournit la taille de l'espace mémoire d'une architecture. */
+MemoryDataSize g_arch_processor_get_memory_size(const GArchProcessor *);
+
/* Décode une instruction dans un flux de données. */
GArchInstruction *g_arch_processor_decode_instruction(const GArchProcessor *, const bin_t *, off_t *, off_t, off_t, vmpa_t);
@@ -99,6 +81,9 @@ bool init_all_processors(void);
/* Fournit le processeur d'architecture correspondant à un type. */
GArchProcessor *get_arch_processor_for_type(ArchProcessorType);
+/* Fournit le processeur d'architecture lié à un format. */
+GArchProcessor *get_arch_processor_from_format(const exe_format *);
+
#endif /* _ARCH_PROCESSOR_H */
diff --git a/src/arch/x86/processor.c b/src/arch/x86/processor.c
index 8af84b2..7370da1 100644
--- a/src/arch/x86/processor.c
+++ b/src/arch/x86/processor.c
@@ -97,6 +97,7 @@ static void g_x86_processor_init(GX86Processor *proc)
parent = G_ARCH_PROCESSOR(proc);
parent->endianness = SRE_BIG;
+ parent->memsize = MDS_32_BITS;
parent->decode = (decode_instruction_fc)g_x86_processor_decode_instruction;
diff --git a/src/editor.c b/src/editor.c
index ff1217b..7185e3f 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -43,7 +43,6 @@
#include "dlg_sections.h"
#include "pan_strings.h"
-#include "pan_symbols.h"
#include "analysis/binary.h"
#include "gtkext/easygtk.h"
#include "gtkext/gtkbinview.h"
@@ -233,7 +232,7 @@ int main(int argc, char **argv)
GtkWidget *create_editor(void)
{
GtkWidget *result; /* Fenêtre à renvoyer */
- GObject *ref; /* version de référence */
+ GObject *ref; /* Version de référence */
GtkWidget *menuboard; /* Barre de menus principale */
GtkWidget *menuitem; /* Elément de menu */
GtkWidget *menubar; /* Support pour éléments */
@@ -252,7 +251,6 @@ GtkWidget *create_editor(void)
GtkWidget *binview;
GtkWidget *panel;
- GtkWidget *_panel;
openida_project *project;
@@ -441,7 +439,7 @@ GtkWidget *create_editor(void)
gtk_paned_set_position (GTK_PANED (hpaned1), 600);
- init_panels();
+ init_panels(ref);
dpanel = gtk_dock_panel_new();
@@ -503,10 +501,8 @@ GtkWidget *create_editor(void)
gtk_paned_pack2(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);
- panel = build_symbols_panel(G_OBJECT(result));
- _panel = panel;
- ditem = gtk_dock_item_new(_("Symbols"), panel);
+ ditem = gtk_dock_item_new(_("Symbols"), get_panel(PNT_SYMBOLS));
gtk_dock_panel_add_item(dpanel, ditem);
ditem = gtk_dock_item_new(_("Registers"), get_panel(PNT_REGISTERS));
@@ -1221,7 +1217,7 @@ void open_last_file(GObject *ref)
g_object_set_data(ref, "current_binary", binary);
-
+ reload_symbols_panel_content(get_panel(PNT_SYMBOLS), get_openida_binary_format(binary));
}
diff --git a/src/format/exe_format.c b/src/format/exe_format.c
index 2924847..ffd9fde 100644
--- a/src/format/exe_format.c
+++ b/src/format/exe_format.c
@@ -360,25 +360,7 @@ const uint8_t *get_exe_content(const exe_format *format, off_t *length)
FormatTargetMachine get_exe_target_machine(const exe_format *format)
{
- FormatTargetMachine result; /* Type à retourner */
-
- result = format->get_target_machine(format);
-
- switch (result)
- {
- case FTM_JVM:
- log_simple_message(LMT_INFO, _("Detected architecture: Java Virtual Machine"));
- break;
- case FTM_MIPS:
- log_simple_message(LMT_INFO, _("Detected architecture: Microprocessor without Interlocked Pipeline Stages"));
- break;
- case FTM_386:
- log_simple_message(LMT_INFO, _("Detected architecture: i386"));
- break;
-
- }
-
- return result;
+ return format->get_target_machine(format);
}
diff --git a/src/gtkext/gtksnippet.h b/src/gtkext/gtksnippet.h
index f079258..aa388a2 100644
--- a/src/gtkext/gtksnippet.h
+++ b/src/gtkext/gtksnippet.h
@@ -54,8 +54,6 @@ struct _GtkSnippet {
GtkWidget widget; /* Présence obligatoire en 1er */
- AdressMode mode; /* Mode d'affichage */
-
bool show_vaddress; /* Affichage des adresses ? */
bool show_code; /* Affichage du code brut ? */
diff --git a/src/panel/Makefile.am b/src/panel/Makefile.am
index f53a841..48f0958 100755
--- a/src/panel/Makefile.am
+++ b/src/panel/Makefile.am
@@ -4,7 +4,8 @@ noinst_LTLIBRARIES = libpanel.la
libpanel_la_SOURCES = \
log.h log.c \
panels.h panels.c \
- registers.h registers.c
+ registers.h registers.c \
+ symbols.h symbols.c
libpanel_la_LDFLAGS =
diff --git a/src/panel/log.c b/src/panel/log.c
index 812d470..e8ac952 100644
--- a/src/panel/log.c
+++ b/src/panel/log.c
@@ -67,7 +67,6 @@ GtkWidget *build_log_panel(void)
GtkWidget *treeview; /* Affichage de la liste */
GtkCellRenderer *renderer; /* Moteur de rendu de colonne */
GtkTreeViewColumn *column; /* Colonne de la liste */
- GtkTreeSelection *select; /* Sélection dans la liste */
result = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_show(result);
@@ -154,6 +153,12 @@ void log_simple_message(LogMessageType type, const char *msg)
-1);
break;
+ default:
+ gtk_tree_store_set(store, &iter,
+ LGC_STRING, msg,
+ -1);
+ break;
+
}
}
diff --git a/src/panel/panels.c b/src/panel/panels.c
index eae6ba3..39adc10 100644
--- a/src/panel/panels.c
+++ b/src/panel/panels.c
@@ -27,6 +27,7 @@
#include "log.h"
#include "registers.h"
+#include "symbols.h"
@@ -36,7 +37,7 @@ static GtkWidget *panel_list[PNT_COUNT];
/******************************************************************************
* *
-* Paramètres : - *
+* Paramètres : ref = espace de référencements global. *
* *
* Description : Procède au chargement de tous les panneaux. *
* *
@@ -46,10 +47,11 @@ static GtkWidget *panel_list[PNT_COUNT];
* *
******************************************************************************/
-void init_panels(void)
+void init_panels(GObject *ref)
{
panel_list[PNT_LOG] = build_log_panel();
panel_list[PNT_REGISTERS] = build_registers_panel();
+ panel_list[PNT_SYMBOLS] = build_symbols_panel(ref);
}
@@ -68,6 +70,6 @@ void init_panels(void)
GtkWidget *get_panel(PanelType id)
{
- return panel_list[id];
+ return (id < PNT_COUNT ? panel_list[id] : NULL);
}
diff --git a/src/panel/panels.h b/src/panel/panels.h
index e38f196..feaa908 100644
--- a/src/panel/panels.h
+++ b/src/panel/panels.h
@@ -35,6 +35,7 @@ typedef enum _PanelType
{
PNT_LOG, /* Messages système */
PNT_REGISTERS, /* Registres d'architecture */
+ PNT_SYMBOLS, /* Symboles d'exécutable */
PNT_COUNT
@@ -42,7 +43,7 @@ typedef enum _PanelType
/* Procède au chargement de tous les panneaux. */
-void init_panels(void);
+void init_panels(GObject *);
/* Fournit la référence d'un panneau donné. */
GtkWidget *get_panel(PanelType);
diff --git a/src/pan_symbols.c b/src/panel/symbols.c
index 05a162b..3937849 100644
--- a/src/pan_symbols.c
+++ b/src/panel/symbols.c
@@ -1,6 +1,6 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
- * pan_symbols.c - panneau d'affichage des symboles
+ * symbols.c - panneau d'affichage des symboles
*
* Copyright (C) 2006-2007 Cyrille Bagard
*
@@ -22,14 +22,15 @@
*/
-#include "pan_symbols.h"
+#include "symbols.h"
#include <malloc.h>
#include <stdlib.h>
-#include "gtkext/gtkbinview.h"
+#include "../arch/processor.h"
+#include "../gtkext/gtkbinview.h"
@@ -49,7 +50,6 @@ void change_symbols_selection(GtkTreeSelection *, gpointer);
-
/******************************************************************************
* *
* Paramètres : ref = adresse de l'espace de référencements. *
@@ -127,13 +127,13 @@ void change_symbols_selection(GtkTreeSelection *selection, gpointer data)
GtkTreeIter iter;
GtkTreeModel *model;
gchar *string; /* Chaîne sélectionnée */
- uint64_t address; /* Adresse à rejoindre */
+ vmpa_t address; /* Adresse à rejoindre */
GtkBinview *binview; /* Affichage à faire défiler */
if (gtk_tree_selection_get_selected(selection, &model, &iter))
{
gtk_tree_model_get(model, &iter, SBC_ADDRESS, &string, -1);
- address = strtoll(string, NULL, 16);
+ address = strtoll(string, NULL, 16); /* FIXME */
g_free(string);
binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview"));
@@ -158,46 +158,60 @@ void change_symbols_selection(GtkTreeSelection *selection, gpointer data)
* *
******************************************************************************/
-void handle_new_exe_on_symbols_panel(GtkWidget *panel, const exe_format *format)
+void reload_symbols_panel_content(GtkWidget *panel, const exe_format *format)
{
+ GBinRoutine **routines; /* Routines trouvées */
+ size_t count; /* Nombre de ces routines */
GtkTreeStore *store; /* Modèle de gestion */
- GtkTreeIter iter; /* Point d'insertion */
- char **labels; /* Etiquettes humaines */
- SymbolType *types; /* Type des symboles listés */
- uint64_t *offsets; /* Emplacements de mémoire */
- size_t count; /* Nombre des symboles */
+ GArchProcessor *proc; /* Architecture utilisée */
size_t i; /* Boucle de parcours */
- char address[11];
-
- store = g_object_get_data(G_OBJECT(panel), "store");
+ vmpa_t address; /* Adresse associée au symbole */
+ char tmp[19]; /* Version humainement lisible */
+ GtkTreeIter iter; /* Point d'insertion */
- count = get_exe_symbols(format, &labels, &types, &offsets);
+ routines = get_all_exe_routines(format, &count);
- if (count > 0)
+ if (routines != NULL)
{
+ store = g_object_get_data(G_OBJECT(panel), "store");
+
+ proc = get_arch_processor_from_format(format);
+
for (i = 0; i < count; i++)
{
+ address = g_binary_routine_get_address(routines[i]);
+ switch (g_arch_processor_get_memory_size(proc))
+ {
+ case MDS_8_BITS:
+ snprintf(tmp, 19, "0x%02llx", address);
+ break;
- snprintf(address, 11, "0x%08llx", offsets[i]);
+ case MDS_16_BITS:
+ snprintf(tmp, 19, "0x%04llx", address);
+ break;
+ case MDS_32_BITS:
+ snprintf(tmp, 19, "0x%08llx", address);
+ break;
+
+ default:
+ case MDS_64_BITS:
+ snprintf(tmp, 19, "0x%16llx", address);
+ break;
+
+ }
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter,
- SBC_ADDRESS, address,
- SBC_NAME, labels[i],
+ SBC_ADDRESS, tmp,
+ SBC_NAME, g_binary_routine_get_name(routines[i]),
-1);
-
}
- free(labels);
- free(types);
- free(offsets);
+ free(routines);
}
-
-
-
}
diff --git a/src/pan_symbols.h b/src/panel/symbols.h
index d294717..195bcf2 100644
--- a/src/pan_symbols.h
+++ b/src/panel/symbols.h
@@ -29,7 +29,7 @@
#include <gtk/gtk.h>
-#include "format/exe_format.h"
+#include "../format/exe_format.h"
@@ -38,7 +38,7 @@ GtkWidget *build_symbols_panel(GObject *);
/* Affiche la liste des symboles présents dans un exécutable. */
-void handle_new_exe_on_symbols_panel(GtkWidget *, const exe_format *);
+void reload_symbols_panel_content(GtkWidget *, const exe_format *);