2016-07-08 31 views
3

我不知道为什么以下代码遇到BAD_INSTRUCTION错误,任何人?关于代码注入(armv7 asm)的EXC_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 
+0

为什么不单步执行调试器中的代码并查看实际发生了什么? –

+0

@PaulR我做过了,因为您可以在每条指令上看到我的评论。在'bx r5'之后,一切看起来都对我好。但是接下来的2个movw和movt并没有设置为r1,之后这个过程感觉到了'EXC_BAD_INSTRUCTION'。 – RyanB

+2

您确定值“0x1a”吗?如果你偏离了+/- 1字节,我可以看到调试器对你在代码中的位置感到困惑(所以它看起来像你正在追踪你期望的代码),但是因为你不会执行你认为你的指示...只是一个想法。 –

回答

2

26字节的偏移量(即,没有的4个字节的ARM指令倍数)和即时生成标志被设定(movs r5, #0x1a)之间,我感到这是Thumb代码。然而,bx r5是一个交互工作分支,并且由于r5的第0位没有被设置,所以它将与ARM状态互通为一些Thumb指令的中间,并且变得非常不快。因为我相信EXC_BAD_INSTRUCTION是iOS的一个未定义的指令异常的报告,所有这些看起来合在一起。

如果您处于Thumb状态并希望保持Thumb状态,请使用非互通分支(即mov pc, r5),或确保bx目标的位0已置位(即设置偏移量0x1b)。

+0

是的,你是对的。我忘了在r5中设置目标地址的第0位。 – RyanB