逆向遇到“ _NSConcreteStackBlock”的疑惑

问题产生:
最近我在逆向一个 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.求问大佬,遇到这种参数的时候,应该如何模拟其调用呢?

补充一个问题,
根据在论坛搜到的一些文章我对这个block有了初步了解。
如果我希望,在这里填一个空的回调函数作为block,应该如何来写呢?

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

问题已经搞定,
遇到这种问题,模拟一个block函数进去就OK了

1 个赞

你好请教下 这类型的block怎么构造参数