關(guān)于LLVM pass的學(xué)習(xí)(3)-- BogusControlFlow(虛假控制流) 分析

功能:

是為函數(shù)增加新的虛假控制流和添加垃圾指令

入口函數(shù):

BogusControlFlow繼承了FunctionPass,因此它的入口函數(shù)即為runOnFunction該入口函數(shù)進(jìn)來(lái)先判斷兩個(gè)參數(shù)的值:ObfTimes和ObfProbRate 边锁,分別代表bcf(BogusControlFlow)循環(huán)運(yùn)行的次數(shù)和每個(gè)basic block被混淆的幾率誊册,它們的默認(rèn)值分別為1和30%〖鼋。可通過(guò)設(shè)置參數(shù)boguscf-loop酱畅、 boguscf-prob修改它們的默認(rèn)值
例如:

if (!((ObfProbRate > 0) && (ObfProbRate <= 100))) 

在編譯程序代碼時(shí)琳袄,若要啟動(dòng)bcf模塊,需要帶上參數(shù)“-mllvm -bcf”

     if (toObfuscate(flag, &F, "bcf")) 

最后調(diào)用bogus函數(shù)纺酸。bogus函數(shù)首先將本function的所有basicblock存放到一個(gè)list容器中窖逗,然后使用一個(gè)while循環(huán)調(diào)用addBogusFlow函數(shù)對(duì)選中的basicblock進(jìn)行增加虛假控制流

核心函數(shù):

  • bogus 函數(shù)
    首先判斷ObfTimes和ObfProbRate 這兩個(gè)參數(shù)

    判斷函數(shù)

    一個(gè)大循環(huán)包括下面的內(nèi)容,這個(gè)大循環(huán)是ObfTimes 來(lái)控制循環(huán)運(yùn)行的次數(shù):
    1:將函數(shù)中的所有BB 添加到list 中
    添加到list

    2: 判斷上面的list 是否為空餐蔬,將這個(gè)方法的內(nèi)部的所有BB 根據(jù)混淆比例看是否去虛假流程
    有概率的執(zhí)行虛假流

  • addBogusFlow 函數(shù)
    舉個(gè)例子:

int func1(int a,int b)
{
       return a+b;
}

編譯完后的IR圖


IR

addBogusFlow函數(shù)
1:調(diào)用getFirstNonPHIOrDbgOrLifetime函數(shù)獲取本basicblock中第一個(gè)不是Phi碎紊、Dbg、Lifetime的指令的地址(在本例中樊诺,即為%a.addr = alloca i32, aling 4的地址)
2:調(diào)用splitBasicBlock函數(shù)仗考。splitBasicBlock函數(shù)可根據(jù)上述指令的地址將一個(gè)basicblock一分為二(可稱為first basicblock 和original basicblock),i1 是%a.addr = alloca i32, aling 4的地址词爬,分割的時(shí)候是第二塊是從i1開(kāi)始到最后秃嗜,i1 上面的部分為一塊


分割過(guò)程

分割后此時(shí)IR 如下:
image.png

接著調(diào)用createAlteredBasicBlock函數(shù)對(duì)original basicblock進(jìn)行拷貝生成一個(gè)名為“altered basicblock”的basicblock,并對(duì)該basicblock加入一些垃圾指令顿膨。加入垃圾指令的方法是遍歷該basicblock中的所有OpCode【操作碼】锅锨,若包含有Add、Sub虽惭、UDiv橡类、SDiv、URem芽唇、SRem顾画、Shl、LShr匆笤、AShr研侣、And、Or炮捧、Xor以及FAdd庶诡、FSub、FMul咆课、FDiv末誓、FRem指令,則用隨機(jī)生成一些指令來(lái)進(jìn)行替換书蚪。由于該block在程序運(yùn)行時(shí)并不會(huì)執(zhí)行喇澡,因此無(wú)需擔(dān)心插入的指令對(duì)原始程序運(yùn)行的結(jié)果產(chǎn)生影響∈庑#拷貝original basicblock后晴玖,


image.png

IR圖如圖5所示。


image.png

這時(shí),所有的basicblock已經(jīng)準(zhǔn)備完畢呕屎,一共存在有3個(gè)basicblock让簿,需要調(diào)整他們之間的關(guān)系。首先清除first basicblock和altered basicblock跟父節(jié)點(diǎn)的關(guān)系秀睛,代碼為:

