summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-01-06 04:25:37 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-01-06 04:25:37 (GMT)
commit104a4a970c98b8846548e03246d7301c3e1eb553 (patch)
tree41d9648ce5365993330c1bf32d8c9c1f1ccc879c /src/analysis
parent6db53b26e6c3d973295df51bb1934d5b42fb6ebe (diff)
Handled some special cases of instruction replacements when disassembling.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/disass/area.c25
1 files changed, 24 insertions, 1 deletions
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);