From 56e060d11c238ac7c7b3ecf0eb0527bbaebd5b4b Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 15 Jan 2017 10:56:05 +0100 Subject: Ensured that symbols always take priority over the disassembled code. --- ChangeLog | 6 ++++++ src/analysis/disass/area.c | 20 ++++++++++++++------ src/format/format.c | 2 ++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82d5060..3339d96 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 17-01-15 Cyrille Bagard + * src/analysis/disass/area.c: + * src/format/format.c: + Ensure that symbols always take priority over the disassembled code. + +17-01-15 Cyrille Bagard + * src/analysis/db/items/comment.c: Match the perfect line index. diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 84103e0..7eacc29 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -314,6 +314,8 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction const vmpa2t *addr; /* Début de la zone à traiter */ phys_t len; /* Taille de l'aire visée */ phys_t offset; /* Décallage de départ */ + phys_t i; /* Boucle de parcours */ + GArchInstruction *old; /* Instruction remplacée */ start = get_mrange_addr(&area->range); @@ -333,8 +335,6 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction { assert(area->instructions[offset] == NULL || force); -#ifndef NDEBUG - /** * Un cas de remplacement forcé intervient en ARM, lorsque qu'une * instruction utilise une valeur immédiate placée dans le code. @@ -347,14 +347,22 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction * C'est par exemple le cas lors de l'utilisation d'appels système * en assembleur, qui ne sont pas reconnus en tant qu'instructions * cassant le flot d'exécution (typiquement : un exit()). + * + * On réinitialise donc la zone couverte par la nouvelle instruction. */ - if (area->instructions[offset] != NULL) + for (i = 0; force && i < len; i++) { - range = g_arch_instruction_get_range(area->instructions[offset]); - assert(len == get_mrange_length(range)); + old = area->instructions[offset + i]; + + if (old != NULL) + { + g_object_unref(G_OBJECT(old)); + area->instructions[offset + 1] = NULL; + g_atomic_pointer_add(&area->count, -1); + } + } -#endif area->instructions[offset] = instr; g_atomic_pointer_add(&area->count, 1); diff --git a/src/format/format.c b/src/format/format.c index be522cb..550e816 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -334,6 +334,8 @@ bool g_binary_format_add_symbol(GBinFormat *format, GBinSymbol *symbol) format->symbols = _qinsert(format->symbols, &format->symbols_count, sizeof(GBinSymbol *), &symbol, index); + result = true; + switch (g_binary_symbol_get_target_type(symbol)) { case STP_ROUTINE: -- cgit v0.11.2-87-g4458