diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2015-01-30 23:37:39 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2015-01-30 23:37:39 (GMT) | 
| commit | d246c98c515cb44c5bc4c742a674bae2e824872b (patch) | |
| tree | 2ea1ec27ae5fba761ee778ba4ddb85c7752ebbf5 /src/analysis/disass/fetch.c | |
| parent | 262c95e0b088a56e9fd919edc57ad19f85e2e40e (diff) | |
Bound a symbol for each loaded value for 'ldr' instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@462 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/disass/fetch.c')
| -rw-r--r-- | src/analysis/disass/fetch.c | 60 | 
1 files changed, 49 insertions, 11 deletions
| diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c index 38ea8c0..c3ba2c2 100644 --- a/src/analysis/disass/fetch.c +++ b/src/analysis/disass/fetch.c @@ -24,6 +24,9 @@  #include "fetch.h" +#include <assert.h> + +  #include <i18n.h> @@ -32,7 +35,11 @@  /* 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); +static void follow_execution_flow(const GLoadedBinary *, GProcContext *, mem_area **, size_t *, status_blob_info *, virt_t); + +/* S'assure que l'ensemble des aires est entièrement décodé. */ +static void ensure_all_mem_areas_are_filled(mem_area **, size_t *, const GLoadedBinary *, GProcContext *, status_blob_info *); + @@ -53,10 +60,10 @@ 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_blob_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       */ +    size_t index;                           /* Zone trouvée à traiter      */      printf("-- follow 0x%08x\n", (unsigned int)virt); @@ -72,9 +79,14 @@ static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx          printf("  ++ point 0x%08x\n", (unsigned int)virt); -        area = find_memory_area_by_addr(areas, count, &addr); +        printf("looking area for 0x%08x\n", (unsigned int)virt); + +        index = find_memory_area_by_addr(*areas, *count, &addr); +        if (index ==  *count) continue; + +        assert(index < *count); -        load_code_from_mem_area(area, areas, count, binary, ctx, &addr, info); +        load_code_from_mem_area(areas, count, &index, binary, ctx, &addr, info); @@ -88,6 +100,32 @@ static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx  /******************************************************************************  *                                                                             * +*  Paramètres  : 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.      * +*                info   = indications quant à la progression à afficher.      * +*                                                                             * +*  Description : S'assure que l'ensemble des aires est entièrement décodé.    * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static 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          */ + +    for (i = 0; i < *count; i++) +        fill_mem_area(list, count, &i, binary, ctx, info); + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : binary    = représentation de binaire chargé.                *  *                statusbar = barre de statut avec progression à mettre à jour.*  *                id        = identifiant du message affiché à l'utilisateur.  * @@ -140,12 +178,12 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt      virt = g_binary_format_get_entry_point(format); -    follow_execution_flow(binary, ctx, areas, count, info, 0x84d0); +    follow_execution_flow(binary, ctx, &areas, &count, info, 0x84d0); -    follow_execution_flow(binary, ctx, areas, count, info, 0x84c5); -    follow_execution_flow(binary, ctx, areas, count, info, 0x8a65); +    follow_execution_flow(binary, ctx, &areas, &count, info, 0x84c5); +    follow_execution_flow(binary, ctx, &areas, &count, info, 0x8a65); -    follow_execution_flow(binary, ctx, areas, count, info, virt); +    follow_execution_flow(binary, ctx, &areas, &count, info, virt);      /* Symboles exécutables présents et passés à travers les mailles */ @@ -160,7 +198,7 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt          addr = get_mrange_addr(range);          virt = get_virt_addr(addr); -        follow_execution_flow(binary, ctx, areas, count, info, virt); +        follow_execution_flow(binary, ctx, &areas, &count, info, virt);      } @@ -178,7 +216,7 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt                                    _("Disassembling the remaining instructions..."),                                    done, length); -    ensure_all_mem_areas_are_filled(areas, count, binary, ctx, info); +    ensure_all_mem_areas_are_filled(&areas, &count, binary, ctx, info);      fini_progessive_status(info); | 
