——用 swift-demangle 与 c++filt 还原 Swift/C++ 函数签名)
文档教程网络安全【免费下载链接】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点击查看免费下载在 iOS 应用的逆向分析与安全测试中编译器会对程序中的标识符进行名称修饰name mangling生成难以直接阅读的符号名。本指南以 OWASP Mobile Application Security Testing GuideMASTG中 MASTG-TECH-0114Demangling Symbols 为骨架结合仓库内的工具清单与平台测试用例系统讲解符号修饰的成因、Swift 符号反修饰工具swift-demangle与 C 符号反修饰工具cfilt的完整用法并给出从二进制符号提取到签名还原的实战工作流。读完本文你将能够在静态分析如rabin2提取符号和动态追踪如 Frida 记录 Swift 函数调用两个场景下快速把晦涩的修饰符号还原为可读的类名、方法名、参数类型与返回类型。为什么需要符号反修饰理解 name mangling为了让程序内的一些标识符保持唯一编译器会对其符号名进行加工处理这一过程称为名称修饰name mangling或简称 mangling。处理后的符号往往对人类阅读极不友好而且其格式与源语言、编译器紧密相关甚至可能随编译器版本变化。在 iOS 生态中你会在以下两类场景频繁遇到修饰符号Swift 代码Swift 编译器将函数、方法、属性等编码为包含模块名、参数类型等信息的修饰符号例如__T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO这样的字符串。C/C 代码C 编译器依据 Itanium C ABI 等标准对模板、重载函数、命名空间进行编码例如_ZSt6vectorIiSaIiEE。这些符号在二进制文件、崩溃日志、反汇编视图和动态追踪输出中随处可见。若不做反修饰demangling你将难以判断一个符号对应哪个类、哪个方法、接收哪些参数。MASTG 将反修饰列为独立的 iOS 分析技术MASTG-TECH-0114并分别推荐了 swift-demangle 与 cfilt 两个工具来逆转修饰过程。还原 Swift 符号swift-demangle工具与调用方式swift-demangle 是随 Xcode 分发的命令行工具专门用于将 Swift 修饰符号还原为人类可读形式。它通常不直接位于 PATH 中而是通过 xcrun 间接调用xcrun 可从命令行调用 Xcode 开发者工具而无需把它们加入 PATH例如定位并运行 swift-demangle 或 simctl。安装 Xcode 后可用xcrun swift-demangle -help查看完整帮助信息。基本用法将修饰后的 Swift 符号作为参数传给 swift-demangle 即可$ xcrun swift-demangle __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO _T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO --- nonobjc __C.WKWebView.init(frame: __C_Synthesized.CGRect, configuration: __C.WKWebViewConfiguration) - __C.WKWebView输出直观地揭示了这是一个WKWebView的初始化方法init(frame:configuration:)参数为CGRect与WKWebViewConfiguration返回WKWebView实例。nonobjc标记表明该构造器未暴露给 Objective-C 运行时。需要注意的是Swift 修饰符号在二进制中可能呈现不同前缀形式如_T0、$S等这与编译版本和符号存放位置有关无论前缀如何均可交给 swift-demangle 统一还原。实战一静态分析时还原 WebView 符号在 MASTG-TEST-0076Testing iOS WebViews 中测试者先用 rabin2Radare2 框架中的二进制信息提取工具在二进制里搜索与WKWebView相关的字符串$ rabin2 -zzq ./WheresMyBrowser | egrep WKWebView.*frame 0x5c3ac 77 76 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfC 0x5d97a 79 78 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO 0x6b5d5 77 76 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfC 0x6c3fa 79 78 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO这里找到的正是修饰过的init(frame:configuration:)符号。随后即可对其反修饰$ xcrun swift-demangle __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO --- nonobjc __C.WKWebView.init(frame: __C_Synthesized.CGRect, configuration: __C.WKWebViewConfiguration) - __C.WKWebView还原出的完整签名可直接与源码级知识对照确认应用使用了哪些 WebView 初始化路径——这是判断javaScriptEnabled等安全配置是否被正确设置的前提步骤之一。实战二动态追踪后还原 Swift 函数签名在无源码场景下Frida 动态追踪见 MASTG-TECH-0176Monitoring Universal Link Handlers at Runtime with Frida会打印出 Swift 函数的修饰符号例如$S10TelegramUI15openExternalUrl7account7context3url05forceD016presentationData 18applicationContext20navigationController12dismissInputy0A4Core7AccountC_AA14OpenURLContextOSSSbAA0 12PresentationK0CAA0a11ApplicationM0C7Display010NavigationO0CSgyyctF()MASTG-TEST-0070Testing Universal Links 展示了如何用 swift-demangle 还原该符号$ xcrun swift-demangle S10TelegramUI15openExternalUrl7account7context3url05forceD016presentationData 18applicationContext20navigationController12dismissInputy0A4Core7AccountC_AA14OpenURLContextOSSSbAA0 12PresentationK0CAA0a11ApplicationM0C7Display010NavigationO0CSgyyctF还原结果为--- TelegramUI.openExternalUrl( account: TelegramCore.Account, context: TelegramUI.OpenURLContext, url: Swift.String, forceExternal: Swift.Bool, presentationData: TelegramUI.PresentationData, applicationContext: TelegramUI.TelegramApplicationContext, navigationController: Display.NavigationController?, dismissInput: () - ()) - ()如该测试文档所强调反修饰不仅给出方法所属的模块类与方法名还完整揭示参数类型与返回类型使你能据此深入追踪调用链。例如在上述还原结果的指导下测试者可以直接编辑 Frida 生成的 stub 文件按参数位置逐一打印每个实参的运行时值实现对 Swift 函数的精确插桩。还原 C 符号cfilt工具说明cfilt 是 GNU binutils 提供的反修饰工具可将 C 修饰符号转换为可读字符串调用方式为cfilt symbol其完整用法参见 man page。它横跨 macOS、Windows、Linux 三个平台适合在任意分析环境中使用。若要在 macOS 上从命令行获取通常也可借助xcrun等工具定位 binutils 相关程序。基本用法cfilt _ZSt6vectorIiSaIiEE std::vectorint, std::allocatorint解读示例以_ZSt6vectorIiSaIiEE为例可以按 Itanium C ABI 的规则简要拆解其含义_ZItanium C ABI 修饰符号的固定前缀St表示std命名空间6vector模板名vector长度前缀 6Ii模板实参intSaIiE嵌套的模板实参std::allocatorint。因此最终还原为std::vectorint, std::allocatorint。在 iOS 二进制中凡是看到_Z开头的符号基本都可以判断为 C或 Objective-C代码产物直接交给cfilt即可获得可读签名。实战工作流从符号提取到反修饰将上述工具串联起来即构成一条完整的 iOS 符号分析流水线定位符号来源静态场景下用 rabin2 的-zz/-zzq参数从 Mach-O 二进制提取字符串与符号表见 MASTG-TEST-0076动态场景下用 Frida 的frida-trace记录被调用的 Swift/C 函数符号见 MASTG-TECH-0176 与 MASTG-TEST-0070。识别符号语言_T0/$S类前缀通常对应 Swift_Z前缀通常对应 CItanium ABIObjective-C 方法则直接以-[ClassName methodName:]形式存在无需反修饰。选择反修饰工具Swift 符号交给xcrun swift-demangleC 符号交给cfilt两者均以符号文本为参数输出即还原后的完整签名。利用签名深化分析还原出的模块名、方法名、参数类型与返回类型可直接用于定位关键逻辑、编辑 Frida 插桩 stub 或对照源码验证实现。小结符号反修饰是 iOS 逆向测试中最基础也最高频的操作之一无论是通过 rabin2 在二进制中筛选 Swift 字符串如 MASTG-TEST-0076还是通过 Frida 追踪 Universal Link 处理函数如 MASTG-TEST-0070 与 MASTG-TECH-0176swift-demangle与cfilt都能将晦涩的修饰符号还原为结构完整、语义清晰的函数签名让后续的调用链分析与插桩工作有据可依。掌握 MASTG-TECH-0114 所描述的这套方法是每一位 iOS 安全测试人员进入符号级分析前的必修课。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐Swift Runtime 模块 demangle 函数在进程内安全、高效地将 mangled 符号还原为可读形式SE-0498Swift Runtime 模块 demangle 函数在进程内安全、高效地将 mangled 符号还原为可读形式SE 0498 导读 本文基于 Swif文档深度解析ZLIB压缩库RFC 1950技术实现与最佳实践指南深度解析ZLIB压缩库RFC 1950技术实现与最佳实践指南 ZLIB压缩库作为DEFLATE算法的标准实现定义了RFC 1950数据格式规范为网络传输、数据工程async-profiler demangle技术C名称反混淆解析async profiler demangle技术C名称反混淆解析 引言为什么需要名称反混淆 在性能分析过程中开发者经常会遇到令人困惑的C符号名性能剖析开发工具可观测性上一篇5分钟掌握椰羊cocogoat原神玩家的终极游戏工具箱与自动化工具下一篇VisualCppRedist AIO终极解决方案3分钟解决Windows程序运行依赖问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考