From 0f571c20444dbb5d8d8d0fa46a69b31cb89f9583 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 31 Dec 2014 19:58:50 +0000 Subject: Resolved links in disassembled instructions. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@446 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 17 +++ src/analysis/disass/area.c | 278 +++++++++++++++++-------------------- src/analysis/disass/area.h | 25 +--- src/analysis/disass/disassembler.c | 45 +++--- src/analysis/disass/fetch.c | 118 ++++++---------- src/analysis/disass/fetch.h | 19 +-- src/gtkext/gtkextstatusbar.c | 124 +++++++++++++++++ src/gtkext/gtkextstatusbar.h | 33 +++-- 8 files changed, 373 insertions(+), 286 deletions(-) diff --git a/ChangeLog b/ChangeLog index 37e210a..bf7c4f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +14-12-31 Cyrille Bagard + + * src/analysis/disass/area.c: + * src/analysis/disass/area.h: + Clean the code. Remove all tabulations. + + * src/analysis/disass/disassembler.c: + Resolve links in disassembled instructions. + + * src/analysis/disass/fetch.c: + * src/analysis/disass/fetch.h: + Clean the code. Remove all tabulations. + + * src/gtkext/gtkextstatusbar.c: + * src/gtkext/gtkextstatusbar.h: + Introduce some features to quickly deal with statusbar information. + 14-12-30 Cyrille Bagard * src/analysis/disass/area.c: diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 9d8dcf5..0ec4ad4 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -28,15 +28,15 @@ -#if 0 /* Zone mémoire bien bornée */ -struct _mem_area +typedef struct _mem_area { mrange_t range; /* Couverture de la zone */ unsigned long *processed; /* Octets traités dans la zone */ + GArchInstruction **instructions; /* Instructions en place */ bool has_sym; /* Représentation via symbole ?*/ @@ -46,10 +46,10 @@ struct _mem_area GBinSymbol *symbol; /* Symbole associé à la zone */ }; -}; +} mem_area; + -#endif @@ -76,10 +76,10 @@ static bool mark_range_in_mem_area_as_processed(mem_area *, phys_t, phys_t, GArc /* Procède au désassemblage d'un contenu binaire non exécutable. */ -static void load_data_from_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_info *); +static void load_data_from_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_blob_info *); /* S'assure qu'une aire contient toutes ses instructions. */ -static void fill_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, status_info *); +static void fill_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, status_blob_info *); @@ -240,12 +240,12 @@ static void fini_mem_area(mem_area *area) static bool is_range_blank_in_mem_area(mem_area *area, phys_t start, phys_t len, GArchInstruction *instr) { bool result; /* Bilan à renvoyer */ - phys_t max; /* Point d'arrêt de la boucle */ + phys_t max; /* Point d'arrêt de la boucle */ phys_t i; /* Boucle de parcours */ size_t index; /* Cellule de tableau visée */ unsigned int remaining; /* Nombre de bits restants */ - max = start + len; + max = start + len; assert(max <= get_mrange_length(&area->range)); @@ -282,12 +282,12 @@ static bool is_range_blank_in_mem_area(mem_area *area, phys_t start, phys_t len, static bool mark_range_in_mem_area_as_processed(mem_area *area, phys_t start, phys_t len, GArchInstruction *instr) { - phys_t max; /* Point d'arrêt de la boucle */ + phys_t max; /* Point d'arrêt de la boucle */ phys_t i; /* Boucle de parcours */ size_t index; /* Cellule de tableau visée */ unsigned int remaining; /* Nombre de bits restants */ - max = start + len; + max = start + len; assert(max <= get_mrange_length(&area->range)); @@ -330,7 +330,7 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, phys_t start, ph * * ******************************************************************************/ -void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_info *info) +void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_blob_info *info) { @@ -379,7 +379,7 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const copy_vmpa(&pos, get_mrange_addr(&area->range)); advance_vmpa(&pos, diff); - printf(" [%p] CODE start @ %u (len=%u)\n", area, (unsigned int)diff, (unsigned int)alen); + printf(" [%p] CODE start @ %u (len=%u)\n", area, (unsigned int)diff, (unsigned int)alen); for (i = diff; i < alen; i += diff) { @@ -391,7 +391,7 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const instr = g_arch_processor_disassemble(proc, ctx, bin_data, &pos, bin_length); - //printf(" @ 0x%08x -> %p\n", (uint32_t)get_virt_addr(&prev), instr); + //printf(" @ 0x%08x -> %p\n", (uint32_t)get_virt_addr(&prev), instr); if (instr == NULL) break; @@ -414,15 +414,9 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const mark_range_in_mem_areas_as_processed(list, count, instr); - //done += (new_phy - old_phy); - //gtk_extended_status_bar_update_activity(statusbar, id, done * 1.0 / sum); - - - - - - + inc_progessive_status(info, diff); + assert(!is_range_blank_in_mem_areas(list, count, &range)); } @@ -451,11 +445,11 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const * * ******************************************************************************/ -static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_info *info) +static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_blob_info *info) { GBinFormat *format; /* Format du fichier binaire */ GArchProcessor *proc; /* Architecture du binaire */ - SourceEndian endianness; /* Boutisme de cette machine */ + SourceEndian endianness; /* Boutisme de cette machine */ off_t bin_length; /* Taille des données à lire */ bin_t *bin_data; /* Données binaires à lire */ phys_t diff; /* Volume de données traité */ @@ -476,7 +470,7 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); proc = get_arch_processor_from_format(G_EXE_FORMAT(format)); - endianness = g_arch_processor_get_endianness(proc); + endianness = g_arch_processor_get_endianness(proc); bin_data = g_loaded_binary_get_data(binary, &bin_length); diff = compute_vmpa_diff(get_mrange_addr(&area->range), start); @@ -490,8 +484,8 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count copy_vmpa(&pos, get_mrange_addr(&area->range)); advance_vmpa(&pos, diff); - printf(" [%p] DATA start @ 0x%08x -> %u (len=%u)\n", - area, (unsigned int)get_phy_addr(&pos), (unsigned int)diff, (unsigned int)alen); + printf(" [%p] DATA start @ 0x%08x -> %u (len=%u)\n", + area, (unsigned int)get_phy_addr(&pos), (unsigned int)diff, (unsigned int)alen); for (i = diff; i < alen; i += diff) { @@ -499,53 +493,50 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count copy_vmpa(&prev, &pos); - instr = NULL; + instr = NULL; - if (instr == NULL && (i + 4) <= alen) - { - init_mrange(&range, &pos, 4); + if (instr == NULL && (i + 4) <= alen) + { + init_mrange(&range, &pos, 4); - if (is_range_blank_in_mem_areas(list, count, &range)) - instr = g_raw_instruction_new_array(bin_data, MDS_32_BITS, 1, &pos, bin_length, endianness); + if (is_range_blank_in_mem_areas(list, count, &range)) + instr = g_raw_instruction_new_array(bin_data, MDS_32_BITS, 1, &pos, bin_length, endianness); - } + } - if (instr == NULL && (i + 2) <= alen) - { - copy_vmpa(&pos, &prev); - init_mrange(&range, &pos, 2); + if (instr == NULL && (i + 2) <= alen) + { + copy_vmpa(&pos, &prev); + init_mrange(&range, &pos, 2); - if (is_range_blank_in_mem_areas(list, count, &range)) - instr = g_raw_instruction_new_array(bin_data, MDS_16_BITS, 1, &pos, bin_length, endianness); + if (is_range_blank_in_mem_areas(list, count, &range)) + instr = g_raw_instruction_new_array(bin_data, MDS_16_BITS, 1, &pos, bin_length, endianness); - } + } - if (instr == NULL/* && (i + 1) <= alen*/) - { - copy_vmpa(&pos, &prev); - init_mrange(&range, &pos, 1); + if (instr == NULL/* && (i + 1) <= alen*/) + { + copy_vmpa(&pos, &prev); + init_mrange(&range, &pos, 1); - if (is_range_blank_in_mem_areas(list, count, &range)) - instr = g_raw_instruction_new_array(bin_data, MDS_8_BITS, 1, &pos, bin_length, endianness); - else - { - printf(" break !! 0x%08x\n", - (unsigned int)get_phy_addr(&pos)); - assert(0); - break; - } + if (is_range_blank_in_mem_areas(list, count, &range)) + instr = g_raw_instruction_new_array(bin_data, MDS_8_BITS, 1, &pos, bin_length, endianness); + else + { + printf(" break !! 0x%08x\n", + (unsigned int)get_phy_addr(&pos)); + assert(0); + break; + } - } + } - assert(instr != NULL); + assert(instr != NULL); /* Enregistrement des positions et adresses */ diff = compute_vmpa_diff(&prev, &pos); - printf(" decomp @ 0x%08x -> ++ %u\n", - (unsigned int)get_phy_addr(&pos), (unsigned int)diff); - init_mrange(&range, &prev, diff); g_arch_instruction_set_range(instr, &range); @@ -554,10 +545,9 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count mark_range_in_mem_areas_as_processed(list, count, instr); - assert(!is_range_blank_in_mem_areas(list, count, &range)); + inc_progessive_status(info, diff); - //done += (new_phy - old_phy); - //gtk_extended_status_bar_update_activity(statusbar, id, done * 1.0 / sum); + assert(!is_range_blank_in_mem_areas(list, count, &range)); } @@ -581,40 +571,40 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count * * ******************************************************************************/ -static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_info *info) +static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_blob_info *info) { - phys_t len; /* Taille de la zone à remplir */ + phys_t len; /* Taille de la zone à remplir */ phys_t i; /* Boucle de parcours */ - vmpa2t start; /* Adresse de départ de combles*/ + vmpa2t start; /* Adresse de départ de combles*/ - printf(" === FILLING | 0x%08x (%u)...\n", - (unsigned int)get_phy_addr(get_mrange_addr(&area->range)), - (unsigned int)get_phy_addr(get_mrange_addr(&area->range))); + printf(" === FILLING | 0x%08x (%u)...\n", + (unsigned int)get_phy_addr(get_mrange_addr(&area->range)), + (unsigned int)get_phy_addr(get_mrange_addr(&area->range))); - /* Les symboles se doivent d'être indépendants ! */ - if (area->has_sym) return; + /* Les symboles se doivent d'être indépendants ! */ + if (area->has_sym) return; len = get_mrange_length(&area->range); for (i = 0; i < len; i++) { - if (is_range_blank_in_mem_area(area, i, 1, NULL)) - { - copy_vmpa(&start, get_mrange_addr(&area->range)); - advance_vmpa(&start, i); + if (is_range_blank_in_mem_area(area, i, 1, NULL)) + { + copy_vmpa(&start, get_mrange_addr(&area->range)); + advance_vmpa(&start, i); - if (area->exec) - load_code_from_mem_area(area, list, count, binary, ctx, &start, info); + if (area->exec) + load_code_from_mem_area(area, list, count, binary, ctx, &start, info); - if (is_range_blank_in_mem_area(area, i, 1, NULL)) - load_data_from_mem_area(area, list, count, binary, ctx, &start, info); + if (is_range_blank_in_mem_area(area, i, 1, NULL)) + load_data_from_mem_area(area, list, count, binary, ctx, &start, info); - } + } - if (is_range_blank_in_mem_area(area, i, 1, NULL)) - printf(" [%p] error with %u\n", area, (unsigned int)i); + if (is_range_blank_in_mem_area(area, i, 1, NULL)) + printf(" [%p] error with %u\n", area, (unsigned int)i); assert(!is_range_blank_in_mem_area(area, i, 1, NULL)); @@ -638,51 +628,51 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GL static GArchInstruction *get_instructions_from_mem_area(const mem_area *area) { GArchInstruction *result; /* Liste d'instr. à renvoyer */ - phys_t len; /* Nombre d'instructions au max*/ - phys_t i; /* Boucle de parcours */ + phys_t len; /* Nombre d'instructions au max*/ + phys_t i; /* Boucle de parcours */ GArchInstruction *instr; /* Instruction décodée */ result = NULL; - if (area->has_sym) - switch (g_binary_symbol_get_target_type(area->symbol)) - { - case STP_DATA: - result = g_binary_symbol_get_instruction(area->symbol); - g_object_ref(G_OBJECT(result)); - break; + if (area->has_sym) + switch (g_binary_symbol_get_target_type(area->symbol)) + { + case STP_DATA: + result = g_binary_symbol_get_instruction(area->symbol); + g_object_ref(G_OBJECT(result)); + break; - case STP_ROUTINE: - assert(false); - //instr = load_code_binary(binary, start, end, statusbar, id); - // + fill - break; + case STP_ROUTINE: + assert(false); + //instr = load_code_binary(binary, start, end, statusbar, id); + // + fill + break; - default: - assert(false); - break; + default: + assert(false); + break; - } + } - else - { - len = get_mrange_length(&area->range); + else + { + len = get_mrange_length(&area->range); - for (i = 0; i < len; i++) - { - instr = area->instructions[i]; + for (i = 0; i < len; i++) + { + instr = area->instructions[i]; - if (instr != NULL) - { - g_object_ref(G_OBJECT(instr)); - g_arch_instruction_add_to_list(&result, instr); - } + if (instr != NULL) + { + g_object_ref(G_OBJECT(instr)); + g_arch_instruction_add_to_list(&result, instr); + } - } + } - } + } - return result; + return result; } @@ -771,15 +761,15 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co for (i = 0; i < exe_count; i++) { - printf(" (init) AREA %zu :: 0x%08x + %u\n", - i, - (unsigned int)get_phy_addr(get_mrange_addr(&exe_ranges[i])), - (unsigned int)get_mrange_length(&exe_ranges[i])); + printf(" (init) AREA %zu :: 0x%08x + %u\n", + i, + (unsigned int)get_phy_addr(get_mrange_addr(&exe_ranges[i])), + (unsigned int)get_mrange_length(&exe_ranges[i])); - } + } - printf("----------------\n"); + printf("----------------\n"); @@ -850,12 +840,12 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co for (i = 0; i < *count; i++) { - printf(" (fini) AREA %zu :: 0x%08x + %u\n", - i, - (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)), - (unsigned int)get_mrange_length(&result[i].range)); + printf(" (fini) AREA %zu :: 0x%08x + %u\n", + i, + (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)), + (unsigned int)get_mrange_length(&result[i].range)); - } + } printf("--------------------\n"); @@ -916,15 +906,15 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co for (i = 0; i < *count; i++) { - printf(" (sect) AREA %zu :: 0x%08x + %u\n", - i, - (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)), - (unsigned int)get_mrange_length(&result[i].range)); + printf(" (sect) AREA %zu :: 0x%08x + %u\n", + i, + (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)), + (unsigned int)get_mrange_length(&result[i].range)); - } + } - //exit(0); + //exit(0); @@ -1103,11 +1093,6 @@ mem_area *find_memory_area_by_addr(mem_area *list, size_t count, const vmpa2t *a } - - - - - /****************************************************************************** * * * Paramètres : list = liste de zones délimitant des contenus à traiter. * @@ -1135,7 +1120,6 @@ static bool handle_bytes_map_in_mem_area(mem_area *list, size_t count, const mra result = false; area = find_memory_area_by_addr(list, count, get_mrange_addr(range)); - if (area == NULL) printf("NOT FOUND!\n"); if (area == NULL) return false; offset = compute_vmpa_diff(get_mrange_addr(&area->range), get_mrange_addr(range)); @@ -1148,7 +1132,7 @@ static bool handle_bytes_map_in_mem_area(mem_area *list, size_t count, const mra else { - assert(0); + assert(0); /* Traitement de la fin de la première aire */ @@ -1247,12 +1231,12 @@ static bool mark_range_in_mem_areas_as_processed(mem_area *list, size_t count, G * * ******************************************************************************/ -void ensure_all_mem_areas_are_filled(mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_info *info) +void ensure_all_mem_areas_are_filled(mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_blob_info *info) { - size_t i; /* Boucle de parcours */ + size_t i; /* Boucle de parcours */ - for (i = 0; i < count; i++) - fill_mem_area(&list[i], list, count, binary, ctx, info); + for (i = 0; i < count; i++) + fill_mem_area(&list[i], list, count, binary, ctx, info); } @@ -1273,17 +1257,17 @@ void ensure_all_mem_areas_are_filled(mem_area *list, size_t count, const GLoaded GArchInstruction *collect_instructions_from_mem_areas(mem_area *list, size_t count) { GArchInstruction *result; /* Liste d'instr. à renvoyer */ - size_t i; /* Boucle de parcours */ + size_t i; /* Boucle de parcours */ GArchInstruction *instr; /* Instruction(s) à insérer */ - result = NULL; + result = NULL; - for (i = 0; i < count; i++) - { - instr = get_instructions_from_mem_area(&list[i]); + for (i = 0; i < count; i++) + { + instr = get_instructions_from_mem_area(&list[i]); g_arch_instruction_merge_lists(&result, &instr); - } + } - return result; + return result; } diff --git a/src/analysis/disass/area.h b/src/analysis/disass/area.h index 58539ca..2e80b04 100644 --- a/src/analysis/disass/area.h +++ b/src/analysis/disass/area.h @@ -37,34 +37,15 @@ /* Zone mémoire bien bornée */ -typedef struct _mem_area -{ - mrange_t range; /* Couverture de la zone */ +typedef struct _mem_area mem_area; - unsigned long *processed; /* Octets traités dans la zone */ - GArchInstruction **instructions; /* Instructions en place */ - bool has_sym; /* Représentation via symbole ?*/ - - union - { - bool exec; /* Zone exécutable ? */ - GBinSymbol *symbol; /* Symbole associé à la zone */ - }; - -} mem_area; - - - - -/* Zone mémoire bien bornée */ -//typedef struct _mem_area mem_area; /* Procède au désassemblage d'un contenu binaire exécutable. */ -void load_code_from_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_info *); +void load_code_from_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_blob_info *); @@ -86,7 +67,7 @@ mem_area *find_memory_area_by_addr(mem_area *, size_t, const vmpa2t *); /* S'assure que l'ensemble des aires est entièrement décodé. */ -void ensure_all_mem_areas_are_filled(mem_area *, size_t, const GLoadedBinary *, GProcContext *, status_info *); +void ensure_all_mem_areas_are_filled(mem_area *, size_t, const GLoadedBinary *, GProcContext *, status_blob_info *); /* Rassemble les instructions conservées dans des zones données. */ GArchInstruction *collect_instructions_from_mem_areas(mem_area *, size_t); diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index e20429c..77e64d7 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -29,7 +29,7 @@ #include -#include +#include ///// #include "fetch.h" @@ -191,7 +191,7 @@ static GDelayedDisassembly *g_delayed_disassembly_new(GLoadedBinary *binary, GBi * Remarques : - * * * ******************************************************************************/ -#include "../../arch/vmpa.h" + #include #include @@ -213,10 +213,6 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta - vmpa2t base; - - - clock_t begin, end; double time_spent; @@ -229,10 +225,8 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta /* Première étape */ - id = gtk_extended_status_bar_push(statusbar, _("Disassembling..."), true); - + //id = gtk_extended_status_bar_push(statusbar, _("Disassembling..."), true); - init_vmpa(&base, 0, 0); @@ -243,10 +237,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta ustart += usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec; - //*disass->instrs = load_raw_binary(disass->binary, &base, 314744/*100*/, statusbar, id); - - - *disass->instrs = disassemble_binary_content(disass->binary, statusbar, id); + *disass->instrs = disassemble_binary_content(disass->binary, statusbar); @@ -271,19 +262,41 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta - gtk_extended_status_bar_remove(statusbar, id); + //gtk_extended_status_bar_remove(statusbar, id); run_plugins_on_binary(disass->binary, PGA_BINARY_DISASSEMBLED, true); + do + { + GBinFormat *format; /* Format du fichier binaire */ + GArchInstruction *iter; /* Boucle de parcours */ + + + + format = G_BIN_FORMAT(g_loaded_binary_get_format(disass->binary)); + + for (iter = *disass->instrs; + iter != NULL; + iter = g_arch_instruction_get_next_iter(*disass->instrs, iter, 0)) + { + + g_arch_instruction_call_hook(iter, IPH_POST, /*ctx*/NULL, format); + + + } + + + + } while (0); /* Septième étape */ - id = gtk_extended_status_bar_push(statusbar, _("Printing disassembled code..."), true); + //id = gtk_extended_status_bar_push(statusbar, _("Printing disassembled code..."), true); qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_compare); @@ -315,7 +328,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta printf("[[ TIME ]] Printing :: %.2g (%.2g)\n", time_spent, (uend - ustart) / 1000000.0); - gtk_extended_status_bar_remove(statusbar, id); + //gtk_extended_status_bar_remove(statusbar, id); run_plugins_on_binary(disass->binary, PGA_BINARY_PRINTED, true); diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c index 8bddaa1..2e9eb81 100644 --- a/src/analysis/disass/fetch.c +++ b/src/analysis/disass/fetch.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * fetch.c - récupération d'instructions à partir de binaire brut * - * Copyright (C) 2010-2013 Cyrille Bagard + * Copyright (C) 2010-2014 Cyrille Bagard * * This file is part of Chrysalide. * @@ -24,19 +24,15 @@ #include "fetch.h" -#include "area.h" - - - - -/* Suit un flot d'exécution pour désassembler du code. */ -static void follow_execution_flow(const GLoadedBinary *, GProcContext *, mem_area *, size_t, status_info *, virt_t); - +#include +#include "area.h" +/* Suit un flot d'exécution pour désassembler du code. */ +static void follow_execution_flow(const GLoadedBinary *, GProcContext *, mem_area *, size_t, status_blob_info *, virt_t); @@ -57,23 +53,11 @@ static void follow_execution_flow(const GLoadedBinary *, GProcContext *, mem_are * * ******************************************************************************/ -static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx, mem_area *areas, size_t count, status_info *info, virt_t virt) +static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx, mem_area *areas, size_t count, status_blob_info *info, virt_t virt) { - - - - - vmpa2t addr; /* Conversion en pleine adresse*/ - - mem_area *area; /* Zone de désassemblage */ - - - - - g_proc_context_push_drop_point(ctx, virt); while (g_proc_context_has_drop_points(ctx)) @@ -81,45 +65,15 @@ static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx virt = g_proc_context_pop_drop_point(ctx); init_vmpa(&addr, VMPA_NO_PHYSICAL, virt); - area = find_memory_area_by_addr(areas, count, &addr); - /* - printf("found area = %p\n", area); - - printf(" ... 0x%08x - 0x%08x + %u\n", - area->range.addr.physical, - area->range.addr.virtual, - area->range.length); - */ - - load_code_from_mem_area(area, areas, count, binary, ctx, &addr, info); - - - //exit(0); - } } - - - - - - - - - - - - - - - /****************************************************************************** * * * Paramètres : binary = représentation de binaire chargé. * @@ -134,51 +88,42 @@ static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx * * ******************************************************************************/ -GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExtStatusBar *statusbar, bstatus_id_t id) +GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExtStatusBar *statusbar) { GArchInstruction *result; /* Instruction désassemblées */ - GBinFormat *format; /* Format du fichier binaire */ GArchProcessor *proc; /* Architecture du binaire */ - GProcContext *ctx; /* Contexte de désassemblage */ - - status_info *info; - off_t length; /* Taille des données à lire */ mem_area *areas; /* Zone de productions */ size_t count; /* Nombre de ces zones */ - - + status_blob_info *info; /* Informations de progression */ virt_t virt; /* Point d'accroche virtuelle */ - GBinSymbol **symbols; /* Symboles à représenter */ size_t sym_count; /* Qté de symboles présents */ - size_t i; /* Boucle de parcours */ - - - const mrange_t *range; /* Couverture d'un symbole */ const vmpa2t *addr; /* Point de départ du symbole */ - - - + double done; /* Portion de travail accompli */ format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); proc = get_arch_processor_from_format(G_EXE_FORMAT(format)); - ctx = g_arch_processor_get_context(proc); - info = NULL; - - /* Définition à la découpe des parties à traiter */ g_loaded_binary_get_data(binary, &length); areas = compute_memory_areas(G_EXE_FORMAT(format), length, &count); + /** + * Première phase de désassemblage : suivi des chemins tracés. + */ + + info = init_progessive_status(statusbar, + _("Disassembling following the execution flow..."), + 0, length); + /* Insertion du point de départ */ virt = g_binary_format_get_entry_point(format); @@ -202,15 +147,36 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt } + done = get_current_progessive_status(info); + + fini_progessive_status(info); + + /** + * Seconde phase : on comble les trous laissés. + */ + + info = init_progessive_status(statusbar, + _("Disassembling the remaining instructions..."), + done, length); + + ensure_all_mem_areas_are_filled(areas, count, binary, ctx, info); + + fini_progessive_status(info); - ensure_all_mem_areas_are_filled(areas, count, binary, ctx, info); + /** + * Troisième et dernière phase : récolte des fruits. + */ + info = init_progessive_status(statusbar, + _("Collecting disassembled instructions..."), + 0, length); + result = collect_instructions_from_mem_areas(areas, count); - result = collect_instructions_from_mem_areas(areas, count); + fini_progessive_status(info); - /* free */ + /* free */ - return result; + return result; } diff --git a/src/analysis/disass/fetch.h b/src/analysis/disass/fetch.h index 96d04a2..0270f78 100644 --- a/src/analysis/disass/fetch.h +++ b/src/analysis/disass/fetch.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * fetch.h - prototypes pour la récupération d'instructions à partir de binaire brut * - * Copyright (C) 2010-2013 Cyrille Bagard + * Copyright (C) 2010-2014 Cyrille Bagard * * This file is part of Chrysalide. * @@ -21,27 +21,18 @@ */ -#ifndef _ANALYSIS_DISASS_INSTR_H -#define _ANALYSIS_DISASS_INSTR_H +#ifndef _ANALYSIS_DISASS_FETCH_H +#define _ANALYSIS_DISASS_FETCH_H #include "../binary.h" -#include "../../format/part.h" #include "../../gtkext/gtkextstatusbar.h" - - -/* Procède au désassemblage basique d'un contenu binaire. */ -GArchInstruction *disassemble_binary_content(const GLoadedBinary *, GtkExtStatusBar *, bstatus_id_t); - - - - /* Procède au désassemblage basique d'un contenu binaire. */ -GArchInstruction *disassemble_binary_parts(const GLoadedBinary *, GBinPart **, size_t, GtkExtStatusBar *, bstatus_id_t); +GArchInstruction *disassemble_binary_content(const GLoadedBinary *, GtkExtStatusBar *); -#endif /* _ANALYSIS_DISASS_INSTR_H */ +#endif /* _ANALYSIS_DISASS_FETCH_H */ diff --git a/src/gtkext/gtkextstatusbar.c b/src/gtkext/gtkextstatusbar.c index 1d55a0d..5fd37fe 100644 --- a/src/gtkext/gtkextstatusbar.c +++ b/src/gtkext/gtkextstatusbar.c @@ -24,6 +24,7 @@ #include "gtkextstatusbar.h" +#include #include #include @@ -110,6 +111,22 @@ static void _gtk_extended_status_bar_update_activity(GtkExtStatusBar *); +/* -------------------------- GESTION EN VUE MACROSCOPIQUE -------------------------- */ + + +/* Concentré d'informations utiles */ +struct _status_blob_info +{ + GtkExtStatusBar *bar; /* Barre de statut utilisée */ + bstatus_id_t id; /* Identifiant du message */ + + double current; /* Valeur courante représentée */ + double max; /* Valeur maximale à atteindre */ + +}; + + + /* ---------------------------------------------------------------------------------- */ /* GESTION EXTERIEURE DE LA BARRE */ /* ---------------------------------------------------------------------------------- */ @@ -480,3 +497,110 @@ static void _gtk_extended_status_bar_update_activity(GtkExtStatusBar *bar) g_mutex_unlock(&bar->stack_access); } + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION EN VUE MACROSCOPIQUE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : bar = barre de statut à manipuler. * +* message = message à afficher pour l'utilisateur. * +* val = valeur de départ à afficher initialement. * +* max = valeur maximale de progression (négative = aucune).* +* * +* Description : Met en place rapidement un message progressiste de statut. * +* * +* Retour : Structure opaque contenant le nécessaire pour les opérations * +* ultérieures. * +* * +* Remarques : - * +* * +******************************************************************************/ + +status_blob_info *init_progessive_status(GtkExtStatusBar *bar, const char *message, double val, double max) +{ + status_blob_info *result; /* Information à retourner */ + + result = (status_blob_info *)calloc(1, sizeof(status_blob_info)); + + g_object_ref(G_OBJECT(bar)); + result->bar = bar; + + result->id = gtk_extended_status_bar_push(bar, message, max > 0.0); + + result->current = 0.0; + result->max = max; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : info = regroupement d'informations à manipuler. * +* * +* Description : Fait disparaître la glue d'affichage de progression. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void fini_progessive_status(status_blob_info *info) +{ + gtk_extended_status_bar_remove(info->bar, info->id); + + g_object_unref(G_OBJECT(info->bar)); + + free(info); + +} + + +/****************************************************************************** +* * +* Paramètres : info = regroupement d'informations à manipuler. * +* * +* Description : Indique la valeur courante utilisée pour la progression. * +* * +* Retour : Valeur courante. * +* * +* Remarques : - * +* * +******************************************************************************/ + +double get_current_progessive_status(const status_blob_info *info) +{ + return info->current; + +} + + +/****************************************************************************** +* * +* Paramètres : info = regroupement d'informations à manipuler. * +* inc = valeur de la progression à prendre en compte. * +* * +* Description : Augmente la progression visible dans la barre de statut. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void inc_progessive_status(status_blob_info *info, double inc) +{ + assert((info->current + inc) < info->max); + + info->current += inc; + + gtk_extended_status_bar_update_activity(info->bar, info->id, info->current / info->max); + +} diff --git a/src/gtkext/gtkextstatusbar.h b/src/gtkext/gtkextstatusbar.h index 779a177..d250b1f 100644 --- a/src/gtkext/gtkextstatusbar.h +++ b/src/gtkext/gtkextstatusbar.h @@ -30,17 +30,7 @@ -typedef struct _status_info -{ - - - void *a; - - //GtkExtStatusBar *statusbar, bstatus_id_t id - -} status_info; - - +/* ------------------------- GESTION EXTERIEURE DE LA BARRE ------------------------- */ #define GTK_TYPE_EXT_STATUS_BAR (gtk_extended_status_bar_get_type()) @@ -77,4 +67,25 @@ void gtk_extended_status_bar_remove(GtkExtStatusBar *, bstatus_id_t); +/* -------------------------- GESTION EN VUE MACROSCOPIQUE -------------------------- */ + + +/* Concentré d'informations utiles */ +typedef struct _status_blob_info status_blob_info; + + +/* Met en place rapidement un message progressiste de statut. */ +status_blob_info *init_progessive_status(GtkExtStatusBar *, const char *, double, double); + +/* Fait disparaître la glue d'affichage de progression. */ +void fini_progessive_status(status_blob_info *); + +/* Indique la valeur courante utilisée pour la progression. */ +double get_current_progessive_status(const status_blob_info *); + +/* Augmente la progression visible dans la barre de statut. */ +void inc_progessive_status(status_blob_info *, double); + + + #endif /* _GTKEXT_GTKEXTSTATUSBAR_H */ -- cgit v0.11.2-87-g4458