ios-class-guard - iOS代码混淆与加固实践

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 然后在作者的回答中也有提到,PreEmptive Protection for iOS - Rename (or PPiOS-Rename),使用相同的原理,但是它将使用 iPhoneSimulator 支持 iPhoneOS SDK,但是经测试,该工具只能用于纯 OC 项目,并不支持 OC 与 Swift 混编的项目

ios-class-guard - iOS代码混淆与加固实践

目录

ios-class-guard - iOS代码混淆与加固实践

摘要

引言

一、class-dump

二、ios-class-guard 混淆原理

三、ios-class-guard 混淆结果

四、ios-class-guar 的使用

ios-class-guard 不支持 Swift

ios-class-guard 不支持 iPhoneOS SDK

ios-class-guard --sdk-root

ios-class-guard OC & Swift

使用ipaguard来对程序进行加固


摘要

本文介绍了在iOS应用开发中常见的代码混淆和加固技术,重点讨论了使用ios-class-guard和ipaguard工具进行代码混淆和加固的操作步骤,并探讨了其原理和使用方法。通过本文的学习,读者可以了解到如何保护iOS应用的安全性,降低代码的可读性和破解难度。

引言

随着移动应用的普及,iOS平台上的应用安全问题日益受到关注。为了保护应用程序的安全性,开发者需要采取一系列措施来降低代码被恶意逆向工程和破解的风险。在iOS开发中,常见的安全措施包括代码混淆和加固。本文将介绍iOS代码混淆与加固的实践,以及相关工具的使用方法和原理。

一、class-dump

  • 能够从可执行文件中获取类/方法和属性的信息, ios-class-guard 从 class-dump 演化而来
  • 逆向工程中会使用的工具,如果可执行文件 Mach-File 是从 AppStore 上下载的,都是经过签名加密的,需要先进行砸壳

1. class-dump 的原理

利用 Objective-C 语言的 runtime 特性,将存储在 Mach-O 文件中的 @interface 和 @protocol 信息提取出来,并生成对应的 .h 文件

二、ios-class-guard 混淆原理

ios-class-guard 由 class-dump 演化而来,对 Mach-O 文件进行静态扫描,通过文件地址分析出类、方法的名字,然后通过宏定义替换方法成无序随机字符串来达到混淆的效果

三、ios-class-guard 混淆结果

使用 ios-class-guard 的 option,最后 -o 会输出方法名的宏定义,-m 生成方法名和随机字符串的映射表,需要将 -o 输出的宏定义头文件导入到 Prefix.pch

四、ios-class-guar 的使用

1. 安装 ios-class-guard

brew install ios-class-guard 或 brew install --HEAD ios-class-guard

2. 下载 obfuscate_project 混淆脚本

curl -o obfuscate_project https://raw.githubusercontent.com/Polidea/ios-class-guard/master/contrib/obfuscate_project && chmod +x obfuscate_project

3. 编辑 obfuscate_project 混淆脚本

修改一下几个参数

  • 主要是修改这几个参数, 下面是使用 workspace 管理时的参数修改(如果不是使用 workspace ,就注释 WORKSPACE 那一行,解开 PROJECT 的注释)
  • WORKSPACE、PROJECT、SCHEME、CONFIGURATION、CONFIGURATION 根据实际项目填写
  • SDK 版本号可以使用 xcodebuild -showsdks 进行查看

obfuscate_project

4. 运行 obfuscate_project 混淆脚本

bash obfuscate_project


下面我们来分析一下 obfuscate_project 脚本的代码

  • Clean current workspace
    清除 git 最近的提交

Clean current workspace

  • Just in case: wipe build
    清除 build/文件夹

Just in case: wipe build

  • Automatically detect PODS
    检测 pod 所在位置,并执行 pod install

Automatically detect PODS

  • Build project to fetch symbols
    build 项目

Build project to fetch symbols

  • Insert SYMBOLS_FILE to all .pch found in project
    将混淆符号的 .h 文件导入到 含有 -Prefix.pch 的文件中

Insert SYMBOLS_FILE to all .pch found in project

脚本中默认 $SYMBOLS_FILE 文件名为 symbols.h

symbols

  • Obfuscate project

可以看出混淆项目的主要指令是 ios-class-guard,脚本中使用了一下参数:$CLASS_GUARD_OPTS_SDK: (--sdk-root )$CLASS_GUARD_OPTS (自定义 ios-class-guard 参数)-O "$SYMBOLS_FILE" (输出含有宏定义的 .h文件 )"$app/$TARGET" (<mach-o-file>)

Obfuscate project

ios-class-guard 所有参数

ios-class-guard

  • -F 过滤不需要混淆的类 -F !AppDelegate
  • -i 过滤掉不需要使用的符号
  • --sdk-root 指定 SDK,目前只支持 iPhoneSimulator SDK
  • -m 保存符号映射表 .json,默认为 symbols.json
  • -O 输出定义混淆符号的头文件

ios-class-guard 不支持 Swift

ios-class-guard 工具在 Github 上不支持 Swift,遇到带 Swift 项目会报错,具体报错: Error: Cannot find offset for address XXXXXXXX in stringAtAddress:

ios-class-guard Error.png

后面通过 Github 找到一个支持 Swift 的 class-dump ,结合 ios-class-guard 源代码。最终实现 Category 的过滤 -F、以及能够在 Swift 和 OC 混编代码中执行;最终实现也只是对 OC 代码进行混淆,Swift 不做改动 -- ios-class-guard-Swift

目前 ios-class-guard-Swift 暂未支持用 install.sh 安装 ios-class-guard,需要手动编译一下;然后将生成的可执行文件 exec 拖到 /usr/local/bin,之后就可以通过终端执行 ios-class-guard 命令

