diff options
Diffstat (limited to 'plugins/dalvik/v35')
-rw-r--r-- | plugins/dalvik/v35/opdefs/array_26.d | 7 | ||||
-rw-r--r-- | plugins/dalvik/v35/processor.c | 24 |
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 */ |