summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog17
-rw-r--r--src/analysis/disass/area.c278
-rw-r--r--src/analysis/disass/area.h25
-rw-r--r--src/analysis/disass/disassembler.c45
-rw-r--r--src/analysis/disass/fetch.c118
-rw-r--r--src/analysis/disass/fetch.h19
-rw-r--r--src/gtkext/gtkextstatusbar.c124
-rw-r--r--src/gtkext/gtkextstatusbar.h33
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 <nocbos@gmail.com>
+
+ * 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 <nocbos@gmail.com>
* 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 <string.h>
-#include <i18n.h>
+#include <i18n.h> /////
#include "fetch.h"
@@ -191,7 +191,7 @@ static GDelayedDisassembly *g_delayed_disassembly_new(GLoadedBinary *binary, GBi
* Remarques : - *
* *
******************************************************************************/
-#include "../../arch/vmpa.h"
+
#include <time.h>
#include <sys/time.h>
@@ -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 <i18n.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_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 <assert.h>
#include <malloc.h>
#include <string.h>
@@ -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 */