iOS 安全
iOS 马甲包、代码混淆、编译混淆实践
马甲包和代码混淆解决的是不同问题:前者偏向产品与发布管理,后者提高逆向成本。文章把常见做法、编译配置、审核风险和后续维护成本放在一起说明。
原文链接:https://vincents.cn/2018/10/24/ios-hikari/
一、马甲包
1.1 定义
利用 App Store 规则漏洞,通过技术手段多次上架同一款产品的包,与主包功能基本一致。
1.2 价值
- AB 测试:测试不同版本的用户反馈
- 导流:通过多个包获取更多用户
- 增加关键词覆盖:每个包可以设置不同的关键词
- 刷榜:提升应用排名
1.3 注意事项
- 修改二进制文件(图标、包名等)
- UI/功能差异化,避免被判定为重复包
1.4 实践工具
KLGenerateSpamCode
- 修改工程名、类前缀
- 生成垃圾代码
- 批量处理多个马甲包
图片优化
- 使用 ImageOptim 压缩图片
- 使用 ImageMagick 修改图片哈希值,避免被判定为重复资源
二、逆向基础与混淆必要性
2.1 Mach-O 文件格式
iOS 可执行文件的核心格式,包含:
- 头部(Header)
- 加载命令(Load Commands)
- 数据段(Data Segments)
2.2 逆向工具
- class-dump:导出类和方法信息
- Hopper:反汇编和反编译工具
2.3 混淆目的
防止核心代码逻辑被逆向分析,提高破解难度。
三、代码混淆
3.1 混淆方法
通过 shell 脚本(如 HSKConfuse)实现:
- 替换方法名
- 替换字符串
- 生成混淆头文件
3.2 混淆效果
混淆后的二进制文件在逆向工具中无法直接读取原方法名,提高分析难度。
3.3 风险提示
过度混淆可能导致 App Store 审核被拒,需要平衡安全性和合规性。
四、编译混淆
4.1 混淆工具
Hikari
- 基于 Obfuscator-LLVM 开发
- 通过修改编译流程混淆代码逻辑
4.2 使用步骤
- 切换编译工具链为 Hikari 提供的 LLVM
- 在代码中添加混淆标记
- 编译混淆后的二进制文件
4.3 混淆标记
- 控制流平坦化:使代码逻辑难以理解
- 字符串加密:加密敏感字符串
- 指令替换:替换为等效指令
4.4 限制说明
Xcode 10 后,非官方工具链编译的包可能被拒绝上架。需要关注苹果政策变化。
五、总结
混淆技术是提升应用安全性的重要手段,但需要注意:
- 平衡开发成本与安全需求:混淆会增加开发和维护成本
- 避免过度混淆:可能导致审核被拒或影响性能
- 关注政策变化:App Store 政策调整可能影响混淆方案的有效性
文档生成时间:2026-02-27