2013-07-02 70 views
1

我有一個計劃(ARM)和(由IDA disas)中有一些指示:爲什麼'LDR'不能替換'B'?

.plt:000083F0 ADRL R12, 0x83F8 
.plt:000083F8 LDR PC, [R12,#(off_90D8 - 0x83F8)]! ; sub_83D0 

的地址0x90D8店0x83D0:

000090D8 D0 83 00 00 

因此,LDR之後,PC是0x83D0和將會執行0x83D0中的inst,是不是?

在這裏,我想直接JMP到0x83D0,而不是使用09D8,我修改了二進制機器碼,並重新加載它通過IDA:

.plt:000083F0 B sub_83D0 

IDA表明,將JMP到0x83D0,所以我覺得修改已驗證。
但是,修改後程序運行失敗。
我的修改和如何實現我的目標有什麼問題嗎?請幫我...

我多放些disas這裏:
SRC

.plt:000083E4 
.plt:000083E4 ; =============== S U B R O U T I N E ======================================= 
.plt:000083E4 
.plt:000083E4 ; Attributes: thunk 
.plt:000083E4 
.plt:000083E4 sub_83E4        ; CODE XREF: .text:00008410j 
.plt:000083E4     ADRL   R12, 0x83EC 
.plt:000083EC     LDR    PC, [R12,#(off_90D4 - 0x83EC)]! ; sub_83D0 
.plt:000083EC ; End of function sub_83E4 
.plt:000083EC 
.plt:000083F0 
.plt:000083F0 ; =============== S U B R O U T I N E ======================================= 
.plt:000083F0 
.plt:000083F0 ; Attributes: thunk 
.plt:000083F0 
.plt:000083F0 sub_83F0        ; CODE XREF: sub_8430+6p 
.plt:000083F0           ; sub_8430+Ep ... 
.plt:000083F0     ADRL   R12, 0x83F8 
.plt:000083F8     LDR    PC, [R12,#(off_90D8 - 0x83F8)]! ; sub_83D0 
.plt:000083F8 ; End of function sub_83F0 
.plt:000083F8 
.plt:000083F8 ; .plt   ends 
.plt:000083F8 

修改

.plt:000083E4 
.plt:000083E4 ; =============== S U B R O U T I N E ======================================= 
.plt:000083E4 
.plt:000083E4 ; Attributes: thunk 
.plt:000083E4 
.plt:000083E4 sub_83E4        ; CODE XREF: .text:00008410j 
.plt:000083E4     ADRL   R12, 0x83EC 
.plt:000083EC     LDR    PC, [R12,#(off_90D4 - 0x83EC)]! ; sub_83D0 
.plt:000083EC ; End of function sub_83E4 
.plt:000083EC 
.plt:000083F0 
.plt:000083F0 ; =============== S U B R O U T I N E ======================================= 
.plt:000083F0 
.plt:000083F0 
.plt:000083F0 sub_83F0        ; CODE XREF: sub_8430+6p 
.plt:000083F0           ; sub_8430+Ep ... 
.plt:000083F0     ADRL   R12, loc_83F8 
.plt:000083F8 
.plt:000083F8 loc_83F8        ; DATA XREF: sub_83F0o 
.plt:000083F8     B    sub_83D0 
.plt:000083F8 ; End of function sub_83F0 
.plt:000083F8 
.plt:000083F8 ; .plt   ends 
.plt:000083F8 

而且在0x90D4:

000090D4 D0 83 00 00 D0 83 00 00 
+1

也許在代碼的其他地方存在對'R12'值的依賴關係?請注意,'LDR'指令指定回寫到基址寄存器('R12')。 – Michael

+0

請爲這些示例提供反彙編。 –

+0

剛纔我節省了R12(見上文),但仍然無法運行。也許需要BL或BX? –

回答

2

指令B sub_83D0PC相對。該指令序列,

.plt:000083F0 ADRL R12, 0x83F8 
.plt:000083F8 LDR PC, [R12,#(off_90D8 - 0x83F8)]! ; sub_83D0 

000090D8: D0 83 00 00 

是相對的PC,但它跳轉到一個絕對地址。你的假設是鏈接地址是運行時地址。這並非總是如此,特別是在引導程序代碼可能重新定位或啓用MMU

上面的序列可以從任何地址運行,並且將控制轉移到絕對0x83d0,所述分支變體僅通過將偏移改變PC。即,

PC = PC + (SignExtend) (immediate << 2); 

的等效是mov pc, #0x83D0,但是這將不適合的8位通過2的倍數你可以試着旋轉的mov立即數限制,

mov r12, #0x8300 
orr pc, r12, #0xd0 

但代碼即轉移到可能還需要將r12值設置爲較舊的運行時地址。

+0

你的意思是說src inst將jmp轉換爲絕對的0x83d0,但我的修改不確定嗎? –

+0

對,'b'不是**絕對。原文是(並按照Chris的說明設置了「r12」);這也許很重要。 –

+0

那麼,是否有任何方法可以直接跳到絕對的0x83d0並且不使用90D8? –

相關問題