我有一个我正在拆卸的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会有类似的结果,但似乎没有。
希望有人能帮助我理解。对不起,如果这不是一个论坛,我应该发布这样的问题虽然它似乎是一个好地方问。如果您需要更多信息,我很乐意提供。
答案 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]
装置
装置
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]
装置
装置
CBZ R4, (PC+118) ; 118 = 0b1110110
请注意,您的补丁 B9 → B3 也会更改 i 位,这会更改应跳转到的地址。您应该只更改 op 位,这意味着您应该将字节修补为 B1 。