ARMv7 Word补丁(CBNZ)

Unt*_*ble 4 arm

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

据我所知,CBNZ指令是"比较并在非零上分支".和CBZ是"比较和分支零"

我无法在网上找到任何地方来确认这一点,但对我而言,似乎CBNZ由B9代表地址如此"0x B9 DC"而CBZ是"0x B3 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"

这: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会有类似的结果,虽然看起来不是.

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

ken*_*ytm 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
Run Code Online (Sandbox Code Playgroud)

其中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]
Run Code Online (Sandbox Code Playgroud)

手段

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

手段

CBNZ R4, (PC+54)   ; 54 = 0b0110110
Run Code Online (Sandbox Code Playgroud)

而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]
Run Code Online (Sandbox Code Playgroud)

手段

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

手段

CBZ R4, (PC+118)  ; 118 = 0b1110110
Run Code Online (Sandbox Code Playgroud)

请注意,您的补丁B9B3也改变了i位,这改变了它应跳转到的地址.您应该只更改操作位,这意味着您应该将字节修补为B1.