逆向block参数类型memory read failed for 0x48c78948d07d8800

逆向ios block参数类型,但是遇到问题,读取内存报错: memory read failed for 0x48c78948d07d8800


如图所示,写了一个测试代码,断点想获取t这个block的签名,从而获取block类型,但是在读取block
descriptor的时候始终报这个错,读取内存失败。不知道是为什么。有大佬给解释一下吗?

没人能指点一下么?

你觉的 0x48c78948d07d8800 这个地址对吗

都提示读取失败了,那肯定是不对的,但是0x48c78948d07d8948这个地址就是descriptor的地址啊

这结论是哪来的

block 地址 0x0000000100e46e00是这个,

void *isa;
 int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor_1; 

8+4+4+8=24,也就是偏移24是descriptor。是不是这样的?
前一阵我还用这个方式在monkeydev里面成功得到block签名的,最近想再继续研究一下,结果不行了。

po t 拿到的是 block_invoker 地址而非 block_isa,而且这个地址是 invoke 的代码段地址,所以你拿到的那些都是机器码。最简单的办法就是用 NSLog(@"%@", theBlock) 拿到 block_isa 的地址。

block 指针根据你的语义所对应的值会有变化,比如入参中的值,拿到的是 invoke 指向的函数地址;但如果用类似 void *theBlock = (void *)block 的方式,则 theBlock 是 block_ptr 的地址,也就是 block 的起始地址。

确实是block地址错了,block_isa的地址搞错了