ios-class-guard 不支持 iPhoneOS SDK

ios-class-guard Error.png

从上面的报错信息,我们还可以看出除了 Error: Cannot find offset for address XXXXXXXX in stringAtAddress: 的报错之外,还有 Warning: Failed to load: XXXXXXXX.dylib

通过 Github 的 issue 找到相关解释,ios-class-guard 不支持 iPhoneOS SDK,所以在选择参数时需要选择 iPhoneSimulator,例如 ios-class-guard --sdk-root /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.2.sdk

ios-class-guard iPhoneOS SDK

然后在作者的回答中也有提到,PreEmptive Protection for iOS - Rename (or PPiOS-Rename),使用相同的原理,但是它将使用 iPhoneSimulator 支持 iPhoneOS SDK,但是经测试,该工具只能用于纯 OC 项目,并不支持 OC 与 Swift 混编的项目

PPiOS-Rename

ios-class-guard --sdk-root

执行以下命令

ios-class-guard -O XXX --sdk-ios /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.2.sdk 'XXXX.app' 出现了以下提示报错

--sdk-ios

后面在 issue 中找到相关回答

issue

解决方案是用 --sdk-root 代替 --sdk-ios

--sdk-root

ios-class-guard OC & Swift

ios-class-guard 执行结果,会输出宏定义 .h 文件,当我们导入该 .h 时,OC 的类/方法被定义为混淆字符串。

注意:如果在混编项目中,Swift 中调用 OC 的类或扩展,需要忽略该 OC 类或扩展的混淆。在执行 ios-class-guard 添加 -F 参数,例如 -F !AppDelegate

综上来看  iOS-Class-Guard操作步骤是非常繁琐的,我们这边引入一个新的工具-ipaguard。

 

使用ipaguard来对程序进行加固

代码加固是进一步保护应用的一种方式,通常通过特定平台来对应用进行加固处理。

这边以ipaguard为例,目前还在免费阶段,想薅羊毛的快快试试。

Ipa Guard是一款功能强大的ipa混淆工具,不需要ios app源码,直接对ipa文件进行混淆加密。可对IOS ipa 文件的代码,代码库,资源文件等进行混淆保护。 可以根据设置对函数名、变量名、类名等关键代码进行重命名和混淆处理,降低代码的可读性,增加ipa破解反编译难度。可以对图片,资源,配置等进行修改名称,修改md5。只要是ipa都可以,不限制OC,Swift,Flutter,React Native,H5类app。

所以就要使用到混淆器,混淆器是把里面的代码变量等信息进行重命名,这样可读性会变得非常差,接着,

到这里,我们完成了对代码的混淆,但是还没有进行加固,防止反编译,所以,请往下看

然后导入自己的包就可以了,这里是流水式的走下来,所以只需要导入和导出就可以了,

添加单个文件,选择好刚刚混淆后的包,然后你做的事情就是等,等待上传完--加固完--下载完--已完成,当到已完成的时候,说明这里已经可以导出了,导出需要前面提到的自己创建的签名,这里可是会用到的,如果不用,则包安装包可能会出现问题

选择导出签名包,选择签名文件,输入密码,然后点击开始导出

 

导出的包是经过混淆,经过加固比较安全的包了

相关文章
|
6月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
91 0
|
6月前
|
缓存 编解码 测试技术
基于iOS平台的高效图片处理技术实践
【4月更文挑战第7天】 在移动应用开发领域,图片处理是一个常见且要求高性能的功能模块。特别是在iOS平台上,由于其封闭的生态系统和用户对流畅体验的高期待,开发者需采用高效的图片处理技术以满足应用的性能需求。本文将探讨一种针对iOS平台优化的图片处理流程,涉及图像加载、缓存策略、异步处理以及图形渲染等关键技术点,旨在为iOS应用提供一个低内存消耗、高效率的图片处理解决方案。
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
137 3
|
3月前
|
开发工具 数据安全/隐私保护 iOS开发
探索iOS应用开发的核心理念与实践
【8月更文挑战第23天】在数字时代的浪潮中,iOS应用开发不仅仅是技术的堆砌,更是一场关于创新、用户体验和持续改进的旅程。本文将深入探讨iOS应用开发的核心理念,从设计哲学到开发工具的选择,再到市场趋势的适应,旨在为开发者提供一条清晰的路径,帮助他们在不断变化的技术世界中保持竞争力和创新力。
|
4月前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性与编程实践
【7月更文挑战第8天】在移动开发的广阔天地中,安卓和iOS这两大操作系统各自占据着半壁江山。它们在用户界面设计、系统架构及开发工具上展现出截然不同的特色。本文将深入探讨这两个平台在技术实现和开发生态上的关键差异,并分享一些实用的开发技巧,旨在为跨平台开发者提供有价值的见解和建议。
|
5月前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
6月前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
104 2
|
6月前
|
移动开发 安全 数据安全/隐私保护
ios安全加固 ios 加固方案
ios安全加固 ios 加固方案
89 1
ios安全加固 ios 加固方案
|
6月前
|
iOS开发 开发者 UED
iOS 中的并发编程:GCD 与 Operation 的对比与实践
【4月更文挑战第23天】 在iOS开发中,为了提高应用的性能和响应能力,理解并合理运用并发编程是至关重要的。本文将深入探讨两种主要的并发模式:Grand Central Dispatch (GCD) 和 NSOperation。我们将比较它们的优势和局限性,并通过代码示例演示如何在实际场景中应用这两种技术来优化应用性能。文章旨在为开发者提供一个清晰的指南,以便在选择适合自己项目的并发工具时做出明智的决策。