资讯动态

MASTG-TECH-0094 深度解析:使用 Frida 动态枚举 iOS 应用已加载类与方法

发布时间:2026/10/9 2:37:01 来源:尧图企业网站定制
文档教程网络安全【免费下载链接】mastgThe 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-0039Frida 中有明确描述通过 ObjC API 可以实例化 Objective-C 对象、调用静态/实例方法、枚举特定类的存活实例、通过 Interceptor API 挂钩或替换方法实现。本文讨论的ObjC.enumerateLoadedClasses正是该 API 家族中用于信息收集的关键入口。前置条件让 Frida 能连上 iOS 设备在使用本文所有命令前需要完成两项准备设备端安装frida-server在越狱设备上可通过 Sileo 等第三方应用商店对应 MASTG-TOOL-0064添加 Frida 的官方源https://build.frida.re后安装。默认情况下frida-server仅监听本机接口需要 USB 连接设备除非在受控实验环境中不建议将其暴露到公共网络接口见 MASTG-TOOL-0039 中的安全警告。主机端验证连接使用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才是应用自身定义的业务类。这一区分正是后续分析的第一步先过滤掉系统镜像聚焦应用自有类。在脚本中使用enumerateLoadedClassesREPL 适合快速侦察但如果要系统化收集数据更推荐写成 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.jsoniOS 侧对应的过滤维度则是镜像路径只保留以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.jsconst 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-0095Method Hooking 给出了标准范式先用ObjC.classes.NSURLRequest[- initWithURL:]取得方法引用再Interceptor.attach(URL.implementation, {...})挂钩。将二者串起来典型流程为枚举ObjC.enumerateLoadedClasses()找出应用自有类如CriticalLogic列出方法ObjC.classes.CriticalLogic.$ownMethods定位敏感方法如AES128Operation:data:key:iv:挂钩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本文AndroidMASTG-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过滤的组合。小结动态枚举的三个实战要点先分类再分析enumerateLoadedClasses按镜像分组返回应优先过滤出应用主二进制路径下的类忽略System/Library与usr/lib中的系统类缩小分析面。方法名即线索$ownMethods中带/-前缀与冒号参数的方法名可以直接暴露越狱检测如JailbreakDetection、加密逻辑如doSha256:、AES128Operation:data:key:iv:等高价值目标为后续 Hook 与绕过如参考 MASTG-TECH-0152 中的frida-trace -m -[JailbreakDetectionVC isJailbroken]做法指明方向。REPL 侦察、脚本落地探索阶段用frida -U -f bundle-id REPL 命令快速确认类名与方法签名系统化收集用 Frida 脚本配合-l、-o与jq后处理。相关工具的完整说明可查阅 MASTG-TOOL-0039Frida。动态枚举已加载类与方法是 iOS 黑盒安全评估中成本最低、收益最直接的情报收集手段——它不依赖符号表、不依赖源码只需要 Frida 运行时与几条命令即可为后续的深度逆向绘制出第一张清晰的地图。赞分享文档教程网络安全【免费下载链接】mastgThe 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点击查看免费下载相关推荐用 Frida 动态枚举 Android 应用已加载的 Java 类与方法MASTG-TECH-0042 实战指南用 Frida 动态枚举 Android 应用已加载的 Java 类与方法MASTG TECH 0042 实战指南 本文以 OWASP MASTG 技术条目文档教程网络安全MASTG 实战运行时枚举与提取 iOS 应用已加载动态库Frida 与 Objection 双方案MASTG 实战运行时枚举与提取 iOS 应用已加载动态库Frida 与 Objection 双方案 本指南基于 OWASP MASTG 的 MASTG文档教程网络安全EIP-5988给 EVM 装上 Poseidon 预编译插槽EIP 5988给 EVM 装上 Poseidon 预编译插槽 各家用 Poseidon 各搞各的参数EVM 里却没有一个谁都能复用的哈希预编译。EIP 5文档教程网络安全上一篇告别复杂录屏用FFmpeg轻松生成Vue.Draggable拖拽操作视频下一篇从零搭建TranslucentTB开发环境Visual Studio全流程配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