0

我有一个使用 ARM-V7A 指令集的 Android .so 文件。

我把它拖到 IDA 中,有一行显示:

0x1000: b #0x102c

十六进制窗口显示 的二进制代码b #0x102c14 e0


14 e0具有二进制格式0001 0100 1110 0000,这不是 ARM 手册对该指令进行编码的方式。

除非

1    4    e    0
0001 0100 1110 0000
8 ----- 1 16 ---- 9

8 -- 1表示 1 位到 8 位,9 -- 16表示 9 位到 16 位


为什么指令在 .so 文件中以这种方式编码?


例如,如果我想在运行时更改某个地址的某些指令。我会将其更改为0x14e0(指令在 .so 文件中的编码方式)还是更改为0xe014(指令在 ARM 手册中的编码方式)?

4

1 回答 1

3

看起来 IDA 正在将其分解为字节,因此您希望低 8 位作为字节流位于第一位。 14 e0与 little-endian 相同e014,即单个 16 位半字。

(IDA 可能最初是为 x86 开发的,其中机器代码可变长度的字节流,而不是 16 位或 32 位块的序列,并被移植到 ARM。这仍然是十六进制转储 ARM 机器代码的有效方法.)


回复:标题问题:

可执行文件或库的 .text 部分将被映射到内存中,例如mmap,无需修改。除了在极少数情况下“文本重定位”来修复绝对地址,例如在跳转表中.rodatamovw/本身movk中。.text

但是位置无关的代码通常会避免这种情况,因为这就是位置无关的全部意义所在。它绝对不是字节交换的!

于 2022-01-20T03:36:59.503 回答