首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARMv7字修补程序

ARMv7字修补程序
EN

Stack Overflow用户
提问于 2012-02-14 15:21:42
回答 1查看 6.4K关注 0票数 5

我有一个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将有类似的结果,尽管它似乎没有。

希望有人能帮我理解。对不起,如果这不是一个论坛,我应该发表这样的问题,虽然这似乎是一个好地方问。如果你需要更多的信息,我将乐意提供。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-14 18:59:21

要理解程序集,您需要转到位级别。如果您不想花时间来理解ARM编码,请获得反汇编程序(例如otool -tV)和汇编程序(例如as),它们会为您计算出指令的编码/解码。

CBZ/CBNZ指令的编码如下

代码语言:javascript
复制
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,以二进制形式,

代码语言:javascript
复制
(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]

手段

  • op = 1
  • i = 0
  • imm5 = 11011
  • Rn =100

F 213

手段

代码语言:javascript
复制
CBNZ R4, (PC+54)   ; 54 = 0b0110110

而B3DC则是二进制的,

代码语言:javascript
复制
(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 =

= 11011

  • Rn = 100

手段

代码语言:javascript
复制
CBZ R4, (PC+118)  ; 118 = 0b1110110

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9279451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档