逆向获取block对应函数入口和函数签名
在逆向分析App的时候,有时会遇到某个关键方法中传入一个block参数来做回调,class-dump无法解析出block的类型以及函数签名。了解过block本质及其内存模型后,就可以通过lldb动态调试来获取目标信息
block的内存结构
在LLVM文档中,找到block的实现规范Block Implementation Specification,找到block内存结构的定义
1 | struct Block_literal_1 { |
其中block对应的实现函数地址入口和函数签名分别在void (*invoke)(void *, ...);
和descriptor
中的const char *signature;
中保存
实例
某app中的某个带block参数的方法
- (void)parseRequest:(id)arg1 result:(id)arg2 completion:(id)arg3;
祭出debugserver和lldb
debugserver启动
LLDB connect
定位目标方法内存地址
断点并触发
获取block参数对象
block内存实例
检查block是否有函数签名
检查block是否有copy和dispose函数指针
descriptor布局
函数签名信息
最后得到的函数签名字符编码,可在官方Type Encoding中找到
从图中可以看出,block参数个数为3,block 的返回值为void
,第一个参数为block自身,通常在block语法参数列表省略,第二个参数为NSArray
类型,第三个参数为BOOL
类型