Xcode集成O-LLVM

1.获取O-LLVM源码

mkdir ollvm
cd ollvm
git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git

2.获取相关工程支持
from issus:https://github.com/obfuscator-llvm/obfuscator/issues/108

从 https://releases.llvm.org/download.html#4.0.0 下载 “libc++ source code” 和 “libc++abi source code”,解压到 ollvm/obfuscator/projects 下

3.支持string的混淆
可以参考这里,http://fighting300.com/2017/09/18/ollvm-with-StringObfuscate/

或者直接clone https://github.com/yangchenghu/obfuscator.git ,仓库里集成了字符串混淆和libc++,libc++abi的代码。

4.编译
需要使用cmake,如果没有安装,可以使用 brew install cmake 来安装

mkdir buildOllvm
cd buildOllvm
cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
make -j4

PS:这里-j4,表示用多线程同时编译,可以加快编译速度。常使用 -j4,-j7 。

4.制作一个编译插件

配置Xcode–新建Obfuscator插件

$ 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

修改Info.plist中的对应内容:

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

修改Obfuscator.xcspec文件

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

修改ExecPath的地址为当前 buildOllvm/bin 的地址

Identifier = “com.apple.compilers.llvm.clang.1_0”; -> Identifier = “com.apple.compilers.llvm.obfuscator.4_0”;
Name = “Apple LLVM 8.0”; -> Name = “Obfuscator 4.0”;
Description = “Apple LLVM 8.0 compiler”; -> Description = “Obfuscator 4.0”;
Vendor = Apple; -> Vendor = HEIG-VD;
Version = “7.0”; -> Version = “4.0”;
ExecPath = “clang”; -> ExecPath = “/path/to/buildOllvm/bin/clang”;

修改 Obfuscator 4.0 Strings

$ cd English.lproj/
$ sudo mv Apple\ LLVM\ 8.0.strings “Obfuscator 4.0.strings”
$ sudo plutil -convert xml1 Obfuscator\ 4.0.strings
$ sudo vim Obfuscator\ 4.0.strings

“Description” = “Apple LLVM 8.0 Compiler”; -> “Description” = “Obfuscator 4.0”;
“Name” = “Apple LLVM 8.0”; -> “Name” = “Obfuscator 4.0”;
“Vendor” = “Apple”; -> “Vendor” = “HEIG-VD”;
“Version” = “8.0”; -> “Version” = “4.0”;

如果需要混淆字符串,需要编译参数 other C flag 中添加这两个编译参数 -mllvm -sobf 。

OLLVM默认支持-fla -sub -bcf 三个混淆参数,这三个参数可以单独使用,也可以配合着使用。
-fla 参数表示使用控制流平展(Control Flow Flattening)模式,
-sub 参数表示使用指令替换(Instructions Substitution)模式,
-bcf 参数表示使用控制流伪造(Bogus Control Flow)模式。

参考
Obfuscator-LLVM在iOS中的实践