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)。