如何使用Frida JS API读取Objective-C指针指针(**)并访问对象
解决Frida拦截
sendSynchronousRequest:returningResponse:error:时访问二级指针的问题 你的问题核心是未正确处理**NSURLResponse这种二级指针,且错误地在onEnter阶段访问输出参数,导致崩溃。以下是修复方案:
问题原因
sendSynchronousRequest:returningResponse:error:的response参数是二级指针(NSURLResponse **),args[3]是这个二级指针的地址,直接用它初始化ObjC.Object会把二级指针当成对象指针,必然崩溃。onEnter阶段方法还未执行,response指向的内存还没被赋值为有效对象指针,此时访问会触发空指针错误。
修复代码
const className = 'NSURLConnection' const methodName = 'sendSynchronousRequest:returningResponse:error:' Interceptor.attach(ObjC.classes[className][`+ ${methodName}`].implementation, { onLeave: function (retval) { // 从二级指针中读取实际的对象指针 const responsePtr = args[3].readPointer(); // 检查指针有效性,避免空指针访问 if (!responsePtr.isNull()) { const response = new ObjC.Object(responsePtr); console.log('URL', response.URL().toString()); } } })
关键说明
- 用
readPointer()从二级指针(args[3])中读取真正的NSURLResponse对象指针,完成解引用操作。 - 移至
onLeave阶段处理:此时方法已执行完毕,response输出参数已被正确赋值为有效对象指针。 - 增加
isNull()检查:避免方法执行失败时response仍为空导致的崩溃。
内容的提问来源于stack exchange,提问作者PyKKe
相关产品推荐
相关产品推荐

