从 .so 文件到运行时内存的指令编码是否不同?
Is instruction encoded differently from .so file to runtime memory?
我有一个 Android 使用 ARM-V7A 指令集的 .so 文件。
我拖进IDA里面,有一行显示:
0x1000: b #0x102c
而十六进制window表示b #0x102c
的二进制码为14 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 手册中的编码方式)?
IDA 似乎将其分解为字节,因此您希望低 8 位在前,作为字节流。 14 e0
与 little-endian e014
相同,一个 16 位半字。
(IDA 可能最初是为 x86 开发的,其中机器代码 是 可变长度字节流,而不是 16 位或 32 位块的序列,并移植到手臂。
不过,这仍然是 有效 转储 ARM 机器代码的方法。)
回复:题目问题:
可执行文件或库的 .text 部分将像 mmap
一样映射到内存中,无需修改。除了极少数情况下的“文本重定位”以修复绝对地址,例如在 .rodata
或 movw
/movk
中的跳转表中 .text
本身。
但是与位置无关的代码通常会避免这种情况,因为这就是与位置无关的全部意义所在。绝对不是字节交换!
我有一个 Android 使用 ARM-V7A 指令集的 .so 文件。
我拖进IDA里面,有一行显示:
0x1000: b #0x102c
而十六进制window表示b #0x102c
的二进制码为14 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 手册中的编码方式)?
IDA 似乎将其分解为字节,因此您希望低 8 位在前,作为字节流。 14 e0
与 little-endian e014
相同,一个 16 位半字。
(IDA 可能最初是为 x86 开发的,其中机器代码 是 可变长度字节流,而不是 16 位或 32 位块的序列,并移植到手臂。 不过,这仍然是 有效 转储 ARM 机器代码的方法。)
回复:题目问题:
可执行文件或库的 .text 部分将像 mmap
一样映射到内存中,无需修改。除了极少数情况下的“文本重定位”以修复绝对地址,例如在 .rodata
或 movw
/movk
中的跳转表中 .text
本身。
但是与位置无关的代码通常会避免这种情况,因为这就是与位置无关的全部意义所在。绝对不是字节交换!