iOS混淆-ollvm中添加對(duì)String的混淆

原文鏈接: http://fighting300.com...

之前研究ollvm的時(shí)候,發(fā)現(xiàn)開源的ollvm庫(kù)中沒有對(duì)字符串混淆的部分,但是很多APP中都可能會(huì)有一些需要加密的字符串。機(jī)緣巧合發(fā)現(xiàn)上海交大的GoSSIP小組開源了他們?cè)O(shè)計(jì)的基于LLVM4.0的混淆框架,功能包含常量字符串混淆以及ollvm原有的一些功能。該頁(yè)面有關(guān)于他們項(xiàng)目的簡(jiǎn)介。
簡(jiǎn)單分析發(fā)現(xiàn)字符串混淆的部分主要由字符串加密的Pass完成,之后我們考慮把字符串混淆的功能加入ollvm中,所以本文簡(jiǎn)單介紹下如何將字符串加密的Pass繼承到ollvm中。Pass其實(shí)可以簡(jiǎn)單的理解為L(zhǎng)LVM優(yōu)化/轉(zhuǎn)換工作的一個(gè)最小單元,可以把所有的混淆工作都是由一個(gè)一個(gè)Pass組成的,想要做具體的了解,可以看下以下專欄的文章。

Pass集成

首先提取字符串加密文件對(duì)應(yīng)pass文件,該文件所在目錄為lib/Transform/Obfuscation。


pass文件目錄


提取后放在ollvm相同目錄下,并把頭文件也復(fù)制到對(duì)應(yīng)目錄下,該文件所在目錄為include/llvm/Transform/Obfuscation。

頭文件目錄

修改lib/Transform/Obfuscation目錄下的CMakeLists.txt文件,將StringObfuscation.cpp添加到編譯庫(kù)中。然后修改Transform/IPO下的PassManagerBuilder.cpp文件,添加字符串加密的編譯代碼。具體代碼如下:

1.添加引用

#include "llvm/Transforms/Obfuscation/StringObfuscation.h"

2.插入函數(shù)聲明,即編譯時(shí)的編譯參數(shù)-mllvm -sobf
static cl::opt<std::string> Seed("seed", cl::init(""),
                           cl::desc("seed for the random"));

static cl::opt<bool> StringObf("sobf", cl::init(false),
                           cl::desc("Enable the string obfuscation"));
3.在PassManagerBuilder()構(gòu)造函數(shù)中添加隨機(jī)數(shù)因子的初始化
    if(!Seed.empty()) {
      llvm::cryptoutils->prng_seed(Seed.c_str());
    }
插入隨機(jī)因子初始化
4.添加pss到 PassManagerBuilder::populateModulePassManager中
    MPM.add(createStringObfuscation(StringObf));
添加Pass
5.在主路徑下運(yùn)行編譯命令
  mkdir build
  cd build
  cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/   // 代碼所在路徑
  make -j7

即可生成build最終文件,用于項(xiàng)目編譯。我在github上也新建了一個(gè)添加了字符串混淆功能的ollvm版本,想要直接使用的小伙伴可以下載使用。

6.使用效果

在OC代碼中添加了簡(jiǎn)單的字符串、混淆后的效果如下圖:

字符串混淆前
字符串混淆后

問題及解決方案

編譯成功后,則可按照上篇文章所述,在XCode中編譯項(xiàng)目。

1. bcf不支持Invoke指令

在實(shí)際使用過程中,發(fā)現(xiàn)ollvm目前不支持@synchronized、try...catch等少數(shù)語(yǔ)法,然后導(dǎo)致bcf報(bào)錯(cuò)。這些語(yǔ)法會(huì)生成invoke指令,目前可以在bcf前過濾包含InvokeInst的方法,具體代碼可以參考該Github地址。

2.目前該字符串識(shí)別還有bug,即不會(huì)加密每個(gè)函數(shù)的第一個(gè)字符串。。。該bug未經(jīng)過驗(yàn)證。

若有其他問題,可以聯(lián)系,或者comment

參考文檔
  1. http://bobao.#/learning/detail/4069.html
  2. http://www.nagain.com/activity/article/14/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容