首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADR x9,sub_xxxxxx是否调用子例程?为什么代码使用ADR / NOP

ADR x9,sub_xxxxxx是否调用子例程?为什么代码使用ADR / NOP
EN

Stack Overflow用户
提问于 2020-05-18 17:16:38
回答 2查看 134关注 0票数 1
代码语言:javascript
复制
loc_10007390C
SUB             X8, X29, #-stuff
LDUR            X10, [X8,#-0x100] ;
LDR             X0, [X10,#0x10] ;
SUB             X8, X29, #-var_1E8
LDUR            X2, [X8,#-0x100]
STP             X0, XZR, [X2]
SUB             X8, X29, #-var_1F0
LDUR            X3, [X8,#-0x100]
NOP
LDR             X8, =__NSConcreteStackBlock
STR             X8, [X3]
STR             D8, [X3,#8]
ADD             X8, X3, #0x10
ADR             X9, sub_100092800
NOP
PACIA           X9, X8
ADR             X8, unk_1001A2658
NOP
STP             X9, X8, [X3,#0x10]
LDUR            X8, [X29,#var_B8]
STR             X8, [X3,#0x20]
LDUR            X8, [X29,#var_C0]
STP             X8, X10, [X3,#0x28]
LDUR            W8, [X29,#anotherStuff]
STR             W8, [X3,#0x38]
SUB             X8, X29, #-var_290
LDUR            W8, [X8,#-0x100]
STR             W8, [X3,#0x3C]
MOV             W1, #0
MOV             W4, #1
BL              do_the_dance
TST             W0, #0xFF00
B.EQ            loc_1000E8730

我有点困惑于ADR X9,sub_100092800在做什么。看起来它正在将地址加载到X9中,但是一旦加载了子例程,它也会调用子例程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-18 17:33:46

从名单上看,没有电话。它将PC相对偏移量加载到寄存器中,然后对其不做任何操作.但是看看几个地方的ADR/NOP序列。看起来,NOP是要用调用命令(BL)进行修补的。

这里有几种可能性。可能是反汇编程序误读了命令。不太可能,但是检查机器代码编码,以防万一。可以有一个重新定位指令,可以在加载模块期间修补这些点。最后,程序本身可能有一个显式的自我修补逻辑,专门用于阻止像您这样的逆向工程师。自我修补将肯定在模块的其他地方,以摆脱你的气味。

编辑:代码中有一些有趣的信息。我不知道__NSConcreteStackBlock是什么,但它强烈建议苹果/可可。同时,命令是针对and 8.3指令集的,它与指针身份验证逻辑有关,用于跳转完整性保护。据我所知,这是即将发布的苹果公司的ptrauth/ARM64E倡议的内容,它由最新的Xcode和最新的iDevices支持,但尚未被App所接受(截至编写本文时,5/18/2020)。指针认证可能是脆弱的,苹果的官方说法是“暂时在开发中尝试一下”。我的观点是,可能是某种函数调用点后处理,它是ptrauth代码生成管道的一部分。我对ptrauth还不太了解。:(

编辑:还有一种可能性。程序集是否来自于拆卸对象文件,而不是链接的可执行文件?然后NOPs可以是跨模块调用的占位符。这也解释了标签命名不一致的原因。

票数 1
EN

Stack Overflow用户

发布于 2020-05-18 21:26:05

指令ADR X9, sub_100092800将符号sub_100092800的地址加载到X9寄存器中。它本身不调用或以其他方式分支到位于那里的代码。

加载到X9寄存器中的地址随后被PACIA指令修改为安全措施,然后通过下面的STP指令存储在内存中。在您的代码中没有任何迹象表明在内存中存储的修改值会发生什么,但是它很可能在某个时候从内存中加载,恢复到使用PACIA指令之前的值,然后调用。

NOP指令是一条红鲱鱼。这是因为,某些伪指令(如ADRL )总是生成两个真正的指令,即使可能只使用一条指令来计算相同的结果。ADR指令只处理与指令在1MB以内的地址。对于较远的符号,需要两个指令来计算地址、阿德普和ADD。在某个时候,汇编程序或链接器确定sub_100092800的地址在1M以内,并替换ADRP并使用ADR和NOP指令添加指令。

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

https://stackoverflow.com/questions/61875234

复制
相关文章

相似问题

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