×

马甲包混淆方案

96
咖喱luya
2018.07.10 14:32* 字数 840
  • iOS
  • 马甲包
  • 混淆

马甲包是利用各大市场规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致。这种还比较能理解,市场上还有另一种马甲包是内容和功能完全不合规,壳子本身功能正常是为了能通过审核,而一旦审核通过,大部分都会直接成为一个web展示内容,包括:赌博、色情、以及其他(我司是网赚平台)

对于我们开发人员来说,要做的就是怎么让马甲包能够通过苹果爸爸的审核,以我的经验,在通常情况下(排除同一个审核人员审核了你上的相同的包恰巧就在近期或者ta记性很好)审核人员是无法从肉眼分辨一个应用是否是重复的(UI、数据都一样),很多马甲包都是被卡在 机审 这一步,因此我们要做的就是在代码层面做一些手脚,下面介绍的就是我司使用的混淆方案

混淆方案组合一 混淆调用树

本项目源码地址 : https://github.com/HikariObfuscator/Hikari

其实他是基于 obfuscator 进行了Xcode9的适配

开始

install

下载 Hikari

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE=Release ../Hikari/

make -j7

setup

$ cd /Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/
$ sudo cp -r Clang\ LLVM\ 1.0.xcplugin/ Obfuscator.xcplugin
$ cd Obfuscator.xcplugin/Contents/
$ sudo plutil -convert xml1 Info.plist
$ sudo vim Info.plist

change:

<string>com.apple.compilers.clang</string> -> <string>com.apple.compilers.obfuscator</string>
<string>Clang LLVM 1.0 Compiler Xcode Plug-in</string> -> <string>Obfuscator Xcode Plug-in</string>

Then:

$ sudo plutil -convert binary1 Info.plist
$ cd Resources/
$ sudo mv Clang\ LLVM\ 1.0.xcspec Obfuscator.xcspec
$ sudo vim Obfuscator.xcspec

Change:

<key>Description</key>
<string>Apple LLVM 9.0 compiler</string> -> <string>Obfuscator 4.0 compiler</string>
<key>ExecPath</key>
<string>clang</string> -> <string>/$(install步骤里面的build文件路径)/bin/clang</string>
<key>Identifier</key>
<string>com.apple.compilers.llvm.clang.1_0</string> -> <string>com.apple.compilers.llvm.obfuscator.4_0</string>
<key>Name</key>
<string>Apple LLVM 9.0</string> -> <string>Obfuscator 4.0</string>
<key>Vendor</key>
<string>Apple</string> -> <string>HEIG-VD</string>
<key>Version</key>
<string>9.0</string> -> <string>4.0</string>

Then:

$ cd English.lproj/
$ sudo mv Apple\ LLVM\ 9.0.strings "Obfuscator 3.4.strings"
$ sudo plutil -convert xml1 Obfuscator\ 3.4.strings
$ sudo vim Obfuscator\ 3.4.strings

Change:

<key>Description</key>
<string>Apple LLVM 9.0 compiler</string> -> <string>Obfuscator 4.0 compiler</string>
<key>Name</key>
<string>Apple LLVM 9.0</string> -> <string>Obfuscator 4.0</string>
<key>Vendor</key>
<string>Apple</string> -> <string>HEIG-VD</string>
<key>Version</key>
<string>7.0</string> -> <string>4.0</string>

Then:

$ sudo plutil -convert binary1 Obfuscator\ 3.4.strings

使用

Build Settings -> Compiler for C/C++/Objective-C -> Obfuscator 4.0

Build Setting -> Enable Index-While-Building Functionality -> 'default' change to 'No'

关闭 bitcode

关闭编译优化 Build Settings -> OPTIMIZATION_LEVEL -> 0

开启混淆, Build Settings -> OTHER_CFLAGS -> -mllvm -enable-cffobf -mllvm -enable-bcfobf

此方式修改了你的编译器,使得在编译时在代码中添加混淆代码(在不影响应用本身逻辑的前提下),上面的步骤只需要一次就行,如果更新了系统有可能导致失效,只需要从setup再来一遍即可,下面做了一个测试,反编译一个使用了混淆与不使用混淆的ipa包,查看调用树形图可以看到对比:

屏幕快照 2018-04-04 下午3.42.30.png

屏幕快照 2018-04-04 下午3.44.55.png

混淆方案组合二 混淆方法名,类名

链接

提供两个文件:func.list、confuse.sh

func.list

罗列出需要混淆的类名、方法名

confuse.sh

脚本文件

使用:

将要混淆的方法名、类名 填入func.list 文件里面。项目里不要引入func.list文件

Build Phases 点击'+',new run script , Run Script -> add $PROJECT_DIR/confuse.sh

command + B 将生成的 codeObfuscation.h加入项目

PS:我们使用这套方案,(2种)目的是为了混淆我们的SDK(当然了,这个SDK对苹果爸爸来说是不合规的),目前暂未出现因为机审不过的情况,通常是因为马甲本身的功能不够丰富。另外方案一有可能导致当前项目无法使用xib以及无法继承自定义类的情况,暂时无法解决,发生几率不高,但是还是建议在工程做完之后再修改编译方式。

日记本
Web note ad 1