美文网首页
恢复作为参数的block

恢复作为参数的block

作者: 不仅仅是个程序猿 | 来源:发表于2021-01-11 08:47 被阅读0次

在逆向的过程中,经常会遇到参数为block的情况,这时候就要求我们能还原block的实现。还原block要做的有找出block的返回值,参数,指向的函数实现。

比如一个函数 - [LAWVPluginInstanceController handleJavaScriptRequest:callback:],callback后面的参数即是block,那要怎么还原它呢?

首先我们要通过lldb给这个方法下一个断点,然后读取寄存器中的值。科普下,arm64下寄存器x0-x7用来存放方法的参数,超出8个参数的其余参数放在栈上,x0寄存器存放返回值。objc_msgSend(id receiver, SEL selector, ...)调用时,寄存器x0中存的是调用方法的对象的地址,x1存的是SEL,x2存的是方法的第一个参数request,x3存的是方法的第二个参数block。
register read x3
x3 = 0x000000016fd76348

0x000000016fd76348即是block的地址

po 0x000000016fd76348
NSStackBlock:0x16fd76348 //block的isa

x/8g 0x16fd76348 //读内存
根据block的内存结构,前8个字节(64位)是isa,再4个字节是flag(标记位),再4个字节是reserved(保留字段),再8个字节是invoke指针,再8个字节是block的描述(0x0104739790)。

x/8g 0x0104739790 //读内存

由block的结构可知,第33个字节开始的8个字节是签名信息(0x0105794244)

p (char *) 0x0105794244
(const char *)$3 = 0x0000000105794244 "i12@?0i8"

"i12@?0i8" 即为block的签名

NSMethodSignature *sig = [NSMethodSignature signatureWithObjCTypes:"i12@?0i8"];
NSLog(@"11== %@",sig);    //输出block的签名信息

第一个i表示返回值是int,12表示block的参数size为12字节,@?表示第一个参数是对象类型,即是block本身,0表示offset从0开始,接下来的i表示第二个参数类型是int,8表示offset为8字节

po sig


截屏2020-12-25下午9.02.56.png

最终得出,block的返回值是int类型,参数是int 类型。
int (^block) (int)

相关文章

  • 恢复作为参数的block

    在逆向的过程中,经常会遇到参数为block的情况,这时候就要求我们能还原block的实现。还原block要做的有找...

  • block在开发中的使用场景

    block作为函数的参数 怎么判断参数是不是block 看参数有没有,如果有,就是block参数 作为参数的blo...

  • block作为参数

    应用场景:网络请求或者在一些异步代码中有先后顺序的情况下。例如:1、 网络请求成功之后,再利用请求的结果数据去做其...

  • block使用方法

    block基本使用 没有参数,=左边的()里面要写上void。 作为方法的参数传递使用 怎么区分参数是block?...

  • Block数组作为参数

    这里先简单举个数组中全是相同类型的Block的例子。 先声明一个Block类型 typedef void(^ZCB...

  • block 作为函数参数

  • block作为参数传递

    众所周知,block是iOS开发中一个经常使用的模块, block 可以用来包含一段代码块,可以传值, 用法灵活,...

  • Block的用法

    1.block作为属性 写法1:typedef声明block名称 写法2:直接书写 2.block作为参数 写法:...

  • block作为参数的使用

    持有block @property (nonatomic, copy) void(^locationBlock)(...

  • Block常见使用总结(传值/作为参数/作为返回值等)

    来做个block的笔记。 block定义 block类型 block传值 block作为参数的方法定义与调用 bl...

网友评论

      本文标题:恢复作为参数的block

      本文链接:https://www.haomeiwen.com/subject/fmvinktx.html