iOS Class Guard实战:混淆实践,混淆脚本修改,以及踩坑实录

527 阅读5分钟

前言:Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和实例变量名。iOS-Class-Guard不是应用安全的最终解决方案,但是它绝对能让攻击者更难读懂你的程序。

工作原理:iOS Class Guard会读取Mach—O对象文件的OC部分(工具只对mach-o和fat类型的文件有用,如果是想混淆自定义的静态,需要稍微转换一下策略),并解析其中所有的类、属性、方法、实例变量,之后添加所有的symbols到列表中。然后它会读取所有的依赖框架,并做相同的解析OC代码结构的处理,不同的是,此时是把symbol添加到禁止列表中。之后 所有的并且不在禁止列表中的symbols会被混淆处理。每一个symbol由随机生成的字母和数字 组成。每次执行混淆操作,都会生成一个唯一的symbol map。之后这个map会格式化成一个C的宏定义 头文件,并包含到 .pch文件中

安装iOS Class Guard步骤

安装目录/usr/local/bin

首先安装brew,如果安装过,则省略这一步

第一步
curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip
第二步(踩坑)
brew install --HEAD https://raw.githubusercontent.com/Polidea/homebrew/ios-class-guard/Library/Formula/ios-class-guard.rb

这一步是错误的,很多博客都在引用这个,不知道他们到底实践没。

但是你会发现,根本打不开这个网址,更别说安装了,就算FQ 也安装不了,结果打开就404

第二步(正确)

所以好多博客放的这个地址都是误导性的,我反复找了很多地址,才找到准确地址:

https://github.com/Polidea/ios-class-guard

安装目录也在/usr/local/bin,按照官方提示安装iOS Class Guard

Execute this simple bash script in Terminal. When asked for the password, enter your account. It's needed, because the utility is installed in /usr/local/bin.

brew install ios-class-guard

To install bleeding edge version:

brew install --HEAD ios-class-guard

用法如下:

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

我在使用过程中,curl命令根本down不下来,我FQ,加DNS服务都不行。替换的方法很简单,打开终端cd你自己的项目,复制以下网址

https://raw.githubusercontent.com/Polidea/ios-class-guard/master/contrib/obfuscate_project

在浏览器打开,打开之后如图所示,这就是脚本

将脚本复制下来,放到一个文件中,命名为obfuscate_project.sh,目录就是工程的根目录 完成这一步之后,就是给脚本设置权限

chmod +x obfuscate_project.sh

之后就是运行脚本

bash obfuscate_project.sh

正片来了,启动脚本就是启动obfuscate_project,这里面的信息,要修改成你的工程。 关键信息修改:更新 obfuscate_project 内的project file、scheme 和 configuration name。博主下载的是官方demo,但是他的脚本也需要修改,因为执行脚本过程中很多报错,系统的方法以及变量,修改完会报错。 脚本截图

WechatIMG95.jpg

首先要了解一下常用命令

-F 选项用于指定符号混淆的类过滤器。这意味着您可以通过这个选项来指定哪些类的方法需要进行混淆。

-i 选项可以用于指定要忽略混淆的特定符号。这个选项允许您在混淆时排除某些特定的符号(可能是某个方法、变量等)。 --arch :选择来自通用二进制文件(universal binary)中的特定架构。可以选择的架构有 ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64。

--list-arches:列出文件中包含的架构,然后退出。

--sdk-ios:指定iOS SDK版本,ios-class-guard将查找相应的SDK路径。

--sdk-mac:指定Mac OS X版本,ios-class-guard将查找相应的SDK路径。

--sdk-root:指定完整的SDK根路径。

-X :XIB、Storyboards的基本目录,将递归搜索。

-P :Pods项目的 project.pbxproj 路径(位于 Pods.xcodeproj 中)。

-O :写入混淆符号的文件路径。

-m :符号文件映射的路径,默认值是 symbols.json。

-c :符号化崩溃转储的路径。

--dsym :dSYM文件的路径以进行翻译。

--dsym-out :翻译后的dSYM文件的路径。

命令了解之后就是脚本逻辑梳理,看脚本修改的地方如下:

1.修改工程名字,必须是你工程的名字
PROJECT=ExampleBankingApp.xcodeproj
SCHEME=ExampleBankingApp
TARGET=ExampleBankingApp
CONFIGURATION=Release
OBFUSCATION_SDK=iphonesimulator
SDK=iphoneos
2.添加你要混淆的类名,多个类名以逗号分隔
class_filter="EBLoginViewController,EBWelcomeViewController"
3.添加你要忽略的要忽略混淆的特定符号,可以是方法、变量等

`symbol_to_ignore="class"

symbol_to_ignore1="viewDidLoad"

symbol_to_ignore2="self"

symbol_to_ignore3="setObject"`

4.Obfuscate执行逻辑,这是重点

Obfuscate project

ios-class-guard \
	-F "$class_filter"\
	-i "$symbol_to_ignore"\
	-i "$symbol_to_ignore1"\
	-i "$symbol_to_ignore2"\
	-i "$symbol_to_ignore3"\
	--sdk-root "$SDK_DIR" \
	-O symbols.h \
	build/$CONFIGURATION-$OBFUSCATION_SDK/$TARGET.app/$TARGET
5. Build project to fetch symbols
`xcodebuild \
-project "$PROJECT" \
-scheme "$SCHEME" \
-configuration "$CONFIGURATION" \
-sdk "$SDK" \
clean build \
OBJROOT=build.obf/ \
SYMROOT=build.obf/ |\
xcpretty -c`

执行完脚本就会看到根目录下面多了两个文件,symbols.h,symbols.json

WechatIMG94 1.jpg

WechatIMG93 2.jpg

这都是映射到项目中的混淆方法。当控制台输出build success的时候就代表你混淆成功了。这真是博主一步步,趟雷趟出来的。另外就是一定要忽略系统的一些方法以及常量,这些都会引起报错。 我们在实践过程中报错都是常见的,一定要分析错误原因,之后修改,工程中必须要有 pch 文件,因为脚本命令会在 pch 文件中引入 #import "/Users/admin/Desktop/ios-class-guard-example-master/symbols.h"

每运行一次脚本就会插入一次,所以就会报错,最好就是每次执行脚本,先删除一次这个头部引入。我开始还遇到了没有生成symbols.h 文件的问题,后来自己创建一个就好了,你也可以试试,假如遇到相似的问题。如有问题,可以评论区讨论,一起解决。

我用的官方实例 demo

`git clone github.com/Polidea/ios… ios-class-guard-example

cd ios-class-guard-example

make compile` 修改的也是 demo 脚本。
完整的项目工程目录:

image.png