EXC_BAD_INSTRUCTION 关于代码注入 (armv7 asm)
EXC_BAD_INSTRUCTION on code injection (armv7 asm)
我不知道为什么下面的代码会出现 BAD_INSTRUCTION
错误,有人吗?
mov r4, r0
movw r0, #0xc70 ; injected code start here
movt r0, #0x8bb3
movw r3, #0x576
ldr r1, [r7]
movs r5, #0x1a
add r5, pc ; next instruction will jump over 9 instructions
bx r5 ; injected code end here
ldr r1, [r0]
ldr r0, [r2]
blx 0x26e11c
movw r1, #0x6442
movt r1, #0x18
add r1, pc
ldr r1, [r1]
blx 0x26e11c
mov r3, r1
movw r1, #0x66a4 ; r1 has not been loaded
movt r1, #0x15 ; with new value. Why?
mov r2, r0
add r1, pc ; This instruction isn't getting called
mov r0, r4 ; EXC_BAD_INSTRUCTION here
blx __sprintf
在 26 字节偏移量(即不是 4 字节 ARM 指令的倍数)和立即生成标志设置 (movs r5, #0x1a
) 之间,我感觉到这是 Thumb 代码。但是,bx r5
是一个互通分支,并且由于未设置 r5 的位 0,它会在某些 Thumb 指令的中间互通到 ARM 状态并且变得非常不愉快。因为我相信 EXC_BAD_INSTRUCTION
是 iOS 对未定义指令异常的报告,所有这些看起来都加起来了。
如果您处于 Thumb 状态并希望保持 Thumb 状态,请使用非互通分支(即 mov pc, r5
),或确保 bx
目标的位 0 已设置(即使偏移量为 0x1b)。
我不知道为什么下面的代码会出现 BAD_INSTRUCTION
错误,有人吗?
mov r4, r0
movw r0, #0xc70 ; injected code start here
movt r0, #0x8bb3
movw r3, #0x576
ldr r1, [r7]
movs r5, #0x1a
add r5, pc ; next instruction will jump over 9 instructions
bx r5 ; injected code end here
ldr r1, [r0]
ldr r0, [r2]
blx 0x26e11c
movw r1, #0x6442
movt r1, #0x18
add r1, pc
ldr r1, [r1]
blx 0x26e11c
mov r3, r1
movw r1, #0x66a4 ; r1 has not been loaded
movt r1, #0x15 ; with new value. Why?
mov r2, r0
add r1, pc ; This instruction isn't getting called
mov r0, r4 ; EXC_BAD_INSTRUCTION here
blx __sprintf
在 26 字节偏移量(即不是 4 字节 ARM 指令的倍数)和立即生成标志设置 (movs r5, #0x1a
) 之间,我感觉到这是 Thumb 代码。但是,bx r5
是一个互通分支,并且由于未设置 r5 的位 0,它会在某些 Thumb 指令的中间互通到 ARM 状态并且变得非常不愉快。因为我相信 EXC_BAD_INSTRUCTION
是 iOS 对未定义指令异常的报告,所有这些看起来都加起来了。
如果您处于 Thumb 状态并希望保持 Thumb 状态,请使用非互通分支(即 mov pc, r5
),或确保 bx
目标的位 0 已设置(即使偏移量为 0x1b)。