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
This commit is contained in:
lazymio
2021-04-10 03:30:24 +08:00
committed by GitHub
parent 21ec6e8f83
commit f1f59bac55

View File

@ -132,17 +132,14 @@ static void test_thumb(void)
uc_close(uc); 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_engine *uc;
uc_err err; uc_err err;
uint32_t sp = 0x1234; uint32_t sp = 0x1234;
uint32_t r2 = 0, r3 = 1; 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); err = uc_open(UC_ARCH_ARM, UC_MODE_THUMB, &uc);
if (err) { if (err) {
printf("Failed on uc_open() with error returned: %u (%s)\n", 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_R2, &r2);
uc_reg_write(uc, UC_ARM_REG_R3, &r3); uc_reg_write(uc, UC_ARM_REG_R3, &r3);
// Run once. if (!step) {
printf("Running the entire binary.\n"); err = uc_emu_start(uc, ADDRESS | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 0);
err = uc_emu_start(uc, ADDRESS | 1, ADDRESS + sizeof(ARM_THUM_COND_CODE) - 1, 0, 0); if (err) {
if (err) { printf("Failed on uc_emu_start() with error returned: %u\n", 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_R2, &r2);
uc_reg_read(uc, UC_ARM_REG_R3, &r3); 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(">>> R2: %d\n", r2);
printf(">>> R3: %d\n\n", r3); printf(">>> R3: %d\n\n", r3);
// Step each instruction. // Step each instruction.
printf("Running the binary one instruction at a time.\n"); printf("Running the binary one instruction at a time.\n");
for (i = 0; i < sizeof(ARM_THUM_COND_CODE) / 2; i++) { test_thumb_ite_internal(true, &step_r2, &step_r3);
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);
printf(">>> R2: %d\n", step_r2); printf(">>> R2: %d\n", step_r2);
printf(">>> R3: %d\n\n", step_r3); printf(">>> R3: %d\n\n", step_r3);
if (step_r2 != r2 || step_r3 != r3) { if (step_r2 != r2 || step_r3 != r3) {
printf("Failed with ARM ITE blocks stepping!\n"); printf("Failed with ARM ITE blocks stepping!\n");
} }
uc_close(uc);
} }
int main(int argc, char **argv, char **envp) int main(int argc, char **argv, char **envp)
{ {
// dynamically load shared library // dynamically load shared library