ARMv7字修补程序(CBNZ)
我有一个正在拆解的iPhone应用程序 我的理解是,CBNZ指令是“非零上的比较和分支”,而CBZ指令是“零上的比较和分支” 我在网上找不到任何地方可以证实这一点,但对我来说,CBNZ似乎是由B9表示的,地址是“0xB9DC”,CBZ是“0xB3DC” 地址如下: 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“0xD130”表示,我修补为一个B“0xE032” 这: 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会有类似的结果,尽管看起来不是这样ARMv7字修补程序(CBNZ),arm,Arm,我有一个正在拆解的iPhone应用程序 我的理解是,CBNZ指令是“非零上的比较和分支”,而CBZ指令是“零上的比较和分支” 我在网上找不到任何地方可以证实这一点,但对我来说,CBNZ似乎是由B9表示的,地址是“0xB9DC”,CBZ是“0xB3DC” 地址如下: 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中修补
希望有人能帮我理解。对不起,如果这不是一个论坛,我应该张贴这样的问题,虽然它似乎是一个好地方问。如果您需要更多信息,我将很乐意提供。要了解组件,您需要转到位级别。如果你不想花时间去理解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
- i=0
- imm5=11011
- Rn=100
(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
请注意,您的补丁B9→ B3也更改了i位,从而更改了它应该跳转到的地址。您应该只更改op位,这意味着您应该将字节修补为B1,这是在一个容易找到的地方记录的。该处理器的arm文档。转到->arm架构->参考手册。并获取armv7-m手册。你说ARM7是一个ARMv4,没有这条指令,这条指令目前只在armv7-m中受支持,这让我很反感。没有arm6,你是说armv6吗?thumb bne说明也可以在同一个armv7-m arch参考手册中找到,或者在任何之前的arch参考手册中找到,回到armv4t。实际上,armv7 ar手册中也有它。很抱歉,我指的是ARMv6和armv7。实际上我不知道有什么不同,我现在是一个noob。操作码记录在ARM(ARM架构参考手册)中。过去每件事都只有一只手臂,现在每个家庭都有一只手臂。较新的ARM(如armv7 ar ARM)将根据指令列出支持它的体系结构,例如CBNZ/CBZ仅为armv7,这就是您可能没有看到它或编译器可能没有在armv6上使用它的原因。感谢您为我详细介绍它。不幸的是,我已经尝试B1仅仅是出于猜测,它并没有像我希望的那样工作。我用的是IDA Pro,当我用B1的时候,似乎一切都是我想要的,但应用程序崩溃了。你知道为什么吗?如果你需要的话,我可以发布更多的程序集。你认为我应该改变它而不是CBZ吗?@untochable不知道你想做什么。如果你有其他问题,你应该发布一个新的。
CBNZ R4, (PC+54) ; 54 = 0b0110110
(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