iOS framework / dylib动态库定向加固实战(小蟹iOS混淆工具)
文章来源参考官方文档:https://crab‑https://ios.com/docs/site/新手教程/harden/
适用:自研Framework、dylib动态库安全防护,提升逆向破解成本;支持ObjC、Swift、Flutter、Cocos、Unity等项目。
一、背景说明
在iOS开发中,很多项目会把核心业务逻辑、加密算法封装到framework或者dylib动态库中。但是编译输出的Mach‑O二进制文件,很容易被Hopper、IDA等逆向工具分析,核心算法、接口逻辑存在被窃取风险。
传统混淆工具大多针对主App可执行文件;而小蟹iOS加固支持对framework/dylib做定向加固,编译层IR级加固,不需要修改业务源码,专门保护SDK与动态库二进制安全。
重要提示:已经完全编译完成、没有LLVM‑IR中间代码的二进制动态库,不支持IR定向加固,需要保留源码参与编译流程。
什么时候使用定向加固
当你希望提高App、Framework、dylib的逆向分析成本,保护核心算法、鉴权逻辑、加密逻辑,就需要使用定向加固能力。
framework / dylib是否需要搭配通用混淆?
✅官方最佳实践:Framework/dylib一般只需要定向加固,不需要额外开启全量通用混淆。
- 只需要开启两个核心能力:防dump、objcsel加密PASS,即可满足SDK安全防护。
- 通用混淆适合App主程序整体资源、符号深度保护;如果给framework随意叠加全量混淆,会大幅提升闪退、运行异常概率,同时问题排查难度成倍增加。
⚠️风险提醒:
开启防dump功能 后,如果代码使用xib/storyboard、valueForKey:动态访问属性,会直接引发运行崩溃,相关类、方法务必加入阻止清单,规避兼容性故障。
如果业务需要App整体高安全等级保护:加固做完测试无问题,再叠加通用混淆;加固、混淆分开测试,不要一次性全部开启,方便定位bug。开启混淆+加固后,崩溃、异常定位难度会显著上升。
二、完整操作步骤
步骤1:复制Release编译配置,新建 CrabRelease
我们不能直接修改原生Release配置,需要拷贝一份Release副本,命名为CrabRelease专门用于加固编译。
- 打开Xcode工程,进入Project → Info → Configurations
- 点击
+号,选择 Duplicate "Release" Configuration - 将新生成配置重命名为:
CrabRelease
目的:原生Release保留用于普通打包,CrabRelease专门跑加固逻辑,出问题可以快速对比排查。
步骤2:下载匹配Xcode版本的加固引擎
加固引擎版本必须和本机Xcode版本严格匹配,版本不匹配直接编译失败。
- 打开【小蟹iOS加固】客户端,进入「下载管理」页面
- 查看本机当前Xcode版本,选择对应版本的加固引擎下载安装
- 确认本地安装目录,记录COVLL环境版本
步骤3:新建加固工程配置,指定 CrabRelease
- 在工具客户端点击「新建配置」
- 选择你的Xcode工程
.xcodeproj文件 - Configuration编译配置项务必选择刚刚创建的
CrabRelease - 选择匹配的COVLL加固引擎版本;工程使用CocoaPods会自动识别Pod Target,生成配置后记得执行
pod install - 保存生成
covll.profile.json加固配置文件
如果目标是framework或者dylib动态库,Target选择对应的Framework/dylib Target,不是App主Target。
步骤4:单独编译测试加固配置(重中之重)
❗千万不要直接拿加固配置直接打包上线,必须单独编译CrabRelease,真机/模拟器运行完整测试 。
测试要点清单:
- Framework/dylib可以正常编译,无编译报错
- 嵌入App之后可以正常加载动态库,无闪退
- 暴露的OC/Swift接口调用全部正常;KVC、xib加载逻辑无异常
- 业务核心流程全部跑通;没有莫名崩溃。
Tip:加固会修改控制流,部分性能敏感循环、渲染回调建议加入排除清单,避免卡顿问题。
三、如果需要叠加通用混淆(App主程序场景,framework一般不建议)
适用场景:你除了加固framework/dylib,同时还希望对整个App做通用混淆增强安全。
前提:已经确认
CrabRelease加固编译可以正常运行无bug。
- 打开通用混淆工具的【运行设置】页面
- 将编译模式修改为
CrabRelease,关闭扩展编译模式(调试)开关 - 重新配置好签名证书,保存设置
- 执行编译打包,此时编译流程同时执行加固+混淆
⚠️重要风险提示:
打开通用混淆里面的防dump、objcsel加密PASS之后,极易引发各类运行时故障,一定要完整回归测试。
四、避坑清单(踩过的坑总结)
- ❌不要直接修改原生Release配置,一定要复制出CrabRelease副本,方便对比回退。
- ❌Framework/dylib不要无脑开全量通用混淆,大部分场景仅定向加固+防dump+objcsel加密就足够安全。
- ❌开启防dump,所有KVC、xib/storyboard动态加载的类,一定要加到阻止清单,否则必崩。
- ❌加固混淆不要直接上线,分开测试:先只加固,跑通业务;确认没问题,再叠加混淆。
- ❌Xcode版本和加固引擎版本不匹配,直接编译失败,必须版本对齐。
- ❌已经编译好、没有IR中间码的framework/dylib,不支持IR级定向加固,需要源码参与编译。
五、验证加固效果
编译完成后,可以简单验证加固是否生效:
- 使用Hopper打开输出的framework/dylib二进制,查看核心函数控制流是否被打乱。
- 验证App正常启动,Framework接口调用正常。
- 测试崩溃符号化dSYM文件是否正常输出,线上崩溃日志可正常解析。
六、总结
- 保护
framework/dylib优先使用定向加固,一般不需要叠加全量通用混淆;开启防dump+objcsel加密即可。 - 独立拷贝
CrabRelease编译配置,加固引擎版本和Xcode严格匹配。 - 测试优先,加固、混淆分步开启,每一步都要完整回归业务流程。
- KVC、xib动态访问类要加入阻止清单,规避防dump带来的兼容性崩溃。