​iOS Class Guard github用法、工作原理和安装详解及使用经验总结

news2024/12/21 18:39:57

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。

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

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

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

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

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

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

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

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

相关文章

Eclipse导入JavaWeb项目

Eclipse 导入JavaWeb项目教程 运行教程 亲爱的粉丝们&#xff0c;我深知你们对Eclipse导入Web项目教程的迫切需求。在这个充满竞争的时代&#xff0c;每一个项目都离不开高效的沟通。过程中需要对应的环境适配和软件安…

淘宝/天猫商品详情API接口丨京东商品详情丨1688商品详情丨接口key密钥获取方式

要获取淘宝/天猫商品详情API接口、京东商品详情API接口、1688商品详情API接口以及接口密钥&#xff08;Key&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 注册并登录淘宝/天猫开发者中心或京东开放平台或1688开放平台&#xff0c;并创建应用。在创建应用的过…

cmake和vscode 下的cmake的使用详解(二)

第四讲&#xff1a; GDB 调试器 前言&#xff1a; GDB(GNU Debugger) 是一个用来 调试 C/C 程序 的功能强大的 调试器 &#xff0c;是 Linux 系统开发 C/C 最常用的调试器 程序员可以 使用 GDB 来跟踪程序中的错误 &#xff0c;从而减少程序员的工作量。 Linux 开发 C/C …

postgresql从入门到精通教程 - 第36讲:postgresql逻辑备份

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第36讲&#…

分布式系统中最基础的 CAP 理论及其应用

对于开发或设计分布式系统的架构师、工程师来说&#xff0c;CAP 是必须要掌握的基础理论&#xff0c;CAP 理论可以帮助架构师对系统设计中目标进行取舍&#xff0c;合理地规划系统拆分的维度。下面我们先讲讲分布式系统的特点。 分布式系统的特点 随着移动互联网的快速发展&a…

vue使用皮肤框架element-plus,element-ui是vue2.0的皮肤

vue使用皮肤框架element-plus&#xff0c;element-ui是vue2.0的皮肤&#xff0c;所以现在最新的vue3要使用element-plus皮肤。使用命令行安装element-plus: npm install element-plus安装后&#xff1a; {"name": "vue01","private": true,&quo…

Java连接数据库

数据库 存储数据&#xff1a;集中管理 目的&#xff1a; 文件中的数据能够放在数据库中集中管理 管理方法&#xff1a;一个项目一个库&#xff0c;每个库中包含最小化数据的表 开发&#xff1a; 节省存储空间&#xff0c;节省运行空间&#xff0c;采用数据库&#xff0c;架…

windows判断exe应用程序是否在使用的bat脚本

脚本 REM 查询进程是否存在 tasklist|findstr /i "mysqld.exe">nul &&echo y >2.log ||echo n >2.log REM 读取文本内容赋值给变量 set /P resu<2.log if %resu% y (echo process in use ) else (echo process not in use )我们已mysqld.exe…

【算法刷题】Day10

文章目录 15. 三数之和题干&#xff1a;算法原理&#xff1a;1、排序 暴力枚举 利用set 去重2、排序 双指针 代码&#xff1a; 18. 18. 四数之和题干&#xff1a;算法原理&#xff1a;1、排序 暴力枚举 利用set 去重2、排序 双指针 代码&#xff1a; 15. 三数之和 原题链…

利用python连接MySQL数据库并执行相关sql操作

一、新建MySQL数据库 1.启动MySQL服务 打开phpstudy&#xff0c;开启MySQL服务。如果开启失败的话&#xff0c;可以打开任务管理器&#xff0c;把正在运行的mysqld服务的进程进行关闭&#xff0c;再次打开MySQL服务即可启动。 2.新建MySQL数据库 选择数据库&#xff0c;点击…

linux(3)之buildroot配置软件包

Linux(3)之buildroot配置软件包 Author&#xff1a;Onceday Date&#xff1a;2023年11月30日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Buildroot - Making Embedded Linux Easymdev.txt docs - busybox - BusyBox: The Swiss Army Knife of Embedded Linu…