basicBlock->getTerminator()->eraseFromParent();
alteredBB->getTerminator()->eraseFromParent();

清除完畢后的IR圖如圖6所示尔当。


image.png

接著下一步的操作是增加basicblock之間的條件跳轉(zhuǎn)指令。對(duì)于first basicblock(即為圖中的entry)琅催,bcf源碼的做法是先增加一條比較語(yǔ)句 1.0 = = 1.0 居凶,然后為真時(shí)跳轉(zhuǎn)到original basicblock,為假則跳轉(zhuǎn)到altered basicblock藤抡。可用偽代碼如下表示:

if( 1.0 == 1. 0)
    original basicblock
else
    altered basicblock

對(duì)于altered basicblock模塊抹估,在它的尾部增加一條跳轉(zhuǎn)指令缠黍,使得當(dāng)它執(zhí)行完畢之后(實(shí)際上它并不會(huì)執(zhí)行),跳轉(zhuǎn)到original basicblock模塊药蜻。此時(shí)的IR圖如圖7所示瓷式。


image.png

image.png

最后,獲取basicblock中最后一條指令的地址(在該例子中即ret指令的地址)语泽,調(diào)用splitBasicblock函數(shù)將original basicblock一分為二(original basicblok和originalBBpart2)


image.png

然后調(diào)用如下代碼:
originalBB->getTerminator()->eraseFromParent();

消除original basicblok和originalBBpart2的關(guān)系后贸典,再在original basicblock的末尾加入一個(gè)判斷語(yǔ)句,為真時(shí)跳轉(zhuǎn)到ret指令踱卵,為假則跳轉(zhuǎn)到altered basicblock廊驼,偽代碼如下所示:

if( 1.0 == 1. 0)
    ret
else
    altered basicblock

此時(shí)該func1函數(shù)的IR圖如圖8所示:

image.png

doF函數(shù) 【和bogus 函數(shù)在位置相同】
該函數(shù)的功能是將Function中所有為真的判斷語(yǔ)句進(jìn)行替換,比如上一節(jié)中的“1.0 == 1.0 ”惋砂。它的思想是定義兩個(gè)全局變量x妒挎、y并且初始化為0,然后遍歷Module內(nèi)的所有指令西饵,并將所有的FCMP_TRUE分支指令替換為“y<10 || x
x(x-1)%2 ==0”酝掩。替換完畢后func1函數(shù)的IR流程圖如圖9所示:
image.png

至此,對(duì)func1函數(shù)的一次bcf混淆過(guò)程就完成了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眷柔,一起剝皮案震驚了整個(gè)濱河市期虾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驯嘱,老刑警劉巖镶苞,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宙拉,居然都是意外死亡宾尚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)煌贴,“玉大人御板,你說(shuō)我怎么就攤上這事∨V#” “怎么了怠肋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)淹朋。 經(jīng)常有香客問(wèn)我笙各,道長(zhǎng),這世上最難降的妖魔是什么础芍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任杈抢,我火速辦了婚禮,結(jié)果婚禮上仑性,老公的妹妹穿的比我還像新娘惶楼。我一直安慰自己,他們只是感情好诊杆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布歼捐。 她就那樣靜靜地躺著,像睡著了一般晨汹。 火紅的嫁衣襯著肌膚如雪豹储。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天淘这,我揣著相機(jī)與錄音剥扣,去河邊找鬼。 笑死慨灭,一個(gè)胖子當(dāng)著我的面吹牛朦乏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氧骤,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呻疹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了筹陵?” 一聲冷哼從身側(cè)響起刽锤,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朦佩,沒(méi)想到半個(gè)月后并思,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡语稠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年宋彼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弄砍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡输涕,死狀恐怖音婶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莱坎,我是刑警寧澤衣式,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站檐什,受9級(jí)特大地震影響碴卧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乃正,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一住册、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烫葬,春花似錦界弧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)划栓。三九已至兑巾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忠荞,已是汗流浹背蒋歌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留委煤,地道東北人堂油。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碧绞,于是被迫代替她去往敵國(guó)和親府框。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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