2016-07-08 28 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