diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/disass/disassembler.c | 14 | ||||
-rw-r--r-- | src/analysis/disass/output.c | 39 | ||||
-rw-r--r-- | src/analysis/disass/output.h | 2 |
3 files changed, 44 insertions, 11 deletions
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index 4004de9..283914e 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -58,7 +58,7 @@ typedef struct _GDelayedDisassembly GDelayedWork parent; /* A laisser en premier */ const GOpenidaBinary *binary; /* Destinataire final */ - const GBinFormat *format; /* Format du binaire représenté*/ + const GExeFormat *format; /* Format du binaire représenté*/ GBinPart **parts; /* Parties binaires à traiter */ size_t count; /* Nombre de ces parties */ @@ -169,7 +169,7 @@ static GDelayedDisassembly *g_delayed_disassembly_new(const GOpenidaBinary *bina result = g_object_new(G_TYPE_DELAYED_DISASSEMBLY, NULL); result->binary = binary; - result->format = G_BIN_FORMAT(g_openida_binary_get_format(binary)); + result->format = g_openida_binary_get_format(binary); result->parts = parts; result->count = count; @@ -200,8 +200,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta size_t routines_count; /* Nombre de ces routines */ guint id; /* Identifiant de statut */ - routines = g_binary_format_get_routines(disass->format, &routines_count); - qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_rcompare); + routines = g_binary_format_get_routines(G_BIN_FORMAT(disass->format), &routines_count); /* Première étape */ @@ -224,6 +223,8 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta id = gtk_extended_status_bar_push(statusbar, _("Finding remaining limits..."), true); + qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_rcompare); + limit_all_routines(disass->lines, routines, routines_count, statusbar, id); gtk_extended_status_bar_remove(statusbar, id); @@ -232,7 +233,10 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta id = gtk_extended_status_bar_push(statusbar, _("Printing disassembled code..."), true); - print_disassembled_instructions(disass->buffer, disass->instrs, routines, routines_count); + qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_compare); + + print_disassembled_instructions(disass->buffer, disass->format, disass->instrs, + routines, routines_count); gtk_extended_status_bar_remove(statusbar, id); diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c index 9c4ba2f..0209a97 100644 --- a/src/analysis/disass/output.c +++ b/src/analysis/disass/output.c @@ -24,7 +24,9 @@ #include "output.h" +#include "../../arch/processor.h" #include "../../decomp/lang/asm.h" +#include "../../format/format.h" @@ -43,17 +45,44 @@ * * ******************************************************************************/ -void print_disassembled_instructions(GCodeBuffer *buffer, const GArchInstruction *instrs, const GBinRoutine **routines, size_t count) +void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, const GArchInstruction *instrs, const GBinRoutine **routines, size_t count) { + GLangOutput *output; /* Modèle de sortie adéquat */ + GArchProcessor *proc; /* Architecture du binaire */ + MemoryDataSize msize; /* Taille du bus d'adresses */ + const bin_t *content; /* Contenu binaire global */ + const GArchInstruction *iter; /* Boucle de parcours #1 */ + size_t i; /* Boucle de parcours #2 */ + vmpa_t iaddr; /* Adresse d'instruction */ + vmpa_t raddr; /* Adresse de routine */ - /* - for (iter = disass->instrs; + output = g_asm_output_new(); + + proc = get_arch_processor_from_format(format); + msize = g_arch_processor_get_memory_size(proc); + + content = g_binary_format_get_content(G_BIN_FORMAT(format), NULL); + + for (iter = instrs, i = 0; iter != NULL; - iter = g_arch_instruction_get_next_iter(disass->instrs, iter, VMPA_MAX)) + iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX)) { + /* Ajout des prototypes de fonction */ + for (; i < count; i++) + { + g_arch_instruction_get_location(iter, NULL, NULL, &iaddr); + raddr = g_binary_routine_get_address(routines[i]); + + if (raddr > iaddr) break; + g_binary_routine_print_code(routines[i], output, buffer, false); + + } + + g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL); } - */ + + g_object_unref(G_OBJECT(output)); } diff --git a/src/analysis/disass/output.h b/src/analysis/disass/output.h index f6c56f3..40e7536 100644 --- a/src/analysis/disass/output.h +++ b/src/analysis/disass/output.h @@ -32,7 +32,7 @@ /* Transcrit du code désassemblé en texte humainement lisible. */ -void print_disassembled_instructions(GCodeBuffer *, const GArchInstruction *, const GBinRoutine **, size_t); +void print_disassembled_instructions(GCodeBuffer *, const GExeFormat *, const GArchInstruction *, const GBinRoutine **, size_t); |