☰
MASTG-TECH-0094 深度解析:使用 Frida 动态枚举 iOS 应用已加载类与方法
2026/10/9 2:36:57 网站建设 项目流程
  • 文档
  • 教程
  • 网络安全

【免费下载链接】mastg

The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.

项目地址:https://gitcode.com/gh_mirrors/ow/mastg
点击查看免费下载

本篇技术指南聚焦于 OWASP MASTG 技术清单中的 MASTG-TECH-0094:如何在 iOS 安全测试中使用 Frida 的 Objective-C 运行时 API,动态枚举目标应用已加载的类,并列出每个类声明的实例方法与类方法。它解决的是移动安全测试中"黑盒"阶段的第一步——在不阅读源码的情况下快速绘制应用的对象模型,为后续的方法 Hook、逻辑分析(如越狱检测、加密算法定位)提供精准的切入点。读完本篇,你将掌握ObjC.enumerateLoadedClasses()与ObjC.classes.<classname>.$ownMethods的完整用法、输出解读方法,以及从"枚举类"到"定位关键方法"再到"挂钩方法"的完整实战链路。

为什么需要动态枚举类与方法

在 iOS 逆向与安全评估中,一个常见场景是你拿到了一个编译后的.ipa,无法直接阅读完整源码。此时,Frida 提供的 Objective-C 运行时 API 允许你在进程内直接询问 Objective-C 运行时:这个应用当前加载了哪些类?每个类声明了哪些方法?这一过程完全动态,无需重启应用、无需修改二进制,只需一个可注入 Frida 的运行环境。

Frida 对 iOS 的 ObjC 支持能力在 MASTG-TOOL-0039(Frida) 中有明确描述:通过 ObjC API 可以实例化 Objective-C 对象、调用静态/实例方法、枚举特定类的存活实例、通过 Interceptor API 挂钩或替换方法实现。本文讨论的ObjC.enumerateLoadedClasses正是该 API 家族中用于"信息收集"的关键入口。

前置条件:让 Frida 能连上 iOS 设备

在使用本文所有命令前,需要完成两项准备:

  1. 设备端安装frida-server:在越狱设备上可通过 Sileo 等第三方应用商店(对应 MASTG-TOOL-0064)添加 Frida 的官方源https://build.frida.re后安装。默认情况下frida-server仅监听本机接口,需要 USB 连接设备;除非在受控实验环境中,不建议将其暴露到公共网络接口(见 MASTG-TOOL-0039 中的安全警告)。
  2. 主机端验证连接:使用frida-ps -U列出设备上运行的进程,确认 Frida 与设备通信正常。Frida 自带的 CLI 工具包括frida、frida-ps、frida-ls-devices和frida-trace。

枚举已加载类:ObjC.enumerateLoadedClasses()

MASTG-TECH-0094 给出的核心操作是在 Frida REPL 中直接执行:

$ frida -U -f com.iOweApp [iPhone::com.iOweApp]-> ObjC.enumerateLoadedClasses() { "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation": [ "__NSBlockVariable__", "__NSGlobalBlock__", "__NSFinalizingBlock__", "__NSAutoBlock__", "__NSMallocBlock__", "__NSStackBlock__" ], "/private/var/containers/Bundle/Application/F390A491-3524-40EA-B3F8-6C1FA105A23A/iOweApp.app/iOweApp": [ "JailbreakDetection", "CriticalLogic", "ViewController", "AppDelegate" ] }

解读输出中的几个关键点:

  • 命令构成:frida -U -f com.iOweApp表示通过 USB(-U)以 spawn 模式(-f)启动指定 bundle id 的应用并注入 Frida,随后进入 REPL 交互界面。
  • 返回结构:返回值是一个以镜像路径为键、以类名数组为值的字典。每个键对应一个已加载的 Mach-O 镜像(framework、dylib 或应用主二进制)。
  • 应用代码与系统代码的区分:输出中CoreFoundation.framework下的__NSBlockVariable__、__NSAutoBlock__等是系统运行时内部使用的 Block 辅助类;而应用主二进制路径下(/private/var/containers/Bundle/Application/<UUID>/iOweApp.app/iOweApp)列出的JailbreakDetection、CriticalLogic、ViewController、AppDelegate才是应用自身定义的业务类。这一区分正是后续分析的第一步:先过滤掉系统镜像,聚焦应用自有类。

