You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:17:22