ARM64下定位block的函数地址失败

参考了dispatch_async(queue, block)中block代码块的定位

在dispatch_async(queue, block)里面寻找block的函数指针,但是发现在ARM64上的表现好像不太对,找不到*FuncPtr,操作如下:

将原文中的指令修改

me r --size 4 --format x

修改为

me r --size 8 --format x

(lldb) me r --size 8 --format x 0x16fd78420
0x16fd78420: 0x000000019fefb218 0x00000000c2000000
0x16fd78430: 0x00000001032b3164 0x0000000103413540
0x16fd78440: 0x000000013617ae40 0x0000000100000003
0x16fd78450: 0x00000001032a3ef4 0x00000001032b50d4
(lldb) po 0x000000019fefb218
NSStackBlock

第一个数据的类型为:NSStackBlock(与文中相同)
第二个数据也跟文章一样0xc2000000(与文中相同)

但是第三和第四个数据似乎不是分别对应int Reserved;和void FuncPtr;
计算偏移量后,发现第三和第四个数据都不是指向一个函数的开端,所以判断应该不是
FuncPtr,请问应该怎样找到*FuncPtr呢?

1 个赞

我也碰到了这个问题,但还没有解决

isa指针,一般是_NSConcreteStackBlock和_NSConcreteGlobalBlock吧,_NSConcreteStackBlock是栈上面的,_NSConcreteGlobalBlock是静态的

看看这个链接