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中,但是一旦加载了子例程,它也会调用子例程吗?
发布于 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可以是跨模块调用的占位符。这也解释了标签命名不一致的原因。
发布于 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指令添加指令。
https://stackoverflow.com/questions/61875234
复制相似问题