diff options
Diffstat (limited to 'src/analysis')
| -rw-r--r-- | src/analysis/disass/area.c | 88 | ||||
| -rw-r--r-- | src/analysis/disass/area.h | 2 | ||||
| -rw-r--r-- | src/analysis/disass/fetch.c | 8 | 
3 files changed, 77 insertions, 21 deletions
| diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index c52934f..7050c9c 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -102,7 +102,10 @@ static void update_address_as_routine(GBinFormat *, const vmpa2t *);  static void load_data_from_mem_area(mem_area *, GProcContext *, const vmpa2t *, GtkStatusStack *, activity_id_t);  /* S'assure qu'une aire contient toutes ses instructions. */ -static void fill_mem_area(mem_area *, mem_area *, size_t, GProcContext *, GtkStatusStack *, activity_id_t); +static void fill_mem_area_with_code(mem_area *, mem_area *, size_t, GProcContext *, GtkStatusStack *, activity_id_t); + +/* S'assure qu'une aire contient toutes ses instructions. */ +static void fill_mem_area_with_data(mem_area *, mem_area *, size_t, GProcContext *, GtkStatusStack *, activity_id_t);  /* Rassemble les instructions conservées dans une zone donnée. */  static GArchInstruction **get_instructions_from_mem_area(const mem_area *, GArchInstruction **, size_t *); @@ -896,7 +899,56 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp  *                                                                             *  ******************************************************************************/ -static void fill_mem_area(mem_area *area, mem_area *list, size_t count, GProcContext *ctx, GtkStatusStack *status, activity_id_t id) +static void fill_mem_area_with_code(mem_area *area, mem_area *list, size_t count, GProcContext *ctx, GtkStatusStack *status, activity_id_t id) +{ +    const vmpa2t *addr;                     /* Début de la zone à traiter  */ +    phys_t len;                             /* Taille de la zone à remplir */ +    phys_t i;                               /* Boucle de parcours          */ +    vmpa2t start;                           /* Adresse de départ de combles*/ + +    if (area->is_exec) +    { +        addr = get_mrange_addr(&area->range); +        len = get_mrange_length(&area->range); + +        for (i = 0; i < len; i++) +        { +            if (is_range_empty_in_mem_area(area, i, 1)) +            { +                copy_vmpa(&start, addr); +                advance_vmpa(&start, i); + +                if (get_virt_addr(&start) % area->packing_size == 0) +                    load_code_from_mem_area(area, list, count, ctx, &start, false, status, id); + +            } + +        } + +    } + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : area   = aire représentant à contenu à parcourir.            * +*                list   = liste de zones délimitant des contenus à traiter.   * +*                count  = nombre de zones à disposition.                      * +*                binary = représentation de binaire chargé.                   * +*                ctx    = contexte offert en soutien à un désassemblage.      * +*                status = barre de statut à actualiser.                       * +*                id     = identifiant du groupe de progression à l'affichage. * +*                                                                             * +*  Description : S'assure qu'une aire contient toutes ses instructions.       * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void fill_mem_area_with_data(mem_area *area, mem_area *list, size_t count, GProcContext *ctx, GtkStatusStack *status, activity_id_t id)  {      const vmpa2t *addr;                     /* Début de la zone à traiter  */      phys_t len;                             /* Taille de la zone à remplir */ @@ -916,24 +968,17 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, GProcCon              copy_vmpa(&start, addr);              advance_vmpa(&start, i); -            if (area->is_exec && get_virt_addr(&start) % area->packing_size == 0) -                load_code_from_mem_area(area, list, count, ctx, &start, false, status, id); - -            if (is_range_empty_in_mem_area(area, i, 1)) +            if (area->is_exec && err_trigger)              { -                if (area->is_exec && err_trigger) -                { -                    g_arch_processor_add_error(area->proc, APE_DISASSEMBLY, &start, -                                               _("Unable to disassemble code instruction")); +                g_arch_processor_add_error(area->proc, APE_DISASSEMBLY, &start, +                                           _("Unable to disassemble code instruction")); -                    err_trigger = false; - -                } - -                load_data_from_mem_area(area, ctx, &start, status, id); +                err_trigger = false;              } +            load_data_from_mem_area(area, ctx, &start, status, id); +          }          else @@ -1483,7 +1528,7 @@ static void insert_instr_into_mem_areas_forced(mem_area *areas, size_t count, GA  *                                                                             *  *  Paramètres  : areas  = liste de zones délimitant des contenus à traiter.   *  *                count  = nombre de zones à disposition.                      * -*                binary = représentation de binaire chargé.                   * +*                code   = nature des instructions à utiliser pour le comble.  *  *                ctx    = contexte offert en soutien à un désassemblage.      *  *                status = barre de statut à actualiser.                       *  *                id     = identifiant du groupe de progression à l'affichage. * @@ -1496,12 +1541,17 @@ static void insert_instr_into_mem_areas_forced(mem_area *areas, size_t count, GA  *                                                                             *  ******************************************************************************/ -void ensure_all_mem_areas_are_filled(mem_area *areas, size_t count, GProcContext *ctx, GtkStatusStack *status, activity_id_t id) +void ensure_all_mem_areas_are_filled(mem_area *areas, size_t count, bool code, GProcContext *ctx, GtkStatusStack *status, activity_id_t id)  {      size_t i;                               /* Boucle de parcours          */ -    for (i = 0; i < count; i++) -        fill_mem_area(&areas[i], areas, count, ctx, status, id); +    if (code) +        for (i = 0; i < count; i++) +            fill_mem_area_with_code(&areas[i], areas, count, ctx, status, id); + +    else +        for (i = 0; i < count; i++) +            fill_mem_area_with_data(&areas[i], areas, count, ctx, status, id);  } diff --git a/src/analysis/disass/area.h b/src/analysis/disass/area.h index d1e59d9..dc84277 100644 --- a/src/analysis/disass/area.h +++ b/src/analysis/disass/area.h @@ -53,7 +53,7 @@ void load_code_from_mem_area(mem_area *, mem_area *, size_t, GProcContext *, con  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, GProcContext *, GtkStatusStack *, activity_id_t); +void ensure_all_mem_areas_are_filled(mem_area *, size_t, bool, GProcContext *, GtkStatusStack *, activity_id_t); diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c index 03b3ff0..fc1c2ab 100644 --- a/src/analysis/disass/fetch.c +++ b/src/analysis/disass/fetch.c @@ -463,7 +463,7 @@ GArchInstruction **disassemble_binary_content(GLoadedBinary *binary, GProcContex      gtk_status_stack_update_activity(status, template.id, _("Disassembling the remaining instructions...")); -    ensure_all_mem_areas_are_filled(template.areas, template.count, template.ctx, status, template.id); +    ensure_all_mem_areas_are_filled(template.areas, template.count, true, template.ctx, status, template.id);      g_work_queue_wait_for_completion(queue, gid); @@ -471,6 +471,12 @@ GArchInstruction **disassemble_binary_content(GLoadedBinary *binary, GProcContex      g_object_set_data(G_OBJECT(template.ctx), "remaining_counter", NULL); +    gtk_status_stack_update_activity(status, template.id, _("Filling holes with data...")); + +    ensure_all_mem_areas_are_filled(template.areas, template.count, false, template.ctx, status, template.id); + +    g_work_queue_wait_for_completion(queue, gid); +      gtk_status_stack_remove_activity(status, template.id);      /** | 
