你忽略了你在 THUMB 模式下工作的事实,在这种模式下,每条指令有两个字节(至少对于大多数指令),并且该链接描述了 ARM 模式,其中每条指令有 4 个字节。
(我怎么知道你处于 THUMB 模式?除了你的最后一个问题,你0x60ECE B loc_60EE6
的不是 4 字节对齐的,所以它必须是 THUMB)。
如果向 处的指令添加 4 个字节loc_60ECE
,则会得到0x60ED2
. 减去它60EE6
得到14
,或 20 位小数。除以 2(THUMB 模式下的 2 字节指令)得到10
十进制或0A
十六进制。
由于计算偏移量可能很困难并且容易出错,我让 gnu arm 汇编程序为我处理它。先写一个汇编文件,像这样(命名为qs,随便取个名字):
.thumb
.arch armv7a
.syntax unified
.org 0x60ECE
B codecave
original:
.org 0x60EE6
codecave:
movw R2, #0x123
B original
然后组装它并检查结果:
arm-linux-gnueabi-as q.s
arm-linux-gnueabi-objdump -s a.out | grep -v "00000000 00000000 00000000 00000000"
Contents of section .text:
60ec0 00000000 00000000 00000000 00000ae0 ................
60ee0 00000000 000040f2 2312f1e7 ......@.#...
你会看到你的0ae0
at60ece
和40f22312f1e7
at 60ee6
。您可以直接在 IDA 中修补它,或者使用idapatcher 插件来复制/粘贴十六进制。我发现这比手动制作修补字节要容易得多。