关于代码注入(armv7 asm)的EXC_BAD_INSTRUCTION
问题描述:
我不知道为什么以下代码遇到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
答
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
为什么不单步执行调试器中的代码并查看实际发生了什么? –
@PaulR我做过了,因为您可以在每条指令上看到我的评论。在'bx r5'之后,一切看起来都对我好。但是接下来的2个movw和movt并没有设置为r1,之后这个过程感觉到了'EXC_BAD_INSTRUCTION'。 – RyanB
您确定值“0x1a”吗?如果你偏离了+/- 1字节,我可以看到调试器对你在代码中的位置感到困惑(所以它看起来像你正在追踪你期望的代码),但是因为你不会执行你认为你的指示...只是一个想法。 –