Elasticsearch分词器--空格分词器(whitespace analyzer)

介绍 文本分析&#xff0c;是将全文本转换为一系列单词的过程&#xff0c;也叫分词。analysis是通过analyzer(分词器)来实现的&#xff0c;可以使用Elasticearch内置的分词器&#xff0c;也可以自己去定制一些分词器。除了在数据写入时将词条进行转换&#xff0c;那么在查询的时…

记一次SQL Server磁盘突然满了导致数据库锁死事件is full due to ‘LOG_BACKUP‘.

背景 最近我们的sql server 数据库磁盘在80左右&#xff0c;需要新增磁盘空间。还是处以目前可控的范围内&#xff0c;但是昨天晚上告警是80%&#xff0c;凌晨2:56分告警是90%&#xff0c;今天早上磁盘就满了。 经过 通过阿里云后台查看&#xff0c;磁盘已经占据99%&#xff0c…

Spring @Cacheable缓存注解

一、简介 缓存介绍 缓存&#xff0c;在我们的日常开发中用的非常多&#xff0c;是我们应对各种性能问题支持高并发的一大利器。 Spring 从 3.1 开始就引入了缓存的支持。定义了如下两个接口来统一支持不同的缓存技术。 org.springframework.cache.Cacheorg.springframework.ca…

uniapp中解决swiper高度自适应内容高度

起因&#xff1a;uniapp中swiper组件swiper 标签存在默认高度是 height: 150px &#xff1b;高度无法实现由内容撑开&#xff0c;在默认情况下&#xff0c;swiper盒子高度显示总是 150px 解决办法思路&#xff1a; 动态设置swiper盒子的高度&#xff0c;故需要获取swiper-item盒…

展锐平台回读分区

展锐平台回读分区 1. 回读分区意义2. 操作步骤3. 回读存放的位置 1. 回读分区意义 回读的分区可用作备份&#xff0c;还可将回读到的分区与烧入机器版本的分区进行比较&#xff0c;如果两者不一致则说明烧录出现问题&#xff0c;需要重新烧录。 2. 操作步骤 打开展锐烧录工…

深度解析 Dockerfile:构建可重复、可扩展的Docker镜像

文章目录 什么是Dockerfile&#xff1f;Dockerfile的基本结构常用Dockerfile指令解析1. FROM2. LABEL3. WORKDIR4. COPY5. RUN6. EXPOSE7. ENV8. CMD 构建可重复、可扩展的Docker镜像1. 指定基础镜像的版本2. 合理使用缓存3. 精简镜像4. 使用多阶段构建 总结 &#x1f388;个人…

UDS诊断服务简单介绍

UDS简单介绍 &#xff08;1&#xff09;UDS&#xff08;Unified Diagnostic Service&#xff0c;统一诊断服务&#xff09;&#xff0c;诊断协议是ISO 15765和ISO 14229定义的一种汽车通用诊断协议&#xff0c;位于OSI模型中的应用层&#xff0c;可在不同的汽车总线&#xff0…

大势智慧荣获2023光合组织解决方案大赛人工智能赛道标杆奖及争先奖!

近日&#xff0c;2023年第三届光合组织解决方案大赛获奖名单正式公布。大势智慧以基于国产化平台的实景三维全流程解决方案&#xff0c;突破层层选拔&#xff0c;最终荣获“集智计划”&#xff08;人工智能赛道&#xff09;标杆奖及争先奖。 实景三维是我国的数字基础设施&…

零售数字化“逆熵”的6项原则和8种能力建设|ShopeX徐礼昭

作者&#xff1a;徐礼昭 来源&#xff1a;《三体零售逆熵法则》节选 旧的规则与秩序被打破&#xff0c;无序成为常态 新时代洪流裹挟冲击着传统零售 无序带来的“熵增”侵蚀企业生命 所有人都在不确定性中寻找确定 数字化如何助力企业铸就「反熵增」神器&#xff1f; 如何…