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

image

使用

例如我们有如下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) {
    }];

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

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

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

image

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

image

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

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

代码

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

参考


Enjoy :slight_smile:

广告和招人,见这篇文章哈 帐号已迁移

4 个赞

补充,经大佬提示,MonkeyDev创建的工程中有lldbtools也可以实现

5 个赞

写的很好

不过我测试的时候发现。我直接能打印block的签名字符串啊

(lldb) po $x0
<ViewController: 0x127e15720>

(lldb) po (char)$x1*
“testBlock:”

(lldb) po $x2
<NSGlobalBlock: 0x1041380d8>

signature: "v20@?0@“NSString"8i16”
invoke : 0x1041317f0 (/private/var/containers/Bundle/Application/178D0259-5FED-4226-AE23-41FA6F6BC2A4/TestDemo.app/TestDemo`__29-[ViewController viewDidLoad]_block_invoke)

(lldb) po [NSMethodSignature signatureWithObjCTypes:"v20@?0@“NSString"8i16”]

我直接用的Xcode测试的

嗯。自己的app没问题。分析其他app时不行。

我写过一个轮子:https://github.com/zljkevin/ZLJBlockPrinter