swift调用oc_iosclassguard Swift & OC 混编

Swift OC 代码需要混淆代码

一、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-guardbrew install ios-class-guardbrew 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 进行查看

f450c36be32ac075918990c3441dc5f1.png

obfuscate_project

4. 运行 obfuscate_project 混淆脚本

bash obfuscate_project


下面我们来分析一下 obfuscate_project 脚本的代码

  • Clean current workspace
    清除 git 最近的提交

722aeee93af03b4e3bc7289cba3fe9a1.png

Clean current workspace

  • Just in case: wipe build
    清除 build/文件夹

308df07ce7619a9700b6ef2a7beae2ee.png

Just in case: wipe build

  • Automatically detect PODS
    检测 pod 所在位置,并执行 pod install

22cdf3d02d92f88718239b4b32d3a375.png

Automatically detect PODS

  • Build project to fetch symbols
    build 项目

b099f3226a7a24d409ce9ce80b5ea8e5.png

Build project to fetch symbols

  • Insert SYMBOLS_FILE to all .pch found in project
    将混淆符号的 .h 文件导入到 含有 -Prefix.pch  的文件中

f0eecffc75355080ee7f99fc06105a57.png

Insert SYMBOLS_FILE to all .pch found in project

脚本中默认 $SYMBOLS_FILE 文件名为 symbols.h

dfe2be6e87387c91ce10457b52d6a08b.png

symbols

  • Obfuscate project

可以看出混淆项目的主要指令是  ios-class-guard,脚本中使用了一下参数:
$CLASS_GUARD_OPTS_SDK: (--sdk-root )
$CLASS_GUARD_OPTS (自定义 ios-class-guard 参数)
-O "$SYMBOLS_FILE" (输出含有宏定义的 .h文件 )
"$app/$TARGET" ()

8ecae49e7026cccbb74c47c0bc538644.png

Obfuscate project

ios-class-guard 所有参数

2f144d7541d5f75b85d8ab9896e93e53.png

ios-class-guard


ios-class-guard 不支持 Swift

ios-class-guard 工具在 Github 上不支持 Swift,遇到带 Swift 项目会报错,具体报错:Error: Cannot find offset for address XXXXXXXX in stringAtAddress:

9d6a184a00767e9fa6c94540d6a0eb69.png

ios-class-guard Error.png

后面通过 Github 找到一个支持 Swift 的 class-dump ,然后通过修改 ios-class-guard 源代码,最后支持 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

9d6a184a00767e9fa6c94540d6a0eb69.png

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

e217ca9dfc2bed46ba6bd0361405ad5f.png

ios-class-guard iPhoneOS SDK

然后在作者的回答中也有提到,PreEmptive Protection for iOS - Rename (or PPiOS-Rename),
使用相同的原理,但是它将使用 iPhoneSimulator 支持 iPhoneOS SDK,但是经测试,该工具只能用于纯 OC 项目,并不支持 OC 与 Swift 混编的项目

54d480577d47c2f0791deb932ca45bce.png

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' 出现了以下提示报错

61cca114c2b9420e20d7532d83b59e68.png

--sdk-ios

后面在 issue 中找到相关回答

2b8455f442a3df8d2a233e6e1f926d54.png

issue

解决方案是用 --sdk-root 代替 --sdk-ios

416d20af73477e2ba9b704eb7b38c73e.png

--sdk-root

ios-class-guard OC & Swift

ios-class-guard 执行结果,会输出宏定义 .h 文件,当我们导入该 .h 时,OC 的类/方法被定义为混淆字符串。如果在混编项目中,Swift 中调用 OC 的类,Archive 会有以下提示报错

b98fc41c6cebab0a4859041d5ba20561.png

WX20200608-183250.png

解决方法: 需要删除掉在 Swift 中使用的 OC 类/方法的宏定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值