IOS代碼混淆:Obfuscator-LLVM IOS 代碼混淆實戰一


IOS代碼混淆:Obfuscator-LLVM IOS 代碼混淆實戰一


簡介

OLLVM(Obfuscator-LLVM)是瑞士西北應用科技大學安全實驗室於2010年6月份發起的一個項目,該項目旨在提供一套開源的針對LLVM的代碼混淆工具,以增加對逆向工程的難度。github上地址是https://github.com/obfuscator-llvm/obfuscator,只不過僅更新到llvm的4.0,2017年開始就沒在更新。

移植

OLLVM如果自己想拿最新版的LLVM和Clang進行移植功能其實也並不是很難,整理一下其實改動很小,接下來將會講一下移植的方法。

個人整理

先放一下個人移植好的版本地址https://github.com/kfq0072/obfuscator.git,個人fork原版後又加入了llvm5.0,6.0,7.0以及swift-llvm5.0的版本,應該能滿足大部分需求了

<code>git clone b llvm-8.0 https://github.com/kfq0072/obfuscator.git
mkdir build
cd build
#如果不想跑測試用例加上-DLLVM_INCLUDE_TESTS=OFF
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON ../obfuscator/
make -j7
/<code>

使用

這裡原版提供了3種混淆方式分別是控制流扁平化,指令替換,虛假控制流程,用起來都是加cflags的方式。下面簡單說下這幾種模式。

控制流扁平化

這個模式主要是把一些if-else語句,嵌套成do-while語句

-mllvm -fla:激活控制流扁平化-mllvm -split:激活基本塊分割。在一起使用時改善展平。-mllvm -split_num=3:如果激活了傳遞,則在每個基本塊上應用3次。默認值:1

指令替換

這個模式主要用功能上等效但更復雜的指令序列替換標準二元運算符(+ , – , & , | 和 ^)

-mllvm -sub:激活指令替換-mllvm -sub_loop=3:如果激活了傳遞,則在函數上應用3次。默認值:1

虛假控制流程

這個模式主要嵌套幾層判斷邏輯,一個簡單的運算都會在外面包幾層if-else,所以這個模式加上編譯速度會慢很多因為要做幾層假的邏輯包裹真正有用的代碼。

另外說一下這個模式編譯的時候要浪費相當長時間包哪幾層不是鬧得!

-mllvm -bcf:激活虛假控制流程-mllvm -bcf_loop=3:如果激活了傳遞,則在函數上應用3次。默認值:1-mllvm -bcf_prob=40:如果激活了傳遞,基本塊將以40%的概率進行模糊處理。默認值:30


XCode集成

XCode裡集成需要看版本,XCode10之前和之後是一個分水嶺,XCode9之前和之後有一個小配置不同。

XCode10以前

<code>$ 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
/<code>

修改:

<code><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>
/<code>

執行:

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

修改:

<code>Description
<string>Apple LLVM 8.0 compiler/<string> -> <string>Obfuscator 4.0 compiler/<string>
ExecPath
<string>clang/<string> -> <string>/path/to/obfuscator_bin/clang/<string>
Identifier
<string>com.apple.compilers.llvm.clang.1_0/<string> -> <string>com.apple.compilers.llvm.obfuscator.4_0/<string>
Name

<string>Apple LLVM 8.0/<string> -> <string>Obfuscator 4.0/<string>
Vendor
<string>Apple/<string> -> <string>HEIG-VD/<string>
Version
<string>7.0/<string> -> <string>4.0/<string>
/<code>

執行:

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

修改:

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

執行:

<code>$ sudo plutil -convert binary1 Obfuscator\\ 3.4.strings
/<code>

XCode9之後要設置Enable Index-While-Building成NO


XCode10之後

xcode10之後無法使用添加ideplugin的方法,但添加編譯鏈跑的依然可行,另外網上一些人說不能開bitcode,不能提交AppStore,用原版llvm改的ollvm的確有可能出現上述情況,所以我用蘋果的swift-llvm改了一版暫時沒去試著提交,或許可以,有興趣的也可以自己下載使用試試obfuscator這版,特別備註由於修改沒有針對swift部分所以用swift寫的代碼沒混淆,回頭有空的話再弄。

創建XCode的toolchain然後把生成的文件夾放到/Library/Developer/下

<code>cd build
sudo make install-xcode-toolchain
mv /usr/local/Toolchains /Library/Developer/
/<code>

Toolchains下的.xctoolchain文件就是一個文件夾,進去修改info.plist

<code>CFBundleIdentifier
<string>org.llvm.7.0.0svn/<string> -> <string>org.ollvm-swift.5.0/<string>
/<code>

修改完在XCode的Toolchains下就會顯示相應的名稱

然後如圖打開XCode選擇Toolchaiins


IOS代碼混淆:Obfuscator-LLVM IOS 代碼混淆實戰一

IOS代碼混淆:Obfuscator-LLVM IOS 代碼混淆實戰一

按這些配置好後就算是可以用了。

擴展:字符串混淆

原版是沒有這功能的本來,Armariris 提供了這個功能,我這也移植過來了,畢竟不難。首先把StringObfuscation的.h,.cpp文件放到對應的Obfuscation文件夾下,然後分別修改下面的文件。

IOS代碼混淆:Obfuscator-LLVM IOS 代碼混淆實戰一

用法

-mllvm -sobf:編譯時候添加選項開啟字符串加密-mllvm -seed=0xdeadbeaf:指定隨機數生成器種子

效果

看個添加了-mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf這麼一串的效果。


IOS代碼混淆:Obfuscator-LLVM IOS 代碼混淆實戰一


分享到:


相關文章: