​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.netCycriptIOS Application security Part 2 - Getting class information of IOS apps | Infosechttp://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.h
class过滤
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/Xib
symbol映射文件
可以指定工具保存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 Storyboards
ios-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:selfforKeyPath:@"isFinished"options:NSKeyValueObservingOptionNewcontext:nil];}- (void)unregisterObserver {[otherObject removeObserver:selfforKeyPath:@"isFinished"context:nil];}- (void)observeValueForKeyPath:(NSString *)keyPathofObject:(id)objectchange:(NSDictionary *)changecontext:(void *)context{if ([keyPath isEqualToString:@"isFinished"]) {// ...}}这样写无效,属性isFinished将会被重新命名,而硬编码字符串不会反映这种变化。 处理方法是 移除全部的KeyPath 并 改为 NSStringFromSelector(@selector(keyPath))。
修改后的代码如下
- (void)registerObserver {[self.otherObject addObserver:selfforKeyPath:NSStringFromSelector(@selector(isFinished))options:NSKeyValueObservingOptionNewcontext:nil];}- (void)unregisterObserver {[otherObject removeObserver:selfforKeyPath:NSStringFromSelector(@selector(isFinished))context:nil];}- (void)observeValueForKeyPath:(NSString *)keyPathofObject:(id)objectchange:(NSDictionary *)changecontext:(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'参数并重新测试。
note
iOS-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。

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

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

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

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

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 S/4HANA、ECC 和 ERP 上轻松扩展或简化 SAP WM,并将其自动化到移动环境中

为您的 SAP WM 提供完整的本地 SAP 图形用户界面 基于原生通道架构&#xff08;NCA&#xff09;&#xff0c;iOS、Android 和手持 Scanguns 版 Liquid UI 可与 SAP WM 原生连接&#xff0c;同时保留 SAP GUI 丰富的事务处理功能。它使您无需编程即可直接从移动设备访问 MIGO、…

安全意识成熟度模型

安全意识成熟度模型是指导企业组织有效识别、管理和衡量团队和员工的安全意识风险&#xff0c;评估和衡量团队和员工的安全意识的评估模型。这套模型是多年以来通过对200多个具有安全意识的职员进行调研后建立的&#xff0c;安全意识成熟度模型使组织能够确定当前安全意识的成熟…

深度学习——激活函数汇总

深度学习——激活函数汇总 一、ReLU 一、ReLU 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/428448728

C++核心编程——运算符重载

C核心编程——运算符重载 运算符重载的方法运算符重载函数作成员函数与友元函数重载双目运算符重载单目运算符重载流插入运算符和"<<"和流提取运算符">>"重载流插入运算符和"<<"流提取运算符">>" 运算符重载的…

LabVIEW开发自适应降噪ANC

LabVIEW开发自适应降噪ANC 在许多情况下&#xff0c;信号很嘈杂&#xff0c;必须消除噪声。自适应降噪&#xff08;ANC&#xff09;是可用于消除信号噪声的主要实时方法之一。可以使用LabVIEW自适应滤滤器工具包来设计ANC应用程序。本文介绍使用自适应筛选器工具包的ANC的一些…

【深度学习】概率图模型(二)有向图模型详解(条件独立性、局部马尔可夫性及其证明)

文章目录 一、有向图模型1. 贝叶斯网络的定义2. 条件独立性及其证明a. 间接因果关系 X 3 → X 2 → X 1 X_3 \rightarrow X_2 \rightarrow X_1 X3​→X2​→X1​b. 间接果因关系 X 1 → X 2 → X 3 X_1 \rightarrow X_2 \rightarrow X_3 X1​→X2​→X3​c. 共因关系 X 1 ← X…

java中如何将mysql里面的数据取出来然后通过stream流的方式进行数据处理代码实例?

在 Java 中使用 Stream 流的方式从 MySQL 数据库中取出数据并进行处理&#xff0c;你可以通过 JDBC&#xff08;Java Database Connectivity&#xff09;来实现。下面是一个简单的代码示例&#xff1a; import java.sql.*; import java.util.stream.Stream; public class MySQ…

android上架之获取平台公钥、签名 MD5 值

app上架需要用到的两个参数公钥、签名 MD5 步骤 1. 下载jadx-gui 工具&#xff0c;下载 2. 下载成后&#xff0c;解压压缩包&#xff0c;双击 jadx-gui-1.4.7.exe 运行。 3. 运行后&#xff0c;在页面左上方单击文件 > 打开文件&#xff0c;打开 APK 包 4. 打开 APK 包后…

Jvm常见问题

1. 为什么用元空间替换永久代 避免OOM异常&#xff1a;永久代中存放了很多JVM需要的类信息&#xff0c;这些数据大多数是不会被清理的&#xff0c;所以Full GC往往无法回收多少空间。而永久代的空间是有限的&#xff0c;如果经常加载新的类进来或者频繁的创建和删除类&#xf…

前端页面转pdf

首先&#xff0c;需要安装两个库 html2canvasjspdf 先引入这个公用的html转pdf的方法 /**path:src/utils/htmlToPdf.jsname:导出页面为pdf格式 **/ import html2Canvas from "html2canvas1.4.1"; import JsPDF from "jspdf2.5.1";const htmlToPdf {get…

APP功能测试思路

一、首先我们拿到一个app的apk包 或者是在testflight下载的app安装包&#xff0c;需要进行安装测试 1.软件安装前&#xff1a;空间不足是否有相应的提示 2.软件安装中&#xff1a;安装过程中是否可以取消、暂停&#xff1b;安装是否可以正常进行&#xff1b;安装空间不足是否…

将yolov8-face里的模型导出到指定opset11

https://github.com/derronqi/yolov8-face 解决办法: 1. 导出前 1 报错内容 (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, tuple of ints padding, tuple of ints dilation, int groups) didnt match because some of the arguments have invalid typ…

2.Ansible的copy模块,我最常用的模块

1. 简述 先从我自身的情况来说&#xff0c;我不是运维人员&#xff0c;并且对linux操作也不是特别熟悉&#xff0c;所以工作中我使用ansible基本就是在平常的自动化部署中&#xff0c;而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…

rabbitMQ镜像队列的使用

在rabbitMQ集群中&#xff0c;默认发送消息时&#xff0c;队列默认时在一个节点上存在的。 我们以node01 node02 node03三节点集群为例&#xff0c;在node01声明队列发送消息后&#xff0c;发现&#xff1a; 测试队列只在节点node01上出现。 我们手动停止node01后&#xff0c…

Tomcat外传

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 本篇开始&#xff0c;我…

vue中data为什么是一个函数

vue中的data是一个对象类型&#xff0c;对象类型的数据是按引用传值的&#xff0c;这就会导致所有组件的实例都共享同一份数据&#xff0c;这是不对的&#xff0c;我们要的是每个组件实例都是独立的 为了解决对象类型数据共享的问题&#xff0c;我们需要将 data 定义成一个函数…

C++11线程以及线程同步

C11中提供的线程类std::thread,基于此类创建一个新的线程相对简单&#xff0c;只需要提供线程函数和线程对象即可 一.命名空间 this_thread C11 添加一个关于线程的命名空间std::this_pthread ,此命名空间中提供四个公共的成员函数&#xff1b; 1.1 get_id() 调用命名空间s…

Python自动化测试——元素定位

1.selenium简介 Selenium是一个用于Web应用程序测试的工具。Selenium是直接运行在浏览器中&#xff0c;模拟用户操作web界面。支持多平台&#xff1a;windows、linux、MAC &#xff0c;支持多浏览器&#xff1a;ie、firefox、chrome等浏览器。 2. 启动浏览器 # 导入webdrive…

JavaWeb服务器详解和后端分层解耦

JavaWeb HTTP协议请求数据格式响应数据格式协议解析 Web服务器请求响应请求参数的接收响应 分层解耦IOC&DI入门IOC详解 HTTP协议 超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 特点&#xff1a; 基于TCP协议&#xff1a;面向连接&#xff0c;安全 …

【Android知识笔记】架构专题(二)

分层架构概论 分层的依据是什么? 关注点分离:自下而上,从机器到用户,从抽象到具体,从通用到业务,每一层,各自关注各自的抽象层次。修改与影响:不同层之间的代码或技术方案修改,彼此互不影响。例如 UI 界面从 xml 布局改成 Jetpack Compose 之后,不应该影响数据层。换…