2

我有一个程序(arm)和一些指令(IDA的disas):

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

addr 0x90D8 存储 0x83D0:

000090D8  D0 83 00 00

所以,在 ldr 之后,pc 是 0x83D0 并且会执行 0x83D0 中的 inst,不是吗?

这里我想直接jmp到0x83D0而不使用09D8,我修改二进制机器码并通过IDA重新加载:

.plt:000083F0   B   sub_83D0

IDA显示它会跳转到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
4

1 回答 1

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通过添加偏移量来更改。IE,

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

等效的是mov pc, #0x83D0,但这不适合8 位mov的立即数限制旋转 2 的倍数

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

但传输到的代码可能还需要将r12值设置为较旧的运行时地址。

于 2013-07-02T15:06:09.213 回答