gpt4 book ai didi

ARMv7 字补丁 (CBNZ)

转载 作者:行者123 更新时间:2023-12-04 22:34:57 24 4
gpt4 key购买 nike

我有一个正在拆卸的 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 会产生类似的结果,尽管似乎不是。

希望有人能帮我理解。抱歉,如果这不是我应该发布此类问题的论坛,尽管这似乎是一个提问的好地方。如果您需要更多信息,我将很乐意提供。

最佳答案

要了解程序集,您需要进入位级别。如果您不想花时间了解 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]

方法
  • 操作 = 1
  • 我 = 0
  • imm5 = 11011
  • Rn = 100

  • 方法
    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]

    方法
  • 操作 = 0
  • 我 = 1
  • im5 = 11011
  • Rn = 100

  • 方法
    CBZ R4, (PC+118)  ; 118 = 0b1110110

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

    关于ARMv7 字补丁 (CBNZ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9279451/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com