iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不是应用安全的最终解决方案,但是它绝对能让攻击者更难读懂你的程序。iOS-Class-Guard会加大代码分析和runtime检查的难度,这个工具可以认为是一个简单基础的混淆方法。由于OC的架构决定了iOS应用程序的剖析相当简单,check out一下链接就知晓了:
infointox.net
Cycript
IOS Application security Part 2 - Getting class information of IOS apps | Infosec
http://timourrashed.com/decrypting-ios-app/
工作原理这个工具只对应用程序的编译版本起作用(工具的脚本文件会首先编译项目源码,得到应用文件,之后使用class-dump处理应用文件)。它会读取Mach—O对象文件的OC部分(工具只对mach-o和fat类型的文件有用,如果是想混淆自定义的静态,需要稍微转换一下策略),并解析其中所有的类、属性、方法、实例变量,之后添加所有的symbols到列表中。然后它会读取所有的依赖框架,并做相同的解析OC代码结构的处理,不同的是,此时是把symbol添加到禁止列表中。之后 所有的并且不在禁止列表中的symbols会被混淆处理。每一个symbol由随机生成的 子母和数字 组成。每次执行混淆操作,都会生成一个唯一的symbol map。之后这个map会格式化成一个C的宏定义 头文件,并包含到 .pch文件中。 然后,它会找出XIB和storyboard并更新里面的名字(即IB文件也会被有效的混淆掉)。 这个工具还会查找工程内的xcdatamodel文件并添加其中的类和属性名到禁止列表。 在编译期间内,所有定义在头文件内的symbol都会用对应的生成的不同的符号替换并编译。iOS-Class-Guard也提供了对cocoapod库的混淆。这个工具会 根据用户提供的pods路径 自动遍历所有列出的target 并 查找 .xcconfig文件和要修改的预编译头文件路径。然后添加预先生成的头文件到库 .pch头文件,并更新target的.xcconfig文件中的头文件的search path参数。iOS-Class-Guard还会生成一个json格式的symbol映射。这个映射可以用来处理crash报告是的逆向处理。注意 iOS-Class-Guard不混淆system symbol,所有如果在自定义类中的某些属性和方法与system symbol有相同的名字,则不会被混淆。安装如果没有安装brew 先安装之,在终端内执行这
. 工具的安装目录为/usr/local/bin。若刚想安装最新的版本可执行
brew install --HEAD https://raw.githubusercontent.com/Polidea/homebrew/ios-class-guard/Library/Formula/ios-class-guard.rb
用法集成iOS-Class-Guard到项目中需要以下几步:下载 obfuscate_project 到工程的根目录。 终端内执行 curl -o obfuscate_project https://raw.githubusercontent.com/Polidea/ios-class-guard/master/contrib/obfuscate_project && chmod +x obfuscate_project更新 obfuscate_project 内的project file、scheme 和 configuration name执行 bash obfuscate_project。每一次release都应该执行一次该操作。 保存包含symbol映射的json文件 以便于在crash时能逆向得到原来的symbol
curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1,若已经安装则跳过,直接执行 sudo brew install https://raw.githubusercontent.com/Polidea/homebrew/ios-class-guard/Library/Formula/ios-class-guard.rb
用Xcode或其他工具 Build、test archive工程上面是基本步骤,也可以添加 额外的target,这些target会在编译期间自动 重新生成symbol map。命令行选项
`ios-class-guard 0.7 (64 bit)
Usage: ios-class-guard [options]
where options are:
-F <class> specify class filter for symbols obfuscator (also protocol))
-i <symbol> ignore obfuscation of specific symbol)
--arch <arch> choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64)
--list-arches list the arches in the file, then exit
--sdk-ios specify iOS SDK version (will look for /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk or /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk)
--sdk-mac specify Mac OS X version (will look for /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX<version>.sdk or /Developer/SDKs/MacOSX<version>.sdk)
--sdk-root specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)
-X <directory> base directory for XIB, storyboards (will be searched recursively)
-P <path> path to project.pbxproj of Pods project (located inside Pods.xcodeproj)
-O <path> path to file where obfuscated symbols are written
-m <path> path to symbol file map (default value symbols.json)
-c <path> path to symbolicated crash dump`
要熟悉以下几个命令输出头文件路径ios-class-guard输出头文件路径,使用 -O参数, 如 -O SWTableView/symbols.hclass过滤ios-class-guard能够过滤出 不希望混淆的类。比如,预编译的静态库。 iOS编码风格假定每个类都使用2-3个字符的前缀,可以利用这一点过滤进 或者 过滤出整个命名空间。举例,过滤出所有APH MC的命名空间 -F '!APH*' -F '!MC*'忽略symbol有些情况是我们不希望混淆,但是一些symbol仍然被混淆了,比如,使用C函数 且 OC的方法也使用了相同的名字,这会导致一个ld 连接错误(unresolved external)。此时,必须要找出该symbol 添加到忽略symbol list中。 举例,不混淆名为defalte 和 以curl_*开头的symbol -i 'deflate' -i 'curl_*'CocoaPods如果项目中使用了CocoaPods,也可以混淆这些 外部库内的symbol。用户需要做的是指定Pods PBX工程文件的路径。它在.xcodeproj目录内。ios-class-guard会修改配置和预编译头文件,这样pod内的库也可以被混淆了。 用法 -P Pods/Pods.xcodeproj/project.pbxproj其他选线Xib目录这是一个可选项。工具默认会从可执行目录(绝大多数情况下是工程的根目录)递归的搜索所有的 XIB/Storyboard文件。如果 XIB/Storyboard文件存储在其他路径,用法如下 -X SWTableView/Xibsymbol映射文件可以指定工具保存symbol映射的路径,默认名为 symbols.json。 用法 -m release/symbols_1.0.0.json逆向crash dump中的混淆iOS Class Guard支持对自动崩溃报告工具的逆向处理,如Crashlytics, Fabric, BugSense/Splunk Mint, Crittercism or HockeyApp。使用--dsym参数,iOS Class Guard会替换提供的dSYM文件内的原符号和混淆符号。强烈推荐 在Build Phases/Run script一开始 添加如下所示的脚本来完成dSYM的自动转换处理,该功能已在上述的工具中测试通过。
手动使用方法如下 ios-class-guard -m symbols.json --dsym MyProject_obfuscated.app.dSYM --dsym-out MyProject_unobfuscated.app.dSYM局限性,OC的工作方式决定了这个工具的局限性XIB and Storyboardsios-class-guard处理XIB 和 Storyboard文件的效果很好,但是当使用外部库,且库内包含了IB文件的bundle,一定要忽略这些symbol,否则你在启动app时,他们不会再有效。处理这种情况就要使用class filter了。KVO
`if [ -f “$PROJECT_DIR/symbols.json” ]; then /usr/local/bin/ios-class-guard -m $PROJECT_DIR/symbols.json –dsym $DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME –dsym-out $DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME fi
# Another invocations eg.: ./Crashlytics.framework/run <Crashlytics secret #1> <Crashlytics secret #2>`
使用混淆可能会导致KVO停止工作。大部分开发者使用硬编码字符串指定KeyPath。
串行化如果使用保存在磁盘上的类 或者 用户默认使用了NSCoding协议,那么就不能混淆他们了。否则,再次生成symbol后,APP在启动时会crash,不能从串行化数据中读取该类。
- (void)registerObserver {
[self.otherObject addObserver:self
forKeyPath:@"isFinished"
options:NSKeyValueObservingOptionNew
context:nil];
}
- (void)unregisterObserver {
[otherObject removeObserver:self
forKeyPath:@"isFinished"
context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"isFinished"]) {
// ...
}
}
这样写无效,属性isFinished将会被重新命名,而硬编码字符串不会反映这种变化。 处理方法是 移除全部的KeyPath 并 改为 NSStringFromSelector(@selector(keyPath))。
修改后的代码如下
- (void)registerObserver {
[self.otherObject addObserver:self
forKeyPath:NSStringFromSelector(@selector(isFinished))
options:NSKeyValueObservingOptionNew
context:nil];
}
- (void)unregisterObserver {
[otherObject removeObserver:self
forKeyPath:NSStringFromSelector(@selector(isFinished))
context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:NSStringFromSelector(@selector(isFinished))]) {
// ...
}
}
未定义symbol使用iOS-Class-Guard时,很可能会遇到类似与下面的问题:
Undefined symbols for architecture i386: "_OBJC_CLASS_$_n9z", referenced from: objc-class-ref in GRAppDelegate.o
解决方法,复制n9z并在symbols.h中查找,n9z很可能是个类,就要把它从混淆中排除,使用-F '!UnresolvedClassName'参数并重新测试。noteiOS-Class-Guard与LLVM Obfuscator一起使用还没有经过测试。Pro版pro版包含更多的功能:
Encryption of strings and constants
Tamper detection mechanism
Anti-debug mechanism
Methods inlining
Assets encryption
Control flow obfuscation
Code virtualization with encryption
API method execution hiding
综上来看 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 github用法、工作原理和安装详解及使用经验总结的更多相关文章
- NFS工作原理及配置文件详解
nfs工作原理流程 如上图所示,当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程如下几点: 1.首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能 ...
- 场效应管种类-场效应管N、P沟道与增强、耗尽型工作原理等知识详解 如何选用晶体三极管与场效应管的技巧
http://www.kiaic.com/article/detail/1308.html 场效应管种类场效应管 场效应晶体管(Field Effect Transistor缩写(FET))简称场效应 ...
- iOS 远程消息推送,原理和开发详解篇(新手推荐)
1.APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Servic ...
- ansible 工作原理以及使用详解
内容:1.ansible的作用以及工作结构2.ansible的安装以及使用3.ansible的playbook使用 一.ansible的作用以及工作结构 1.ansible简介: ...
- vmware三种网络模式的工作原理及配置详解
vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开vmware虚拟机,我们可以在选项栏的“编辑”下的 ...
- 以太坊工作原理之txpool详解
txpool详解 交易池txpool作为区块链系统的重要组成部分,对系统的安全性和稳定性具有重要作用.功能可归纳为:交易缓存.交易验证和交易过滤. 基本介绍 交易分类和缓存 txpool主要包含两个重 ...
- iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例
iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例 使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWReveal ...
- Go语言备忘录:反射的原理与使用详解
目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能 1.预备知识: Go的变量都是静态类 ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- Go语言备忘录(2):反射的原理与使用详解
本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...
随机推荐
- 0x02.加密和编码
识别算法编码类型 看密文位数 看密文特征(数字.字母.大小写.符号等) 看当前密文存在的地方(web.数据库.操作系统等) 密码存储加密 md5:16位和32位由0-9和a-f组成的字符串 ,该加密方 ...
- ASP.NET Core 8 在 Windows 上各种部署模型的性能测试
ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多.这些部署方案对性能的影响一直以来都 ...
- 如何编写一个 Pulsar Broker Interceptor 插件
背景 之前写过一篇文章 VictoriaLogs:一款超低占用的 ElasticSearch 替代方案讲到了我们使用 Victorialogs 来存储 Pulsar 消息队列的消息 trace 信息. ...
- springMvc_控制台中文乱码问题
Post方法解决控制台乱码 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = ne ...
- Java8新特性之-Map
Map一些新方法的具体使用案例 1.getOrDefault:default V getOrDefault(Object key, V defaultValue) package com.qbb.th ...
- Feign远程调用丢失请求头问题
问题 项目中我使用feign进行远程调用时,在请求头设置了参数(UserId),结果在调用方却收获取不到... 解决办法 feign提供了一个拦截器,在远程调用之前执行 核心代码 package co ...
- Bert-vits2最终版Bert-vits2-2.3云端训练和推理(Colab免费GPU算力平台)
对于深度学习初学者来说,JupyterNoteBook的脚本运行形式显然更加友好,依托Python语言的跨平台特性,JupyterNoteBook既可以在本地线下环境运行,也可以在线上服务器上运行.G ...
- TypeScript开篇
1.什么是TypeScript(TS)? Typescript 为 JS 带来了类型能力,如今已被越来越多的大型前端项目选用.Typescript 的出现大大改善了开发体验,增强了代码的可维护性和稳定 ...
- vulnhub - tornado - wp
coverY: 0 tornado 信息收集 目标开放了80,22端口. 访问80网页,是默认页面: 目录枚举 用dirsearch没有什么发现,换gobuster发现了一个bluesky目录.访问如 ...
- Ubuntu系统部署后优化
Ubuntu系统配置调整 前期准备 #更改主机名,重启后不变 hostnamectl set-hostname Zabbix-Server01 #更改主机名,重启后变回从前 hostname Zabb ...