ARMv7 Word补丁(CBNZ)

时间:2012-02-14 15:21:43

标签: arm

我有一个我正在拆卸的iPhone应用程序。

据我所知,CBNZ指令是“比较和分支非零”。 CBZ是“比较和分支零”

我无法在网上找到任何地方来确认这一点,但对我而言,似乎CBNZ由B9代表的地址如此“0x B9 DC”而CBZ是“0x B3 < / strong> DC“。

完整地址是: DC B9 53 48 03 99 78 44 00 68 BF F1 74 EE 51 49

我正在修改它: DC B3 53 48 03 99 78 44 00 68 BF F1 74 EE 51 49

之前我在ARMv6中修补了相同的检查,虽然它由BNE“0x D1 30”表示,我修补了B“0x E0 32”< / p>

此: 32 D1 5B 48 5C 49 78 44 79 44 00 68 09 68 AC F1

要: 32 E0 5B 48 5C 49 78 44 79 44 00 68 09 68 AC F1

这完全符合我的预期,采取分支并继续我想要的。通常情况下,如果它通过检查,它只需要这样的分支。

我认为将CBNZ修补到CBZ会有类似的结果,但似乎没有。

希望有人能帮助我理解。对不起,如果这不是一个论坛,我应该发布这样的问题虽然它似乎是一个好地方问。如果您需要更多信息,我很乐意提供。

1 个答案:

答案 0 :(得分:11)

要了解程序集,您需要转到位级别。如果您不想花时间了解ARM编码,请获取反汇编程序(例如otool -tV)和汇编程序(例如as),他们将为您找出编码/解码指令。


CBZ / CBNZ指令的编码是

15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0   <-- bit
 1  0  1  1 op  0  i  1 [         imm5][     Rn]  <-- meaning

其中 op = 1表示CBNZ, op = 0表示CBZ,' i imm5 :0 '是跳转的相对地址, Rn 是要检查的寄存器(参见ARMv7-ARM§A8.6.27)。

因此,单词B9DC,二进制,

(1  0  1  1 op  0  i  1 [         imm5][     Rn])
 1  0  1  1  1  0  0  1 [1  1  0  1  1][1  0  0]

装置

  • op = 1
  • i = 0
  • imm5 = 11011
  • Rn = 100

装置

CBNZ R4, (PC+54)   ; 54 = 0b0110110

而B3DC,二进制,

(1  0  1  1 op  0  i  1 [         imm5][     Rn])
 1  0  1  1  0  0  1  1 [1  1  0  1  1][1  0  0]

装置

  • op = 0
  • i = 1
  • imm5 = 11011
  • Rn = 100

装置

CBZ R4, (PC+118)  ; 118 = 0b1110110

请注意,您的补丁 B9 B3 也会更改 i 位,这会更改应跳转到的地址。您应该只更改 op 位,这意味着您应该将字节修补为 B1