Objective-C消息机制的原理在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段。编译器会将消息发送转换成对objc_msgSend方法的调用。
objc_msgSend方法含两个必要参数:receiver、方法名(即:selector),如:
[receiver message]; 将被转换为:objc_msgSend(receiver, selector);
问题:通过IDA静态分析,如何快速定位到 selector 的真正代码实现(方法的真正实现)
__text:0001D76A MOV R0, #(selRef_HTTPMethod - 0x1C776) ; selRef_HTTPMethod
__text:0001D772 ADD R0, PC ; selRef_HTTPMethod
__text:0001D774 LDR R1, [R0] ; “HTTPMethod”
__text:0001D776 MOV R0, R10
__text:0001D778 STR R1, [SP,#0xAC+var_A0]
__text:0001D77A BLX _objc_msgSend
__text:0001D77E MOV R7, R7
__text:0001D780 BLX _objc_retainAutoreleasedReturnValue
__text:0001D784 MOV R4, R0
text:0001D786 MOV R0, #(selRef_setRequestMethod - 0x1C794) ; selRef_setRequestMethod
__text:0001D78E MOV R2, R4
_text:0001D790 ADD R0, PC ; selRef_setRequestMethod
__text:0001D792 LDR R1, [R0] ; “setRequestMethod:”
__text:0001D794 MOV R0, R6
__text:0001D796 BLX _objc_msgSend
__text:0001D79A MOV R0, R4
__text:0001D79C BLX _objc_release
__text:0001D7A0 MOVW R0, #(:lower16:(selRef_allHTTPHeaderFields - 0x1C7B8))
__text:0001D7A4 ADD.W R8, SP, #0xAC+var_3C
__text:0001D7A8 MOVT.W R0, #(:upper16:(selRef_allHTTPHeaderFields - 0x1C7B8))
__text:0001D7AC VMOV.I32 Q8, #0
__text:0001D7B0 ADD.W R1, R8, #0x10
__text:0001D7B4 ADD R0, PC ; selRef_allHTTPHeaderFields
__text:0001D7B6 VST1.32 {D16-D17}, [R1]
__text:0001D7BA LDR R1, [R0] ; “allHTTPHeaderFields”
__text:0001D7BC MOV R0, R10
__text:0001D7BE VST1.32 {D16-D17}, [R8]
__text:0001D7C2 STR R1, [SP,#0xAC+var_84]
__text:0001D7C4 BLX _objc_msgSend