diff options
Diffstat (limited to 'src/analysis/disass')
-rw-r--r-- | src/analysis/disass/disassembler.c | 156 | ||||
-rw-r--r-- | src/analysis/disass/fetch.c | 122 | ||||
-rw-r--r-- | src/analysis/disass/fetch.h | 7 | ||||
-rw-r--r-- | src/analysis/disass/output.c | 4 |
4 files changed, 280 insertions, 9 deletions
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index 8020e02..9344089 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -191,9 +191,149 @@ static GDelayedDisassembly *g_delayed_disassembly_new(GLoadedBinary *binary, GBi * Remarques : - * * * ******************************************************************************/ +#include "../../arch/vmpa.h" +#include <time.h> + +#include <sys/time.h> +#include <sys/resource.h> static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtStatusBar *statusbar) { + + + unsigned int valid; /* Instructions traduites */ + unsigned int db; /* Instructions non décodées */ + unsigned int valid_sum; /* Instructions traduites */ + unsigned int instr_sum; /* Instructions totales */ + size_t i; /* Boucle de parcours */ + + GBinRoutine **routines; /* Liste des routines trouvées */ + size_t routines_count; /* Nombre de ces routines */ + bstatus_id_t id; /* Identifiant de statut */ + + + + vmpa2t base; + + + + clock_t begin, end; + double time_spent; + + + struct rusage usage; + unsigned long ustart; + unsigned long uend; + + + + /* Première étape */ + + id = gtk_extended_status_bar_push(statusbar, _("Disassembling..."), true); + + + init_vmpa(&base, 0, 0); + + + + begin = clock(); + + getrusage(RUSAGE_THREAD, &usage); + ustart = usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec; + ustart += usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec; + + + *disass->instrs = load_raw_binary(disass->binary, &base, 100, statusbar, id); + + /* + *disass->instrs = disassemble_binary_parts(disass->binary, disass->parts, disass->count, + statusbar, id); + */ + + + + getrusage(RUSAGE_THREAD, &usage); + uend = usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec; + uend += usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec; + + + end = clock(); + + time_spent = (double)(end - begin) / CLOCKS_PER_SEC; + + printf("[[ TIME ]] Disassembly :: %.2g (%.2g)\n", time_spent, (uend - ustart) / 1000000.0); + + + + + gtk_extended_status_bar_remove(statusbar, id); + + + run_plugins_on_binary(disass->binary, PGA_BINARY_DISASSEMBLED, true); + + + + + + + /* Septième étape */ + + id = gtk_extended_status_bar_push(statusbar, _("Printing disassembled code..."), true); + + qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_compare); + + + begin = clock(); + + + getrusage(RUSAGE_THREAD, &usage); + ustart = usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec; + ustart += usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec; + + + print_disassembled_instructions(disass->buffer, disass->format, *disass->instrs, + routines, routines_count, statusbar, id); + + + + + + getrusage(RUSAGE_THREAD, &usage); + uend = usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec; + uend += usage.ru_stime.tv_sec * 1000000 + usage.ru_stime.tv_usec; + + + end = clock(); + + time_spent = (double)(end - begin) / CLOCKS_PER_SEC; + + printf("[[ TIME ]] Printing :: %.2g (%.2g)\n", time_spent, (uend - ustart) / 1000000.0); + + + gtk_extended_status_bar_remove(statusbar, id); + + run_plugins_on_binary(disass->binary, PGA_BINARY_PRINTED, true); + + + +} + + +/****************************************************************************** +* * +* Paramètres : disass = analyse à mener. * +* statusbar = barre de statut à tenir informée. * +* * +* Description : Assure le désassemblage en différé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_delayed_disassembly_process_old(GDelayedDisassembly *disass, GtkExtStatusBar *statusbar) +{ #ifdef DEBUG unsigned int valid; /* Instructions traduites */ unsigned int db; /* Instructions non décodées */ @@ -339,20 +479,20 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con output = g_asm_output_new(); line = g_lang_output_start_comments(output, buffer); - if (line != NULL) g_buffer_line_start_merge_at(line, BLC_ADDRESS); + if (line != NULL) g_buffer_line_start_merge_at(line, BLC_PHYSICAL); /* Introduction */ line = g_lang_output_continue_comments(output, buffer, SL(_("Disassembly generated by Chrysalide"))); - g_buffer_line_start_merge_at(line, BLC_ADDRESS); + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); line = g_lang_output_continue_comments(output, buffer, SL(_("Chrysalide is free software - © 2008-2014 Cyrille Bagard"))); - g_buffer_line_start_merge_at(line, BLC_ADDRESS); + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); line = g_lang_output_continue_comments(output, buffer, NULL, 0); - g_buffer_line_start_merge_at(line, BLC_ADDRESS); + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); /* Fichier */ @@ -362,7 +502,7 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con snprintf(content, len, "%s%s", _("File: "), filename); line = g_lang_output_continue_comments(output, buffer, content, len - 1); - g_buffer_line_start_merge_at(line, BLC_ADDRESS); + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); free(content); @@ -381,19 +521,19 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con g_checksum_free(checksum); line = g_lang_output_continue_comments(output, buffer, content, len - 1); - g_buffer_line_start_merge_at(line, BLC_ADDRESS); + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); free(content); /* Ligne de séparation */ line = g_lang_output_continue_comments(output, buffer, NULL, 0); - g_buffer_line_start_merge_at(line, BLC_ADDRESS); + g_buffer_line_start_merge_at(line, BLC_PHYSICAL); /* Conclusion */ line = g_lang_output_end_comments(output, buffer); - if (line != NULL) g_buffer_line_start_merge_at(line, BLC_ADDRESS); + if (line != NULL) g_buffer_line_start_merge_at(line, BLC_PHYSICAL); g_object_unref(G_OBJECT(output)); diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c index 17eea6a..4686fe2 100644 --- a/src/analysis/disass/fetch.c +++ b/src/analysis/disass/fetch.c @@ -23,6 +23,117 @@ #include "fetch.h" + +#include "../../arch/artificial.h" + + + + + + + + +/****************************************************************************** +* * +* Paramètres : binary = représentation de binaire chargé. * +* parts = parties binaires à désassembler. * +* count = nombre de parties à traiter. * +* statusbar = barre de statut avec progression à mettre à jour.* +* id = identifiant du message affiché à l'utilisateur. * +* * +* Description : Procède au désassemblage basique d'un contenu binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +GArchInstruction *load_raw_binary(const GLoadedBinary *binary, const vmpa2t *base, off_t end, GtkExtStatusBar *statusbar, bstatus_id_t id) +{ + GArchInstruction *result; /* Liste d'instr. à renvoyer */ + GBinFormat *format; /* Format du fichier binaire */ + GArchProcessor *proc; /* Architecture du binaire */ + off_t bin_length; /* Taille des données à lire */ + bin_t *bin_data; /* Données binaires à lire */ + vmpa2t *pos; /* Boucle de parcours */ + vmpa2t *prev; /* Boucle de parcours */ + off_t old_phy; /* Ancienne position physique */ + GArchInstruction *instr; /* Instruction décodée */ + off_t new_phy; /* Nouvelle position physique */ + + result = NULL; + + format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + proc = get_arch_processor_from_format(G_EXE_FORMAT(format)); + bin_data = g_loaded_binary_get_data(binary, &bin_length); + + end = bin_length; + + pos = local_dup_vmpa(base); + prev = local_dup_vmpa(base); + + old_phy = get_phy_addr(prev); + + while (old_phy < end) + { + instr = g_db_instruction_new_from_data(bin_data, pos, end, proc); + if (instr == NULL) break; + + new_phy = get_phy_addr(pos); + + g_arch_instruction_set_location(instr, prev, new_phy - old_phy); + g_arch_instruction_add_to_list(&result, instr); + + copy_vmpa(prev, pos); + old_phy = get_phy_addr(prev); + + //done += (new_phy - old_phy); + //gtk_extended_status_bar_update_activity(statusbar, id, done * 1.0 / sum); + + } + + return result; + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #ifdef DEBUG # include "../../arch/artificial.h" #endif @@ -139,3 +250,14 @@ GArchInstruction *disassemble_binary_parts(const GLoadedBinary *binary, GBinPart return result; } + + + + + + + + + + + diff --git a/src/analysis/disass/fetch.h b/src/analysis/disass/fetch.h index 87f3134..ff62ce8 100644 --- a/src/analysis/disass/fetch.h +++ b/src/analysis/disass/fetch.h @@ -30,6 +30,13 @@ #include "../../gtkext/gtkextstatusbar.h" + + +GArchInstruction *load_raw_binary(const GLoadedBinary *binary, const vmpa2t *base, off_t end, GtkExtStatusBar *statusbar, bstatus_id_t id); + + + + /* Procède au désassemblage basique d'un contenu binaire. */ GArchInstruction *disassemble_binary_parts(const GLoadedBinary *, GBinPart **, size_t, GtkExtStatusBar *, bstatus_id_t); diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c index fd7efce..97f9989 100644 --- a/src/analysis/disass/output.c +++ b/src/analysis/disass/output.c @@ -76,6 +76,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form iter != NULL; iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX)) { +#if 0 g_arch_instruction_get_location(iter, NULL, NULL, &iaddr); /* Ajout des prototypes de fonction */ @@ -87,10 +88,11 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form g_binary_routine_output_info(routines[i], output, buffer); } +#endif g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL); - gtk_extended_status_bar_update_activity(statusbar, id, (iaddr - start) * 1.0 / (end - start)); + //gtk_extended_status_bar_update_activity(statusbar, id, (iaddr - start) * 1.0 / (end - start)); } |