summaryrefslogtreecommitdiff
path: root/src/analysis/disass/fetch.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-01-30 23:37:39 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-01-30 23:37:39 (GMT)
commitd246c98c515cb44c5bc4c742a674bae2e824872b (patch)
tree2ea1ec27ae5fba761ee778ba4ddb85c7752ebbf5 /src/analysis/disass/fetch.c
parent262c95e0b088a56e9fd919edc57ad19f85e2e40e (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.c60
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);