使用block函数指针地址在Hooper上定位执行代码的问题

设备: iphoneSE
系统:9.3.2 已经越狱

背景: 尝试去拿到猫眼App的排期信息, 发现对应动作被放在一个Block中, 如下图
WechatIMG3
按照狗神的方法, 拿到了Block的函数地址 0x102438000


拿到Hooper上面去看 是这个样子

想要的效果是可以拿到在Block中执行每一步的相关信息.

不知道错误原因 向各位请教.

git 搜索 CTBlockDescription

是两个东西吧, 这个主要是能知道Block的类型以及入参什么的, 而我是希望能拿到Block中每一步的执行

看你 e0c0 处的 Block ISA 的值好像有点奇怪,不知道是不是 32 位的关系,可以先 dis -a 一下 e0d0 那个地址看看能不能解出 invoker,如果这边能解出但是 Hopper 内的内容不对,可能是 vm 的基址不是 0x100000000,可以找对应的段计算下 vm 的基址。

感谢回复! 去确定了 是64位系统(SE A9处理器)
这张图是我去 dis -a自己正向代码里面的

然后去搞逆向里面的地址 就变成了这样
WechatIMG2

这个代表就是我拿到的地址压根就不对 不是对应Block的isa地址么…
还有会好奇怎么第一眼看出来这个isa地址奇怪的 谢谢!

因为 Block 的 ISA 和一般的类实例差不多,都指向一个类对象,那个 0x4 显然不是一个元类的有效地址。

还是想再问下, 因为如果ISA指针地址不对的话, 就不应该能打印出来这个arg Block的参数, 可是如下图, 他是可以打出来的. 好奇这个是为什么?

然后 dis -a 这个ISA地址的话 还是会报 Could not find function bounds

以及我这个地址就是hook到之后直接打印出来的, 应该是对的啊.

dis -a 的应该是 [isa + 16],也就是 block_invoker 指针的值。

既然 CTBlockDescription 可以打印出 signature,说明你传入的 block 指针是正确的,你可以在它的源码里加一个句来获取 invoke 的地址,但这个和从 [isa + 16] 获取到的应该是一样的:

@implementation CTBlockDescription

- (id)initWithBlock:(id)block
{
    if (self = [super init]) {
        _block = block;
        
        struct CTBlockLiteral *blockRef = (__bridge struct CTBlockLiteral *)block;
        _flags = blockRef->flags;
        _size = blockRef->descriptor->size;
        // get invoke by blockRef->invoke

        // omit codes ...
}
1 Like

谢谢 这样是对的 和 memory read --size 8 --format x出来是一样的.
现在拿到了一些关键信息 谢谢你愿意一直回复我!