ios-class-guard - iOS代码混淆与加固实践
目录
ios-class-guard - iOS代码混淆与加固实践
ios-class-guard 不支持 iPhoneOS SDK
摘要
本文介绍了在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。

所以就要使用到混淆器,混淆器是把里面的代码变量等信息进行重命名,这样可读性会变得非常差,接着,
到这里,我们完成了对代码的混淆,但是还没有进行加固,防止反编译,所以,请往下看
然后导入自己的包就可以了,这里是流水式的走下来,所以只需要导入和导出就可以了,

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

导出的包是经过混淆,经过加固比较安全的包了
ios-class-guard - iOS代码混淆与加固实践的更多相关文章
- iOS安全攻防之代码混淆
iOS 代码安全之代码混淆实践: 前言: 在8月份的时候写了个关于 class-dump 反编译的文章(使用 Class-dump 反编译),利用 class-dump 工具可以反编译出工程的头文件, ...
- iOS 代码安全加固--反编译和代码混淆
一.class-dump反编译 1.将打包的ipa反编译下,.ipa改成.zip,并解压 6.右击—显示包内容,找到如下有个白框黑底的 7.将其复制到桌面xx文件夹中,在终端中输入相关命令 cd 进 ...
- iOS安全攻防(二十三):Objective-C代码混淆
iOS安全攻防(二十三):Objective-C代码混淆 class-dump能够非常方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完好的程序给同行留下笑柄. 所以 ...
- iOS 代码混淆
一般做了防调试的话,被调试进程会退出的,是防动态分析措施. 代码混淆加花这些是防静态分析措施. 反调试是防动态分析措施. 混淆的方法方法名混淆其实就是字符串替换,有2个方法可以,一个是#define, ...
- iOS 初探代码混淆(OC)
iOS 初探代码混淆(OC) 前言 自己做iOS开发也有几年的时间了,平时做完项目基本就直接打包上传到Appstore上,然后做上架操作了.但是最近,客户方面提出了代码安全的要求.说是要做代码混淆,这 ...
- ios -逆向-代码混淆
该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑 ...
- 代码混淆 iOS
该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑 ...
- iOS使用shell脚本注入混淆内容
背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝,本文是针对这个场 ...
- ios蓝牙开发(三)ios连接外设的代码实现:手机app去读写蓝牙设备。
手机app去读写蓝牙设备....... 代码下载: 原文博客主提供Github代码连接,地址是:https://github.com/coolnameismy/demo ios连接外设的代码实现流程: ...
- iOS 蓝牙开发(二)iOS 连接外设的代码实现(转)
转载自:http://www.cocoachina.com/ios/20150917/13456.html 原文作者:刘彦玮 上一篇文章介 绍了蓝牙的技术知识,这里我们具体说明一下中心模式的应用场景. ...
随机推荐
- auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献
C++作为一门静态类型语言,是需要程序员声明变量类型的.然而来到了C++11,auto的诞生使得变量声明变得及为方便,尤其是对于比较长的模板类型,auto一定程度上为代码编写者减轻了负担.到了C+ ...
- MyBatis高频面试题
1.MyBatis中使用#和$书写占位符有什么区别? 2.Hibernate 与 Mybatis区别(MyBatis与Hibernate有什么不同). 3.持久层设计要考虑的问题有哪些? 4.你用过的 ...
- MinIO入门
MinIO 是一种高性能.S3 兼容的对象存储. 官方资料 中国官网 代码仓库 安装和部署MinIO 单节点单硬盘部署MinIO 单节点多硬盘部署MinIO 多节点多硬盘部署 站点复制概述 管理现有的 ...
- 从零玩转SpringSecurity+JWT整合前后端分离-从零玩转springsecurityjwt整合前后端分离
title: 从零玩转SpringSecurity+JWT整合前后端分离 date: 2021-05-06 14:56:57.699 updated: 2021-12-26 17:43:19.478 ...
- Eureka:Spring Cloud服务注册和发现组件
Eureka:Spring Cloud服务注册和发现组件 问题总结 Eureka 两大组件? Eureka 服务注册与发现? Eureka Server 集群? Eureka 自我保护机制? 问题答案 ...
- 2023-11-04:用go语言,如果n = 1,打印 1*** 如果n = 2,打印 1*** 3*** 2*** 如果n = 3,打印
2023-11-04:用go语言,如果n = 1,打印 1*** 如果n = 2,打印 1*** 3*** 2*** 如果n = 3,打印 1*** 3*** 2*** 4*** 5*** 6*** ...
- 23、Flutter AppBar TabBar TabBarView
AppBar自定义顶部按钮图标.颜色 class MyHomePage extends StatelessWidget { const MyHomePage({super.key}); @overri ...
- C#数据结构与算法系列(十七):时间复杂度(下)
1.常见的时间复杂度 常数阶:O(1) 对数阶:O(log2n) 线性阶:O(n) 线性对数阶:O(nlog2n) 平方阶:O(n^2) 立方阶:O(n^3) k次方阶:O(2^n) 常见的算法时间复 ...
- 带你彻底搞懂高性能网络模式Reactor 和 Proactor
摘要:无论是 Reactor,还是 Proactor,都是一种基于「事件分发」的网络编程模式,区别在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式则是基于 ...
- 看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?
摘要:千亿参数量的中文大规模预训练语言模型时代到来. 本文分享自华为云社区< MindSpore开源框架加持,如何「炼出」首个千亿参数.TB级内存的中文预训练语言模型?>,原文作者:che ...