ARM程序二进制修改:将BNE指令改为BEQ及调整跳转偏移方法咨询
修改ARM BNE指令为BEQ及调整跳转偏移量的方法
首先得拆解ARM分支指令的编码规则,这是修改操作的核心依据:
ARM的分支指令(如BNE/BEQ)是32位编码,格式固定为:[条件码(4位)] + [101(3位,分支指令标识)] + [偏移量(24位)]
1. 将BNE修改为BEQ
你的原BNE指令是十六进制的 1a000001,我们拆分它的二进制结构:
- 31-28位(条件码段):
0001→ 对应**NE(Not Equal,不等则跳转)**条件 - 27-25位:
101→ 分支指令的固定标识位 - 24-0位:
000000000000000000000001→ 跳转偏移量
BEQ对应的是**EQ(Equal,相等则跳转)**条件,其条件码为二进制0000。我们只需要修改指令的前4位:
原指令前两位1a(二进制00011010) → 替换为0a(二进制00001010)
修改后的BEQ指令十六进制为 0a000001,找到原二进制文件中1a000001所在的偏移位置,直接替换即可。
2. 修改BNE(或BEQ)的跳转偏移量
ARM分支指令的偏移量是相对于当前指令下一条指令地址的偏移值,计算规则为:目标地址 = 当前指令的下一条指令地址 + (偏移量 << 2)
偏移量是24位有符号数(补码形式),左移2位是因为ARM指令都是4字节对齐的。
实操示例:
假设你想让原BNE指令跳转到新目标地址0x30(代替原来的0x28):
- 确认当前BNE指令的地址:假设原BNE位于
0x20,那么它的下一条指令地址是0x24(ARM指令占4字节)。 - 计算偏移值:
(目标地址 - 下一条指令地址) >> 2→(0x30 - 0x24) >> 2 = 0xC >> 2 = 0x3。 - 将偏移值转为24位补码:0x3的24位补码是
00000003(十六进制)。 - 替换原指令的偏移段:原指令
1a000001的后6位(对应24位偏移)是000001,改成000003后,新指令为1a000003。
反向跳转注意:
如果目标地址在当前指令的前方(反向跳转),偏移量会是负数,需要用24位补码表示。比如要跳转到0x18,计算得(0x18 - 0x24) >> 2 = -0x3,24位补码为FFFFFFFD,对应指令为1afffffd。
修改时建议用十六进制编辑器(如Hex Fiend、xxd),结合反汇编工具(如objdump)确认指令在二进制文件中的准确字节偏移,避免误改其他代码。
内容的提问来源于stack exchange,提问作者diduk001




