LLVM 進(jìn)階一:符號混淆(LTO)

更新:編譯參數(shù)添加對靜態(tài)庫的說明

一、目的:

實現(xiàn)鏈接時符號混淆
參考文檔:
https://llvm.org/docs/LinkTimeOptimization.html
https://mayuyu.io/2017/06/01/LLVMHacking-0x1/#more

二朱监、思路:

  • 編譯階段處理符號存在硬傷岸啡,拋棄
  • 鏈接器 ld 只是一個調(diào)度器,核心邏輯在庫 libLTO.dylib
  • pass注冊在文件 LTOBackend.cpp 里
  • 鏈接時的module整合成了一個總的module赫编, 所以鏈接時可以修改符號

三巡蘸、實現(xiàn)流程:

從這篇文章開始基于LLVM13.0,pass的注冊與實現(xiàn)不同于以前的版本擂送,反復(fù)折騰悦荒,QAQ;

1嘹吨、pass代碼:
不再使用runOnModule實現(xiàn)搬味,我參考了 StripSymbols.cpp 的實現(xiàn)方式,官方在老的pass里加入了新的pass流程蟀拷,官方都支持碰纬,我這里使用了新的pass調(diào)用方式,如下:

  • 頭文件 SymbolObfuscation.h:
#include "llvm/IR/PassManager.h"
namespace llvm {
    struct SymbolObfuscationPass : PassInfoMixin<SymbolObfuscationPass> {
      PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
    };
}
  • cpp 文件 SymbolObfuscation.cpp:

#include "llvm/IR/Module.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/SymbolObfuscation/SymbolObfuscation.h"
#include <string>
#include <iostream>
#include <cstdlib>

using namespace llvm;
using namespace std;

static string obfcharacters="-_.|/\\`+,=()*:";

int seed = 0;
string randomString(int length){
    string name;
    name.resize(length);
    srand(seed);
    seed++;
    for(int i=0;i<length;i++){
        name[i]=obfcharacters[rand()%(obfcharacters.length())];
    }
    return "f_" + name;
}

PreservedAnalyses SymbolObfuscationPass::run(Module &M, ModuleAnalysisManager &AM) {
    //F.setName(randomString(16));
    errs()<<"Start Symbol Rewrite!\n";
    for(Module::iterator Fun=M.begin();Fun!=M.end();Fun++){
        Function &F=*Fun;
        if (F.getName().str().compare("main")==0){
            errs()<<"Skipping main\n";
        }
        else if(F.empty()==false){
            //Rename
            string newname = randomString(16);
            errs()<<"Renaming Function: "<<F.getName()<<"\n";
            errs()<<"New Function Name: "<<newname<<"\n";
            F.setName(newname);
        }
        else{
            errs()<<"Skipping External Function: "<<F.getName()<<"\n";
        }
    }
  return PreservedAnalyses::all();
}

2问芬、如何添加該pass:
llvm/LTO/LTOBackend.cpp文件添加悦析,選擇在這里添加是因為我們的目的是實現(xiàn)鏈接時優(yōu)化。

  • 添加命令行參數(shù):


    image.png
  • 函數(shù) runNewPMPasses 添加:


    image.png

四此衅、測試:

  • 上述在llvm13.0編譯通過后强戴,可以先找一個簡單的cpp文件編譯測試下效果,例:


    image.png
  • 為了展示更好的效果炕柔,我舉例一個iOS的Xcode項目

確保原始ios項目運(yùn)行沒問題后酌泰,只需要添加幾個參數(shù)即可使用,替換掉xcode的clang就可以了
1匕累、xcode添加編譯參數(shù):

  • 目標(biāo)二進(jìn)制的編譯參數(shù):-flto
  • 如果依賴了靜態(tài)庫陵刹,需要在靜態(tài)庫的target也配置編譯參數(shù)-flto,如果依賴庫不需要混淆符號欢嘿,則該target不需要添加-flto
    image.png

2衰琐、xcode添加鏈接參數(shù):


image.png
  • -Xlinker 將 clang 參數(shù)傳遞給 鏈接器 ld
  • -lto_library 指定LLVM的鏈接庫

3也糊、編譯,首先查看鏈接日志如下羡宙,說明鏈接時pass執(zhí)行成功了:

image.png

4狸剃、自測運(yùn)行該app正常,二進(jìn)制包大小也沒有變化:
沒有做過批量測試
5狗热、nm查看二進(jìn)制符號如下:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞馁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匿刮,更是在濱河造成了極大的恐慌僧凰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熟丸,死亡現(xiàn)場離奇詭異训措,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)光羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門绩鸣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纱兑,你說我怎么就攤上這事呀闻。” “怎么了萍启?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵总珠,是天一觀的道長。 經(jīng)常有香客問我勘纯,道長局服,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任驳遵,我火速辦了婚禮淫奔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堤结。我一直安慰自己唆迁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布竞穷。 她就那樣靜靜地躺著唐责,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘾带。 梳的紋絲不亂的頭發(fā)上鼠哥,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼朴恳。 笑死抄罕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的于颖。 我是一名探鬼主播呆贿,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喂很,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎母蛛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乳怎,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年前弯,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚪缀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡恕出,死狀恐怖询枚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浙巫,我是刑警寧澤金蜀,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站的畴,受9級特大地震影響渊抄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丧裁,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一护桦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煎娇,春花似錦二庵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哟绊,卻和暖如春因妙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工兰迫, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留信殊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓汁果,卻偏偏與公主長得像涡拘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子据德,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容