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); |