问题产生:
最近我在逆向一个 app ,遇到了一个 ObjectiveC 类成员函数,在模拟调用时发生了崩溃。进行了诸多尝试无果后,向论坛大佬求助。。。
收集信息:
通过 classdump 看,其格式为:
- (void) addTo:(id)arg1 block:(CDUnknownBlockType)arg2;
通过ida的f5直接查看,得到信息如下:
objc_msgSend(
v45,
"addTo:block:",
v30,
&v51,
_NSConcreteStackBlock,
3254779904LL,
sub_10016847C,
&unk_101102AB0);
因为这个函数2个参数,所以我感觉ida-f5出来的不太对,就又看了一下汇编代码:
MOV X3, SP // 这里给x3 也就是 block参数赋值为sp。。。
MOV X0, X24 ; void *
MOV X1, X22 ; char *
MOV X2, X23
BL _objc_msgSend
所以我尝试调用的方法:
objc_msgSend(obj, @selector(addTo:block:), arg1, _NSConcreteStackBlock);
结果崩溃了。。。
==============================
问题:
1.我在崩溃后查看了这个block在头文件中的定义,发现如下内容:
// Used by the compiler. Do not use these variables yourself.
看起来意思是不让开发者自己用,
那么为什么,在我 dump 出来的函数中就有参数使用了这个 block 呢?
2.求问大佬,遇到这种参数的时候,应该如何模拟其调用呢?