iOS 马甲包、代码混淆、编译混淆实践 封面
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 使用步骤

  1. 切换编译工具链为 Hikari 提供的 LLVM
  2. 在代码中添加混淆标记
  3. 编译混淆后的二进制文件

4.3 混淆标记

  • 控制流平坦化:使代码逻辑难以理解
  • 字符串加密:加密敏感字符串
  • 指令替换:替换为等效指令

4.4 限制说明

Xcode 10 后,非官方工具链编译的包可能被拒绝上架。需要关注苹果政策变化。

五、总结

混淆技术是提升应用安全性的重要手段,但需要注意:

  1. 平衡开发成本与安全需求:混淆会增加开发和维护成本
  2. 避免过度混淆:可能导致审核被拒或影响性能
  3. 关注政策变化:App Store 政策调整可能影响混淆方案的有效性

文档生成时间:2026-02-27