恢复作为参数的block

在逆向的过程中,经常会遇到参数为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 0x000000016fd76348NSStackBlock: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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ilcy流云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值