lldb快速打印Objective-C方法中block参数的签名

Posted 首先很有趣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lldb快速打印Objective-C方法中block参数的签名相关的知识,希望对你有一定的参考价值。

ios逆向时经常会遇到参数为block类型,本文介绍一个lldb script,可快速打印出Objective-C方法中block参数的类型。


class-dump出的头文件中经常包含如下方法签名:

- (void)doSomethingWithCompletionHandler:(CDUnknownBlockType)arg1;

CDUnknownBlockType 就是block类型的参数。当我们要调用这个方法,就需要知道这个参数类型。

网上搜了下,发现一篇好文章,文章讲解了使用lldb命令找到参数类型的方法。连接如下:

http://www.swiftyper.com/2016/12/16/debuging-objective-c-blocks-in-lldb/

但每次都需要lldb逐个命令的敲打,很是麻烦。于是又搜到一个lldb脚本,

https://github.com/ddeville/block-lldb-script

然而年久失修,不怎么能工作。

那就尝试修复这个脚本吧!

-> debugging .-> debugging ..-> debugging ...-> ....-> fixed, yeah :)

安装

安装lldb script

cd ~git clone git@github.com:everettjf/zlldb.git

然后在 ~/.lldbinit 文件中添加下行内容:

command script import ~/zlldb/main.py

lldb快速打印Objective-C方法中block参数的签名

使用

例如我们有如下block方法

@interface Hello : NSObject@end@implementation Hello+ (void)say:(NSString*)text callback:(void(^)(NSString *text,int x, NSString *y, double z, BOOL m))callback {}@end

调用如下:

[Hello say:@"world" callback:^(NSString *text, int x, NSString *y, double z, BOOL m) { }];

那么我们断点到这个调用行:

lldb快速打印Objective-C方法中block参数的签名

如果是逆向工作的话,没有代码,那可以断点到 objc_msgSend 这行,如下:

lldb快速打印Objective-C方法中block参数的签名

block是第二个参数,那么打印出 $arg4

lldb快速打印Objective-C方法中block参数的签名

然后执行命令 zblock 0x100588080 (block的地址传给 zblock命令),然后block的参数就出来啦。

根据每一行的 type encoding 对照苹果的文档即可知道block的参数都有什么。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html

代码

https://github.com/everettjf/zlldb

由于Xcode11内置的lldb script开始默认Python3版本,facebook的chisel还有些支持问题(可能现在解决了)。zlldb就是把我自己常用的几个命令放到了这里,支持Python3(也就是最新版Xcode)。除了zblock外,还有几个简单的命令,大家可以参考README。

参考

  • http://www.swiftyper.com/2016/12/16/debuging-objective-c-blocks-in-lldb/
  • https://maniacdev.com/2013/11/tutorial-an-in-depth-guide-to-objective-c-block-debugging
  • https://github.com/ddeville/block-lldb-script
  • https://store.raywenderlich.com/products/advanced-apple-debugging-and-reverse-engineering

Enjoy :)


广告:抖音团队招iOS开发,初级、中级、高级开发都有需要,欢迎随时联系我( 微信:everettjf )。如果不好意思联系我,可以直接扫描下面的二维码选择职位投递。




以上是关于lldb快速打印Objective-C方法中block参数的签名的主要内容,如果未能解决你的问题,请参考以下文章

(lldb) 以十六进制打印 unsigned long long

lldb----打印出类中所有函数的入口地址

使用 Xcode/LLDB 打印/调试 libc++ STL

编写 Python 脚本以在 lldb 中打印出一个 recs 数组

快速在 LLDB 中使用 po

打印变量时出错 lldb_expr