关于书中64位下逆向iMessage的过程

前面过程省略,在从[CKPendingConversation setComposeSendingService:]逆向到[CKPendingConversation refreshComposeSendingServiceForAddresses:withCompletionBlock:]这个函数时,再找数据源


图中x2来源于x19,然后追踪到x19赋值的位置,图片红框的所示位置,x19来源于x0,x0应该就是上面的bl 0x18f0f2634。
然后再在lldb中进行调试,在上处打断点,打印信息如下:

此处的几个值都有些不明白,根据hopper中显示,我在下断点的地方之前x0,x1,x2都没有被赋值过。
1、在进入bl跳转的函数前x0返回的是一个__NSMallocBlock__,这是一个什么对象?
2、x1的值是一个IMService[iMessage],为什么不是refreshComposeSendingServiceForAddresses:withCompletionBlock?
3、x2是一个什么对象?
4、进入bl以后,x0和x1是一样的内容IMService[iMessage],这是为什么?然后bl跳转函数执行完成后,x0还是IMService[iMessage]。到此处就想不明白了,不能接着往下找数据源了

  1. 建议在BL objc_msgSend上断住后再查看各寄存器的值;
  2. 同上;
  3. po [$x2 class]
  4. 同1、2

进入bl的函数后也发现都是一样的数据,看不明白这个函数是什么意思,我的线索才断的,请问下要怎么处理?

x1是调用方传进来的

你要断在objc_msgSend上;这里的objc_msgSend符号被抹掉了,你在每个blb上都试试p (char *)$x1,大概就可以猜到哪个blbl objc_msgSend

请问下[CKPendingConversation refreshComposeSendingServiceForAddresses:withCompletionBlock:]第一个函数中的bl是内存释放操作吗?
因为si进入,再ni就会直接跳回到[CKPendingConversation refreshComposeSendingServiceForAddresses:withCompletionBlock:]。而在这个bl跳转的函数里面,如我上面的第3个图片所示,会出现objc_retain、objc_retainAutorelease等操作。而接着往下执行,这个函数会跳转到refreshStatusForAddresses:withCompletionBlock:,这样就和书上内容一致了

具体是指哪个bl

这一个

你断在上面,分别操作:

po $x0
p (char *)$x1

看看得到什么结果,然后大概就能猜到它是不是objc_msgSend