[iOS逆向工程] 在汇编语言调试中获取当前实例句柄
在分析Safari行为的时候想到要用objective-c的特性随时可以语义化的查看一下UIView的各种状态,比如在UIView方法内部设了个断点,想看一下当前视图结构。只要得到当前实例的句柄就可以了。查了一些资料,记录一下。
函数参数的传递
iOS Simulator里应用是跑在32bits模式下的(在Activity Monitor可以看到),依据<<Mac OS Debug Magic>>里关于Intel 32bits参数传递的定义:
Table 2 : Accessing parameters on Intel 32-bit(64bits是先使用通用寄存器来传递参数,不足时再使用其它方式)
Table 3 : Accessing parameters after the prologue
当在汇编语言下调试Cocoa代码,请记住以下运行时特性:
The Objective-C compiler adds two implicit parameters to each method, the first of which is a pointer to the object being called (self
).
The second implicit parameter is the method selector (_cmd
). In Objective-C this is of type SEL
; in GDB you can print this as a C string.
The Objective-C runtime dispatches methods via a family of C function. The most commonly seen is objc_msgSend
, but some architectures use objc_msgSend_stret
for methods which returns structures, and some architectures useobjc_msgSend_fpret
for methods that return floating point values. There are also equivalent functions for calling super
(objc_msgSendSuper
and so on).
The first word of any Objective-C object (the isa
field) is a pointer to the object's class.
0x04e7aad3: "addSublayer:"
0x04e7aae0: NULL(lldb) po [[`*(int*)($esp+4)` superview] recursiveDescription]
(id) $7 = 0x0719f940 <UIWebSelectionView: 0x107d74e0; frame = (0 0; 0 0); layer = <CALayer: 0x107d7620>>
| <UIView: 0x107d7770; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x107d77d0>>
| <UIWebSelectionOutline: 0x759b340; frame = (-2 -2; 4 4); userInteractionEnabled = NO; layer = <CALayer: 0x75963e0>>
| | <UIView: 0x759b3f0; frame = (0 0; 0 0); layer = <CALayer: 0x759d580>>
| | <UIView: 0x759da60; frame = (0 0; 0 0); layer = <CALayer: 0x759bfb0>>
| | <UIView: 0x759be40; frame = (0 0; 0 0); layer = <CALayer: 0x759db30>>
| | <UIView: 0x718d150; frame = (0 0; 0 0); layer = <CALayer: 0x719f650>>转载请注明出处: http://blog.csdn.net/horkychen