当我用 IDA 打开 iOS 框架地址簿时,我得到以下代码:
**__ABPeoplePickerNavigationController_initAsAddressBook_withAddressBook__
var_C= -0xC
PUSH {R7,LR}
MOV R7, SP
SUB SP, SP, #4
MOVW R1, #0x2B06
MOV.W R12, #0
MOVT.W R1, #0xB
STR.W R12, [SP,#0xC+var_C]
ADD R1, PC
LDR R1, [R1]
BLX _objc_msgSend
ADD SP, SP, #4
POP {R7,PC}
; End of function __ABPeoplePickerNavigationController_initAsAddressBook_withAddressBook__**
如何在调用 _objc_msgSend() 之前知道 R1 中存储了哪些选择器。
在互联网的帮助下,我做了以下事情:
在 MOVW R1, #0x2B06 和 MOVT.W R1, #0xB 之后,我得到了 R1=0x000B2B06
在 ADD R1, PC 之后,我得到 R1=0x000B2B06+PC(A13A)+4=0x000BCC44,其中 A13A 是 ADD R1, PC 的地址
该地址附近的内容是:
__objc_selrefs:000BCC44 DCD aInitasaddres_0 ; “initAsAddressBook:withAddressBook:withS”... __objc_selrefs:000BCC48 DCD aDefaultstylepr ; "defaultStyleProviderForStyle:" __objc_selrefs:000BCC4C DCD aInitwithnaviga ; "initWithNavigationController:" __objc_selrefs:000BCC50 DCD aSetupinitialst ; “setupInitialStackAndLoadState:”
所以我得到了选择器“initAsAddressBook:withAddressBook:withS ...”,
4.但是当我记录工作流时,我得到了“setupInitialStackAndLoadState:”实际上被调用了。
我获取选择器的方法有什么问题吗?