From f1f59bac5542776fe85fb225a88d5cc623f89b87 Mon Sep 17 00:00:00 2001 From: lazymio Date: Sat, 10 Apr 2021 03:30:24 +0800 Subject: [PATCH] The UC instance must be created twice to reproduce the problem (#1382) * The UC instance must be created twice to reproduce the problem * Fix coding style --- samples/sample_arm.c | 58 ++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/samples/sample_arm.c b/samples/sample_arm.c index bcaabc8d..dd92eb95 100644 --- a/samples/sample_arm.c +++ b/samples/sample_arm.c @@ -132,17 +132,14 @@ static void test_thumb(void) uc_close(uc); } -static void test_thumb_ite() { +static void test_thumb_ite_internal(bool step, uint32_t *r2_out, uint32_t *r3_out) +{ uc_engine *uc; uc_err err; uint32_t sp = 0x1234; uint32_t r2 = 0, r3 = 1; - uint32_t step_r2, step_r3; - int i, addr=ADDRESS; - - printf("Emulate a THUMB ITE block as a whole or per instruction.\n"); err = uc_open(UC_ARCH_ARM, UC_MODE_THUMB, &uc); if (err) { printf("Failed on uc_open() with error returned: %u (%s)\n", @@ -159,42 +156,55 @@ static void test_thumb_ite() { uc_reg_write(uc, UC_ARM_REG_R2, &r2); uc_reg_write(uc, UC_ARM_REG_R3, &r3); - // Run once. - printf("Running the entire binary.\n"); - err = uc_emu_start(uc, ADDRESS | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 0); - if (err) { - printf("Failed on uc_emu_start() with error returned: %u\n", err); + if (!step) { + err = uc_emu_start(uc, ADDRESS | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned: %u\n", err); + } + } else { + int i, addr = ADDRESS; + for (i = 0; i < sizeof(ARM_THUM_COND_CODE) / 2; i++) { + err = uc_emu_start(uc, addr | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 1); + if (err) { + printf("Failed on uc_emu_start() with error returned: %u\n", err); + } + uc_reg_read(uc, UC_ARM_REG_PC, &addr); + } } + uc_reg_read(uc, UC_ARM_REG_R2, &r2); uc_reg_read(uc, UC_ARM_REG_R3, &r3); + uc_close(uc); + + *r2_out = r2; + *r3_out = r3; +} + +static void test_thumb_ite() +{ + uint32_t r2, r3; + uint32_t step_r2, step_r3; + + printf("Emulate a THUMB ITE block as a whole or per instruction.\n"); + + // Run once. + printf("Running the entire binary.\n"); + test_thumb_ite_internal(false, &r2, &r3); printf(">>> R2: %d\n", r2); printf(">>> R3: %d\n\n", r3); // Step each instruction. printf("Running the binary one instruction at a time.\n"); - for (i = 0; i < sizeof(ARM_THUM_COND_CODE) / 2; i++) { - err = uc_emu_start(uc, addr | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 1); - if (err) { - printf("Failed on uc_emu_start() with error returned: %u\n", err); - } - uc_reg_read(uc, UC_ARM_REG_PC, &addr); - } - - uc_reg_read(uc, UC_ARM_REG_R2, &step_r2); - uc_reg_read(uc, UC_ARM_REG_R3, &step_r3); - + test_thumb_ite_internal(true, &step_r2, &step_r3); printf(">>> R2: %d\n", step_r2); printf(">>> R3: %d\n\n", step_r3); if (step_r2 != r2 || step_r3 != r3) { printf("Failed with ARM ITE blocks stepping!\n"); } - - uc_close(uc); } - int main(int argc, char **argv, char **envp) { // dynamically load shared library