设备: iphoneSE
系统:9.3.2 已经越狱
背景: 尝试去拿到猫眼App的排期信息, 发现对应动作被放在一个Block中, 如下图
按照狗神的方法, 拿到了Block的函数地址 0x102438000
拿到Hooper上面去看 是这个样子
想要的效果是可以拿到在Block中执行每一步的相关信息.
不知道错误原因 向各位请教.
设备: iphoneSE
系统:9.3.2 已经越狱
背景: 尝试去拿到猫眼App的排期信息, 发现对应动作被放在一个Block中, 如下图
按照狗神的方法, 拿到了Block的函数地址 0x102438000
想要的效果是可以拿到在Block中执行每一步的相关信息.
不知道错误原因 向各位请教.
git 搜索 CTBlockDescription
是两个东西吧, 这个主要是能知道Block的类型以及入参什么的, 而我是希望能拿到Block中每一步的执行
看你 e0c0 处的 Block ISA 的值好像有点奇怪,不知道是不是 32 位的关系,可以先 dis -a 一下 e0d0 那个地址看看能不能解出 invoker,如果这边能解出但是 Hopper 内的内容不对,可能是 vm 的基址不是 0x100000000,可以找对应的段计算下 vm 的基址。
感谢回复! 去确定了 是64位系统(SE A9处理器)
这张图是我去 dis -a自己正向代码里面的
然后去搞逆向里面的地址 就变成了这样
这个代表就是我拿到的地址压根就不对 不是对应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 ...
}
谢谢 这样是对的 和 memory read --size 8 --format x
出来是一样的.
现在拿到了一些关键信息 谢谢你愿意一直回复我!