From 2e02dbe91bc85ced691783bd6f86ae0730156fe3 Mon Sep 17 00:00:00 2001 From: Bet4 <0xbet4@gmail.com> Date: Mon, 11 May 2020 20:37:44 +0800 Subject: [PATCH] Don't check eob when handle it_block --- gum/arch-arm/gumthumbrelocator.c | 74 +++++++++++++++++--------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/gum/arch-arm/gumthumbrelocator.c b/gum/arch-arm/gumthumbrelocator.c index b2cb9027d3..db1d411894 100644 --- a/gum/arch-arm/gumthumbrelocator.c +++ b/gum/arch-arm/gumthumbrelocator.c @@ -206,40 +206,41 @@ gum_thumb_relocator_read_one (GumThumbRelocator * self, if (!cs_disasm_iter (self->capstone, &code, &size, &address, insn)) return 0; - switch (insn->id) - { - case ARM_INS_B: - case ARM_INS_BX: - self->eob = TRUE; - self->eoi = gum_arm_branch_is_unconditional (insn); - break; - case ARM_INS_CBZ: - case ARM_INS_CBNZ: - case ARM_INS_BL: - case ARM_INS_BLX: - self->eob = TRUE; - self->eoi = FALSE; - break; - case ARM_INS_LDR: - self->eob = self->eoi = gum_reg_dest_is_pc (insn); - break; - case ARM_INS_POP: - self->eob = self->eoi = gum_reg_list_contains_pc (insn, 0); - break; - case ARM_INS_LDM: - self->eob = self->eoi = gum_reg_list_contains_pc (insn, 1); - break; - case ARM_INS_IT: + if (!self->it_block.active) + switch (insn->id) { - it_block_size = gum_parse_it_instruction_block_size ( - GUINT16_FROM_LE (*((guint16 *) self->input_cur))); - self->eob = FALSE; - break; + case ARM_INS_B: + case ARM_INS_BX: + self->eob = TRUE; + self->eoi = gum_arm_branch_is_unconditional (insn); + break; + case ARM_INS_CBZ: + case ARM_INS_CBNZ: + case ARM_INS_BL: + case ARM_INS_BLX: + self->eob = TRUE; + self->eoi = FALSE; + break; + case ARM_INS_LDR: + self->eob = self->eoi = gum_reg_dest_is_pc (insn); + break; + case ARM_INS_POP: + self->eob = self->eoi = gum_reg_list_contains_pc (insn, 0); + break; + case ARM_INS_LDM: + self->eob = self->eoi = gum_reg_list_contains_pc (insn, 1); + break; + case ARM_INS_IT: + { + it_block_size = gum_parse_it_instruction_block_size ( + GUINT16_FROM_LE (*((guint16 *) self->input_cur))); + self->eob = FALSE; + break; + } + default: + self->eob = FALSE; + break; } - default: - self->eob = FALSE; - break; - } gum_thumb_relocator_increment_inpos (self); @@ -249,8 +250,13 @@ gum_thumb_relocator_read_one (GumThumbRelocator * self, self->input_cur += insn->size; self->input_pc += insn->size; - while (it_block_size--) - gum_thumb_relocator_read_one (self, NULL); + if (it_block_size > 0) + { + self->it_block.active = TRUE; + while (it_block_size--) + gum_thumb_relocator_read_one(self, NULL); + self->it_block.active = FALSE; + } return self->input_cur - input_start; }