在脚本中使用enumerateLoadedClasses

REPL 适合快速侦察,但如果要系统化收集数据,更推荐写成 Frida 脚本再通过-l参数加载。这一点在 Android 侧的姊妹技术 MASTG-TECH-0042 中有完整的脚本化范式(iOS 侧同样适用,只是把Java.perform换成 Objective-C 上下文即可):用回调式 API 收集全部已加载类,序列化为 JSON 输出,再用jq等工具做后处理过滤。例如 Android 侧的加载方式:

frida -U -q -F -l java_class_listing.js -o classes.json

其中-q静默模式、-F附加到前台应用、-l指定脚本、-o将脚本输出重定向到文件。对 iOS 而言,只需将-F换成目标应用的进程名或-f <bundle-id>。

过滤输出聚焦应用自身代码

由于已加载类中绝大多数来自系统框架,原始输出非常冗长。MASTG-TECH-0042 展示了用jq过滤特定包名的做法:

jq '.classes[] | select(.package | startswith("org.owasp.mastestapp"))' classes.json

iOS 侧对应的过滤维度则是镜像路径:只保留以Bundle/Application/开头的镜像键,或直接针对应用二进制路径过滤。从源码结构看,Frida 的ObjC.enumerateLoadedClasses返回按镜像分组的字典这一设计,本身就是为了让分析者可以按"来源镜像"快速切片,这正是该类 API 的可用性关键。

列出类中声明的方法:$ownMethods

枚举到业务类之后,下一步是查看每个类声明了哪些方法。MASTG-TECH-0094 给出的方式是访问ObjC.classes.<classname>.$ownMethods:

[iPhone::com.iOweApp]-> ObjC.classes.JailbreakDetection.$ownMethods [ "+ isJailbroken" ] [iPhone::com.iOweApp]-> ObjC.classes.CriticalLogic.$ownMethods [ "+ doSha256:", "- a:", "- AES128Operation:data:key:iv:", "- coreLogic", "- bat", "- b:", "- hexString:" ]

输出解读要点:

  • +与-前缀:+表示类方法(class method),-表示实例方法(instance method)。
  • 冒号后缀:Objective-C 的每个参数对应一个冒号。例如AES128Operation:data:key:iv:是一个带 4 个参数的实例方法,doSha256:是带 1 个参数的类方法;无参数的coreLogic、bat、b:、hexString:则直接以方法名结尾(b:实际是b:接受一个参数)。
  • 安全测试价值:仅凭这两行输出,已经可以对该应用的攻击面做出初步判断——存在JailbreakDetection类(越狱检测逻辑,其+ isJailbroken方法是典型需要绕过或篡改的目标),以及CriticalLogic类(内部包含 SHA-256 与 AES 加解密相关方法,是密码学逻辑审计的入口)。方法名往往直接暴露了安全敏感逻辑,这是动态枚举相比静态扫描更高效的侦察手段。

$ownMethods与相关属性的配合

在 Frida 的 ObjC API 中,$ownMethods只列出类自身声明的方法(不含继承来的方法)。与之配合的常用属性还包括$methods(含继承方法的完整列表)、$className、$superClass等。仓库中的真实演示脚本就大量使用这些属性做运行时决策,例如 MASTG-DEMO-0077 的 script.js:

