diff options
Diffstat (limited to 'plugins/dalvik/processor.c')
-rw-r--r-- | plugins/dalvik/processor.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/plugins/dalvik/processor.c b/plugins/dalvik/processor.c index 8d24d5a..3ed0507 100644 --- a/plugins/dalvik/processor.c +++ b/plugins/dalvik/processor.c @@ -197,12 +197,13 @@ static GDalvikDContext *g_dalvik_processor_get_decomp_context(const GDalvikProce /****************************************************************************** * * -* Paramètres : proc = architecture visée par la procédure. * -* data = flux de données à analyser. * -* pos = position courante dans ce flux. [OUT] * -* end = limite des données à analyser. * -* addr = adresse virtuelle de l'instruction. * -* low8 = 8 bits de poids faible déjà lus. * +* Paramètres : proc = architecture visée par la procédure. * +* data = flux de données à analyser. * +* pos = position courante dans ce flux. [OUT] * +* end = limite des données à analyser. * +* addr = adresse virtuelle de l'instruction. * +* low8 = 8 bits de poids faible déjà lus. * +* handled = dit si une pseudo-instruction était bien là. [OUT] * * * * Description : Décode une pseudo-instruction dans un flux de données. * * * @@ -212,22 +213,25 @@ static GDalvikDContext *g_dalvik_processor_get_decomp_context(const GDalvikProce * * ******************************************************************************/ -GArchInstruction *g_dalvik_processor_disassemble_pseudo(const GArchProcessor *proc, GDalvikContext *ctx, const GBinContent *content, vmpa2t *pos, uint8_t low8) +GArchInstruction *g_dalvik_processor_disassemble_pseudo(const GArchProcessor *proc, GDalvikContext *ctx, const GBinContent *content, vmpa2t *pos, uint8_t low8, bool *handled) { GArchInstruction *result; /* Instruction à renvoyer */ vmpa2t tmp; /* Position modifiable */ uint8_t high8; /* Nouvelle octet à venir lire */ uint16_t ident; /* Valeur lue dans le code */ - /* Vérification astucieuse et rapide...*/ - if (low8 != 0x00 /* DOP_NOP */) - return NULL; + /* Définition facultative, mais bon... */ + *handled = false; result = NULL; + /* Vérification astucieuse et rapide...*/ + if (low8 != 0x00 /* DOP_NOP */) + goto gdpdp_exit; + copy_vmpa(&tmp, pos); - if (!g_binary_content_read_u8(content, pos, &high8)) + if (!g_binary_content_read_u8(content, &tmp, &high8)) goto gdpdp_exit; ident = high8 << 8 | low8; @@ -236,11 +240,13 @@ GArchInstruction *g_dalvik_processor_disassemble_pseudo(const GArchProcessor *pr { case DPO_PACKED_SWITCH: case DPO_SPARSE_SWITCH: - result = g_dalvik_switch_instr_new(ident, ctx, content, pos); + result = g_dalvik_switch_instr_new(ident, ctx, content, &tmp); + *handled = true; break; case DPO_FILL_ARRAY_DATA: - result = g_dalvik_fill_instr_new(ident, ctx, content, pos); + result = g_dalvik_fill_instr_new(ident, ctx, content, &tmp); + *handled = true; break; default: @@ -249,11 +255,11 @@ GArchInstruction *g_dalvik_processor_disassemble_pseudo(const GArchProcessor *pr } - gdpdp_exit: - - if (result == NULL) + if (result != NULL) copy_vmpa(pos, &tmp); + gdpdp_exit: + return result; } |