summaryrefslogtreecommitdiff
path: root/plugins/dalvik/v35
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-06-10 12:44:11 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-06-10 12:44:11 (GMT)
commit60160c213f574ba1386a954d4c3fa4bf3435782e (patch)
treeb629c08e7fac4e5fd0fd4b534b090f3ea62279a9 /plugins/dalvik/v35
parentb5ae276f78a1c1b1e6410ec4ff79cb68f0b35478 (diff)
Improved Dalvik fill instruction loading and created links to their payload.
Diffstat (limited to 'plugins/dalvik/v35')
-rw-r--r--plugins/dalvik/v35/opdefs/array_26.d7
-rw-r--r--plugins/dalvik/v35/processor.c24
2 files changed, 28 insertions, 3 deletions
diff --git a/plugins/dalvik/v35/opdefs/array_26.d b/plugins/dalvik/v35/opdefs/array_26.d
index efb3261..2236500 100644
--- a/plugins/dalvik/v35/opdefs/array_26.d
+++ b/plugins/dalvik/v35/opdefs/array_26.d
@@ -35,4 +35,11 @@
@format 31t
+ @hooks {
+
+ fetch = help_fetching_with_dalvik_fill_array_data_instruction
+ post = post_process_data_payload_references
+
+ }
+
}
diff --git a/plugins/dalvik/v35/processor.c b/plugins/dalvik/v35/processor.c
index 57b8875..19141e5 100644
--- a/plugins/dalvik/v35/processor.c
+++ b/plugins/dalvik/v35/processor.c
@@ -201,6 +201,7 @@ static GArchInstruction *g_dalvik35_processor_disassemble(const GArchProcessor *
{
GArchInstruction *result; /* Instruction à renvoyer */
uint8_t raw8; /* Donnée de 8 bits à analyser */
+ bool pseudo_handled; /* Détection de pseudo-instruc.*/
Dalvik35Opcodes id; /* Identifiant d'instruction */
static const disass_instr_fc decodings[DOP35_COUNT] = {
@@ -464,6 +465,10 @@ static GArchInstruction *g_dalvik35_processor_disassemble(const GArchProcessor *
};
+ vmpa2t ttmp;
+
+ copy_vmpa(&ttmp, pos);
+
/* Données brutes associées à une instruction ? */
result = g_dalvik_context_get_raw_data(ctx, content, pos);
@@ -475,9 +480,22 @@ static GArchInstruction *g_dalvik35_processor_disassemble(const GArchProcessor *
if (!g_binary_content_read_u8(content, pos, &raw8))
return NULL;
- result = g_dalvik_processor_disassemble_pseudo(proc, ctx, content, pos, raw8);
-
- if (result != NULL) goto gdpd_done;
+ result = g_dalvik_processor_disassemble_pseudo(proc, ctx, content, pos, raw8, &pseudo_handled);
+
+ /**
+ * Il faut distinguer :
+ *
+ * - result == NULL : ce n'était pas une pseudo-instruction.
+ *
+ * - result == NULL : c'était une pseudo-instruction, mais un thread
+ * parallèle avait déjà réservé la zone de donnée correspondante.
+ *
+ * Dans ce dernier cas, on ne chercher pas à désassembler d'avantage,
+ * car une pseudo-instruction est déjà en place et on ne veut surtout pas
+ * la remplacer par une instruction basique.
+ */
+
+ if (result != NULL || pseudo_handled) goto gdpd_done;
/* ... ou instruction classique */