diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-08-05 20:19:08 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-08-05 20:19:08 (GMT) |
commit | 56ee4d3ecddeee05f11083fcc1595e3756b91790 (patch) | |
tree | 5ec6e5449214093280629047c36016a0de09cbeb /src/analysis/disass/disassembler.c | |
parent | a2eb5483fe74923e488013b2d8b94ded6340499e (diff) |
Defined the first steps for a new disassembling approach.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@387 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/disass/disassembler.c')
-rw-r--r-- | src/analysis/disass/disassembler.c | 156 |
1 files changed, 148 insertions, 8 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)); |