当我用IDA打开iOS框架AddressBook时,我得到以下代码:
**__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:”实际上被调用了。
获取选择器的方法有什么问题吗?
答案 0 :(得分:0)
我认为这只是您的日志记录工具的错误或时间问题。它显然是在调用initAsAddressBook:withAddressBook:withStyle:
。这是IDA 6.3显示的内容(看起来有点不同):
__text:000014A8 PUSH {R7,LR}
__text:000014AA ADD R7, SP, #0
__text:000014AC SUB SP, SP, #4
__text:000014AE LDR R1, =(selRef_initAsAddressBook_withAddressBook_withStyle_ - 0x14BA)
__text:000014B0 SXTB R2, R2
__text:000014B2 MOV.W R12, #0
__text:000014B6 ADD R1, PC ; selRef_initAsAddressBook_withAddressBook_withStyle_
__text:000014B8 STR.W R12, [SP,#4+var_4]
__text:000014BC LDR R1, [R1] ; "initAsAddressBook:withAddressBook:withS"...
__text:000014BE BLX _objc_msgSend
__text:000014C2 SUB.W SP, R7, #0
__text:000014C6 POP {R7,PC}
稍后在setupInitialStackAndLoadState
中调用initAsAddressBook:withAddressBook:withStyle:
选择器。