我有一个我正在拆卸的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)
手段
手段
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)
手段
手段
CBZ R4, (PC+118) ; 118 = 0b1110110
Run Code Online (Sandbox Code Playgroud)
请注意,您的补丁B9 → B3也改变了i位,这改变了它应跳转到的地址.您应该只更改操作位,这意味着您应该将字节修补为B1.
归档时间: |
|
查看次数: |
3735 次 |
最近记录: |