const classes = ["UITextField", "UITextView", "UISearchBar"]; classes.forEach(inputClass => hook(inputClass)); function hook(inputClass) { const cls = ObjC.classes[inputClass]; if (!cls || !cls["- resignFirstResponder"]) { return; } Interceptor.attach(cls["- resignFirstResponder"].implementation, { onEnter(args) { const self = new ObjC.Object(args[0]); // 使用 $methods 判断方法是否存在,避免调用不存在的 selector if (self.$methods.indexOf("- accessibilityIdentifier") !== -1) { aid = self.accessibilityIdentifier(); } ... } }); }

这段代码展示了从"枚举类"走向"实例级分析"的完整模式:ObjC.classes[inputClass]拿到类对象 → 检查目标 selector 是否存在 →Interceptor.attach(...implementation)挂钩方法 → 在onEnter中用new ObjC.Object(args[0])获取 self 并读取属性。其中用$methods(而非$ownMethods)做存在性检查,正是因为要考虑继承自UIResponder、NSObject的父类方法。

从枚举到 Hook:一条完整的实战链路

MASTG-TECH-0094 本身聚焦于"枚举",而将其落地为攻击面利用,需要与 Frida 的 Hook 能力衔接。仓库中 MASTG-TECH-0095(Method Hooking) 给出了标准范式:先用ObjC.classes.NSURLRequest["- initWithURL:"]取得方法引用,再Interceptor.attach(URL.implementation, {...})挂钩。将二者串起来,典型流程为:

  1. 枚举:ObjC.enumerateLoadedClasses()找出应用自有类(如CriticalLogic);
  2. 列出方法:ObjC.classes.CriticalLogic.$ownMethods定位敏感方法(如AES128Operation:data:key:iv:);
  3. 挂钩:Interceptor.attach(ObjC.classes.CriticalLogic["- AES128Operation:data:key:iv:"].implementation, { onEnter, onLeave })观察输入输出。

这一链条同样体现在仓库测试用例中,例如 MASTG-TEST-0071 通过ObjC.classes.UIActivityViewController['- initWithActivityItems:applicationActivities:'].implementation挂钩分享组件;MASTG-DEMO-0042 的 script.js 挂钩LAContext["- evaluatePolicy:localizedReason:reply:"]绕过生物识别。可见,ObjC.classes.<类名>这一访问器是整个 iOS Frida 工具链的共同基石。

与 Android 侧对应技术的对照

为帮助跨平台理解的读者,MASTG 将相同思路的 Android 技术记录在 MASTG-TECH-0042 中。二者的对应关系如下:

能力iOS(本文)Android(MASTG-TECH-0042)
运行时访问入口ObjC命令 / ObjC APIJava命令 / Java API
枚举已加载类ObjC.enumerateLoadedClasses()Java.enumerateLoadedClasses({onMatch, onComplete})
类方法列表ObjC.classes.<cls>.$ownMethods通过反射/遍历 method 数组
同步机制无(ObjC 运行时可直接访问)需包裹在Java.perform中

一个值得注意的差异:Android 侧因为 ART 虚拟机线程模型,所有运行时交互必须包裹在Java.perform内,且更倾向于写成脚本而非 REPL 单行命令;而 iOS 侧 ObjC API 可直接在 Frida REPL 中交互执行,侦察阶段更加轻量(正如 MASTG-TECH-0094 所示)。当枚举量大、需要结构化输出时,两侧都建议改用脚本 +-o输出文件 +jq过滤的组合。

小结:动态枚举的三个实战要点

  1. 先分类再分析:enumerateLoadedClasses按镜像分组返回,应优先过滤出应用主二进制路径下的类,忽略System/Library与usr/lib中的系统类,缩小分析面。
  2. 方法名即线索:$ownMethods中带+/-前缀与冒号参数的方法名,可以直接暴露越狱检测(如JailbreakDetection)、加密逻辑(如doSha256:、AES128Operation:data:key:iv:)等高价值目标,为后续 Hook 与绕过(如参考 MASTG-TECH-0152 中的frida-trace -m "-[JailbreakDetectionVC isJailbroken]"做法)指明方向。
  3. REPL 侦察、脚本落地:探索阶段用frida -U -f <bundle-id>+ REPL 命令快速确认类名与方法签名;系统化收集用 Frida 脚本配合-l、-o与jq后处理。相关工具的完整说明可查阅 MASTG-TOOL-0039(Frida)。

动态枚举已加载类与方法,是 iOS 黑盒安全评估中成本最低、收益最直接的情报收集手段——它不依赖符号表、不依赖源码,只需要 Frida 运行时与几条命令,即可为后续的深度逆向绘制出第一张清晰的地图。

  • 文档
  • 教程
  • 网络安全

【免费下载链接】mastg

The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.

项目地址:https://gitcode.com/gh_mirrors/ow/mastg
点击查看免费下载
上一篇:告别复杂录屏!用FFmpeg轻松生成Vue.Draggable拖拽操作视频
下一篇:从零搭建TranslucentTB开发环境:Visual Studio全流程配置指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询