summaryrefslogtreecommitdiff
path: root/plugins/dalvik/processor.c
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/processor.c
parentb5ae276f78a1c1b1e6410ec4ff79cb68f0b35478 (diff)
Improved Dalvik fill instruction loading and created links to their payload.
Diffstat (limited to 'plugins/dalvik/processor.c')
-rw-r--r--plugins/dalvik/processor.c38
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;
}