diff options
| -rw-r--r-- | ChangeLog | 9 | ||||
| -rw-r--r-- | src/analysis/disass/area.c | 137 | ||||
| -rw-r--r-- | src/analysis/disass/area.h | 6 | ||||
| -rw-r--r-- | src/arch/target.c | 2 | 
4 files changed, 81 insertions, 73 deletions
| @@ -1,3 +1,12 @@ +15-02-18  Cyrille Bagard <nocbos@gmail.com> + +	* src/analysis/disass/area.c: +	* src/analysis/disass/area.h: +	Fix a bug by properly reloading a reallocated list of binary areas. + +	* src/arch/target.c: +	Avoid to crash when there is no label linked to a symbol. +  15-02-17  Cyrille Bagard <nocbos@gmail.com>  	* src/analysis/binary.c: diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 974a223..f47e74c 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -89,7 +89,7 @@ static GArchInstruction *get_instructions_from_mem_area(const mem_area *);  /* Insère un symbole dans un découpage en aires. */ -static bool insert_extra_symbol_into_mem_areas(mem_area **, size_t *, size_t *, GBinSymbol *); +static bool insert_extra_symbol_into_mem_areas(mem_area **, size_t *, GBinSymbol *, size_t); @@ -390,15 +390,15 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, phys_t start, ph  *                                                                             *  *  Description : Procède au désassemblage d'un contenu binaire exécutable.    *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Recalcul de rafraîchissement de l'aire de travail requis ?   *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -void load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_blob_info *info) +bool load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_blob_info *info)  { - +    bool result;                            /* Besoin à retourner          */      mem_area *area;                         /* Zone de désassemblage       */ @@ -428,14 +428,14 @@ void load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, cons      bool has_new_sym;                       /* Statut d'un dépilement      */      GBinSymbol *symbol;                     /* Symbole créé en parallèle   */ -    size_t new_index;                       /* Nouvelle position déterminée*/ - +    bool refresh;                           /* Besoin de rafraîchissement  */ +    result = false;      /* On cherche à obtenir l'assurance que le traitement n'a jamais été fait */      init_mrange(&range, start, 1); -    if (!is_range_blank_in_mem_areas(*list, *count, &range)) return; +    if (!is_range_blank_in_mem_areas(*list, *count, &range)) return false;      /* Récupération des informations de base */ @@ -507,39 +507,19 @@ void load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, cons               has_new_sym;               has_new_sym = g_proc_context_pop_new_symbol_at(ctx, &sym_addr))          { -            printf("depop :: %x / %x\n", (unsigned int)sym_addr.physical, (unsigned int)sym_addr.virtual); -            //continue; - -            //if (sym_addr.physical != 0x5bc && sym_addr.physical != 0x5c0) continue; -            //if (sym_addr.physical != 0x5bc) continue; -            //if (sym_addr.physical != 0x5bc && sym_addr.physical != 0x5c0 && sym_addr.physical != 0x5c4) continue; - -              has_new_sym = g_binary_format_find_symbol_at(format, &sym_addr, &symbol);              assert(has_new_sym); -            new_index = *index; -            if (!insert_extra_symbol_into_mem_areas(list, count, &new_index, symbol)) -                continue; +            refresh = insert_extra_symbol_into_mem_areas(list, count, symbol, *index); + +            result |= refresh;              /** -             * Seulement deux cas de figure peuvent intervenir : -             * -             *  - le symbole a été inséré avant la position courante, -             *    dans une autre aire ou en amont dans l'espace de celle courante. -             *    La position courante est alors à recalculer entièrement, -             *    et la boucle de parcours à relancer. -             * -             *  - le symbole a été inséré après la position courante. -             *    Dans le pire des cas, l'aire courante a été diminuée, -             *    et il est juste nécessaire de recalculer la borne de fin. +             * Si une insertion a été réalisée dans la même zone que celle courante ou avant, +             * en l'absence d'indication sur les localisations exactes, le plus simple +             * est de tout recharger.               */ - -            /* On ne peut pas faire disparaître de régions */ -            assert(new_index >= *index); - -            /* Cas n°1 */ -            if (new_index > *index) +            if (refresh)              {                  *index = find_memory_area_by_addr(*list, *count, &pos); @@ -552,14 +532,11 @@ void load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, cons              } -            /* Cas n°2 */ -            else /*if (new_index == *index)*/ -            { -                area = (*list) + *index; - -                alen = get_mrange_length(&area->range); - -            } +            /** +             * Si la zone modifiée se trouve bien après la zone courante, l'emplacement de la liste +             * peut potentiellement avoir évolué. Donc on ne recharge ici que le minimum. +             */ +            else area = (*list) + *index;          } @@ -583,6 +560,7 @@ void load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, cons      g_object_unref(G_OBJECT(proc)); +    return result;  } @@ -771,9 +749,8 @@ void fill_mem_area(mem_area **list, size_t *count, size_t *index, const GLoadedB      phys_t len;                             /* Taille de la zone à remplir */      phys_t i;                               /* Boucle de parcours          */      vmpa2t start;                           /* Adresse de départ de combles*/ -    mem_area *old_list;                     /* Sauvegarde pour comparaison */ -    size_t old_index;                       /* Sauvegarde pour comparaison */ +    bool refresh;                           /* Besoin de rafraîchissement  */      size_t k; @@ -814,13 +791,14 @@ void fill_mem_area(mem_area **list, size_t *count, size_t *index, const GLoadedB              if (area->exec && get_virt_addr(&start) % 2 == 0)              { -                old_list = *list; -                old_index = *index; +                refresh = load_code_from_mem_area(list, count, index, binary, ctx, &start, info); -                load_code_from_mem_area(list, count, index, binary, ctx, &start, info); - -                /* Rechargement si changement */ -                if (*list != old_list || *index != old_index) +                /** +                 * Mêmes commentaires que dans load_code_from_mem_area() : +                 *  - en cas de décalage avéré, on recharge tout. +                 *  - sinon, la liste a potentiellement été déplacée, donc on recharge un minimum. +                 */ +                if (refresh)                  {                      area = (*list) + *index;                      len = get_mrange_length(&area->range); @@ -828,6 +806,7 @@ void fill_mem_area(mem_area **list, size_t *count, size_t *index, const GLoadedB                      i = compute_vmpa_diff(get_mrange_addr(&area->range), &start);                  } +                else area = (*list) + *index;              } @@ -836,11 +815,6 @@ void fill_mem_area(mem_area **list, size_t *count, size_t *index, const GLoadedB          } - -        if (is_range_blank_in_mem_area(area, i, 1, NULL)) -            printf(" [%p] error with %u @ 0x%08x\n", area, (unsigned int)i, -                   (unsigned int)get_phy_addr(get_mrange_addr(&area->range))); -          assert(!is_range_blank_in_mem_area(area, i, 1, NULL));      } @@ -1285,25 +1259,22 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co  /******************************************************************************  *                                                                             * -*  Paramètres  : area   = aire représentant à contenu à parcourir.            * -*                list   = liste de zones délimitant des contenus à traiter.   * -*                count  = nombre de zones à disposition.                      * -*                index  = indice de l'aire à considérer pendant l'opération.  * -*                binary = représentation de binaire chargé.                   * -*                ctx    = contexte offert en soutien à un désassemblage.      * -*                start  = démarrage de l'exécution au sein de la zone.        * -*                info   = indications quant à la progression à afficher.      * +*  Paramètres  : list    = liste de zones délimitant des contenus à traiter.  * +*                count   = nombre de zones à disposition.                     * +*                symbol  = élément nouveau à venir insérer dans les zones.    * +*                working = indice de l'aire de travail courante.              *  *                                                                             *  *  Description : Insère un symbole dans un découpage en aires.                *  *                                                                             * -*  Retour      : -                                                            * +*  Retour      : Recalcul de rafraîchissement de l'aire de travail requis ?   *  *                                                                             *  *  Remarques   : -                                                            *  *                                                                             *  ******************************************************************************/ -static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, size_t *old_index, GBinSymbol *symbol) +static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, GBinSymbol *symbol, size_t working)  { +    bool result;                            /* Besoin à renvoyer           */      const mrange_t *sym_range;              /* Emplacement du symbole      */      size_t index;                           /* Zone trouvée à scinder      */      mem_area *area;                         /* Aire en cours de traitement */ @@ -1319,19 +1290,18 @@ static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, s      index = find_memory_area_by_addr(*list, *count, get_mrange_addr(sym_range));      assert(index < *count); -    //if (index <= *old_index) (*old_index)++; +    result = (working >= index);      area = &(*list)[index]; -    if (strcmp("Value used @ 0x00008a26", g_db_comment_get_text(g_binary_symbol_get_comment(symbol))) == 0) -        printf("break\n"); -      do      {          size_t i; +        printf("--- INDEX = %zu   OLD_INDEX = %zu\n", index, working); +          printf("--- comment '%s'...\n",                 g_db_comment_get_text(g_binary_symbol_get_comment(symbol))); @@ -1348,10 +1318,17 @@ static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, s      }      while (0); -    if (area->has_sym) return true; + + + +    if (area->has_sym) return false;      assert(!area->has_sym); + + + +      saved = *area;      copy_mrange(&area_range, &area->range); @@ -1371,6 +1348,20 @@ static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, s      } +    /* Si le symbole a une taille identique à la zone qui le contient, on remplace simplement... */ +    if (get_mrange_length(&area_range) == get_mrange_length(sym_range)) +    { +        assert((cmp_vmpa(&area_pos, &sym_pos) == 0)); + +        init_mem_area_from_range(area, sym_range); + +        area->has_sym = true; +        area->symbol = symbol; + +        goto iesima_done; + +    } +      /* Si le symbole se trouve en début de zone... */      if (cmp_vmpa(&area_pos, &sym_pos) == 0)      { @@ -1446,6 +1437,8 @@ static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, s          copy_vmpa(&area_pos, get_mrange_addr(&area_range));          new_length = compute_vmpa_diff(&area_pos, get_mrange_addr(sym_range)); +        assert(new_length != 0);    /* Symbole non présent au début */ +          area = &(*list)[index];          init_mem_area_from_bigger_area(area, &area_pos, new_length, &saved); @@ -1469,6 +1462,8 @@ static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, s          new_length = get_mrange_length(&area_range) - get_mrange_length(sym_range) \              - get_mrange_length(&(*list)[index].range); +        assert(new_length != 0);    /* Symbole non présent à la fin */ +          area = &(*list)[index + 2];          init_mem_area_from_bigger_area(area, &area_pos, new_length, &saved); @@ -1479,7 +1474,7 @@ static bool insert_extra_symbol_into_mem_areas(mem_area **list, size_t *count, s   iesima_done: -    return true; +    return result;  } diff --git a/src/analysis/disass/area.h b/src/analysis/disass/area.h index b517816..35a3533 100644 --- a/src/analysis/disass/area.h +++ b/src/analysis/disass/area.h @@ -25,6 +25,10 @@  #define _ANALYSIS_DISASS_AREA_H +#include <stdbool.h> + + +  #include "../binary.h"  #include "../../format/executable.h"  #include "../../gtkext/gtkextstatusbar.h" @@ -45,7 +49,7 @@ 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 **, size_t *, size_t *, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_blob_info *); +bool load_code_from_mem_area(mem_area **, size_t *, size_t *, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_blob_info *); diff --git a/src/arch/target.c b/src/arch/target.c index 93ccbe4..40e9598 100644 --- a/src/arch/target.c +++ b/src/arch/target.c @@ -216,7 +216,7 @@ static void g_target_operand_print(const GTargetOperand *operand, GBufferLine *l      VMPA_BUFFER(value);                     /* Adresse brute à imprimer    */      size_t len;                             /* Taille de l'élément inséré  */ -    if (operand->symbol != NULL) +    if (operand->symbol != NULL /* FIXME */ && g_binary_symbol_get_label(operand->symbol) != NULL /* FIXME */)      {          if (operand->diff > 0)              g_buffer_line_insert_text(line, BLC_MAIN, "<", 1, RTT_LTGT); | 
