如何使用Frida JavaScript API读取NSDictionary并转为JS对象?
问题描述
通过Frida拦截NSURLConnection的sendSynchronousRequest:returningResponse:error:类方法时,尝试获取NSURLRequest对象的allHTTPHeaderFields属性(应为NSDictionary类型),但打印结果为函数而非字典内容,目标是将该NSDictionary转为指定格式的JavaScript对象。
原测试脚本:
const className = 'NSURLConnection' const methodName = 'sendSynchronousRequest:returningResponse:error:' Interceptor.attach(ObjC.classes[className][`+ ${methodName}`].implementation, { onEnter: function (args) { const request = new ObjC.Object(args[2]) console.log('HTTPHeaders', request.allHTTPHeaderFields) } })
实际打印结果:
HTTPHeaders function () { return retType.fromNative.call(this, objc_msgSend(this, sel)); }
期望输出格式:
{ key1: value1, key2: value2 }
解决方法
问题根源是Frida中访问Objective-C属性时,直接访问属性名得到的是该属性的getter函数,必须通过函数调用才能获取实际值。
修改后的可用脚本:
const className = 'NSURLConnection' const methodName = 'sendSynchronousRequest:returningResponse:error:' Interceptor.attach(ObjC.classes[className][`+ ${methodName}`].implementation, { onEnter: function (args) { const request = new ObjC.Object(args[2]) // 调用getter函数获取NSDictionary实例 const headersDict = request.allHTTPHeaderFields() // 将NSDictionary转换为JavaScript对象 const jsHeaders = headersDict.toJS() console.log('HTTPHeaders', jsHeaders) } })
核心要点:
request.allHTTPHeaderFields():通过调用属性的getter函数,拿到实际的NSDictionary对象headersDict.toJS():Frida内置方法,可直接将Objective-C容器类(NSDictionary/NSArray等)转换为对应的JavaScript对象/数组,自动完成类型映射
执行修改后的脚本后,就能得到符合预期的键值对格式JavaScript对象。
内容的提问来源于stack exchange,提问作者PyKKe
相关产品推荐
相关产品推荐

