25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
L_sel_forwardingTargetForSelector:
.long L_str_forwardingTargetForSelector
.section __OBJC, __image_info
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
.macro forward dispatch_func
pushl %ebp
movl %esp, %ebp
pushl 8(%ebp)
call _object_getClass
addl $4, %esp
movl %eax, %edx
call get_eip
L0_\dispatch_func:
pushl L_sel_forwardingTargetForSelector-L0_\dispatch_func(%eax)
pushl %edx
call _class_respondsToSelector
addl $8, %esp
testl %eax, %eax
jz fail
pushl 12(%ebp)
call get_eip
L1_\dispatch_func:
pushl L_sel_forwardingTargetForSelector-L1_\dispatch_func(%eax)
pushl 8(%ebp)
call _objc_msgSend
testl %eax, %eax
jz fail
cmpl 8(%ebp), %eax
je fail
movl %eax, 8(%ebp)
movl %ebp, %esp
popl %ebp
jmp \dispatch_func
.endmacro
_of_forward:
forward _objc_msgSend
_of_forward_stret:
forward _objc_msgSend_stret
fail:
movl %ebp, %esp
popl %ebp
jmp _of_method_not_found
get_eip:
movl (%esp), %eax
ret
|
|
<
|
|
|
|
|
>
|
>
>
>
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
>
|
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
L_sel_forwardingTargetForSelector:
.long L_str_forwardingTargetForSelector
.section __OBJC, __image_info
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
_of_forward:
pushl %ebp
movl %esp, %ebp
pushl 8(%ebp)
call _object_getClass
addl $4, %esp
call get_eip
L0:
pushl L_sel_forwardingTargetForSelector-L0(%edx)
pushl %eax
call _class_respondsToSelector
addl $8, %esp
testl %eax, %eax
jz fail
pushl 12(%ebp)
call get_eip
L1:
pushl L_sel_forwardingTargetForSelector-L1(%edx)
pushl 8(%ebp)
call _objc_msgSend
testl %eax, %eax
jz fail
cmpl 8(%ebp), %eax
je fail
movl %eax, 8(%ebp)
movl %ebp, %esp
popl %ebp
jmp _objc_msgSend
fail:
movl %ebp, %esp
popl %ebp
jmp _of_method_not_found
_of_forward_stret:
pushl %ebp
movl %esp, %ebp
pushl 12(%ebp)
call _object_getClass
addl $4, %esp
call get_eip
L2:
pushl L_sel_forwardingTargetForSelector-L2(%edx)
pushl %eax
call _class_respondsToSelector
addl $8, %esp
testl %eax, %eax
jz fail_stret
pushl 16(%ebp)
call get_eip
L3:
pushl L_sel_forwardingTargetForSelector-L3(%edx)
pushl 12(%ebp)
call _objc_msgSend
testl %eax, %eax
jz fail_stret
cmpl 12(%ebp), %eax
je fail_stret
movl %eax, 12(%ebp)
movl %ebp, %esp
popl %ebp
jmp _objc_msgSend_stret
fail_stret:
movl 12(%ebp), %eax
movl %eax, 8(%ebp)
movl 16(%ebp), %eax
movl %eax, 12(%ebp)
movl %ebp, %esp
popl %ebp
jmp _of_method_not_found
get_eip:
movl (%esp), %edx
ret
|