我有一个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将有类似的结果,尽管它似乎没有。
希望有人能帮我理解。对不起,如果这不是一个论坛,我应该发表这样的问题,虽然这似乎是一个好地方问。如果你需要更多的信息,我将乐意提供。
发布于 2012-02-14 18:59:21
要理解程序集,您需要转到位级别。如果您不想花时间来理解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 :im5: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]手段
F 213
手段
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]手段
= 11011
手段
CBZ R4, (PC+118) ; 118 = 0b1110110注意,您的修补程序B9 B3也更改了i位,这改变了它应该跳转到的地址。您应该只更改op位,这意味着您应该将字节修补为B1。
https://stackoverflow.com/questions/9279451
复制相似问题