From 104a4a970c98b8846548e03246d7301c3e1eb553 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Fri, 6 Jan 2017 05:25:37 +0100 Subject: Handled some special cases of instruction replacements when disassembling. --- ChangeLog | 5 +++++ src/analysis/disass/area.c | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 729c4ad..4429480 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 17-01-06 Cyrille Bagard + * src/analysis/disass/area.c: + Handle some special cases of instruction replacements when disassembling. + +17-01-06 Cyrille Bagard + * src/arch/arm/v7/fetch.c: * src/common/sort.c: Update code. diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index a22f65a..84103e0 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -331,7 +331,30 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction if (result) { - assert(area->instructions[offset] == NULL); + 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. + * + * Cette valeur est référencée en tant que symbole. + * + * Mais cette même valeur a pu être désassemblée en tant que code + * exécutable si le flot d'exécution s'est poursuivi jusqu'à elle. + * + * 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()). + */ + + if (area->instructions[offset] != NULL) + { + range = g_arch_instruction_get_range(area->instructions[offset]); + assert(len == get_mrange_length(range)); + } +#endif area->instructions[offset] = instr; g_atomic_pointer_add(&area->count, 1); -- cgit v0.11.2-87-g4458