0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OLLVM和LLVM功能介紹

我快閉嘴 ? 來(lái)源:小道安全 ? 作者:小道安全 ? 2022-09-19 15:42 ? 次閱讀

基礎(chǔ)知識(shí)

LLVM是lowlevel virtual machine的簡(jiǎn)稱(chēng),它誕生于2003.10伊利諾伊大學(xué)香檳分校,創(chuàng)始人是ChrisLattner,它是一個(gè)完整的編譯器框架,它兼容大部分主流開(kāi)發(fā)語(yǔ)言例如:C, C++, Objective-C等等,它也兼容大部分主流的平臺(tái):x86, x86-64, PowerPC, PowerPC-64,ARM,Thumb等等。

6cfbf7ec-372d-11ed-ba43-dac502259ad0.png

(圖片來(lái)源網(wǎng)絡(luò)

LLVM會(huì)先將源碼生成為與目標(biāo)機(jī)器無(wú)關(guān)的LLVMIR代碼,然后把LLVMIR代碼先優(yōu)化,再向目標(biāo)機(jī)器的匯編語(yǔ)言而轉(zhuǎn)換。LLVM編譯器主要細(xì)分為前端、中層優(yōu)化和后端的3部分構(gòu)成。

6d154cf6-372d-11ed-ba43-dac502259ad0.png

(圖片來(lái)源網(wǎng)絡(luò))

OLLVM就是在LLVM的基礎(chǔ)上增加了obfuscator(混淆), Obfuscator-LLVM (OLLVM) 是2010 年 6 月由 Yverdon-les-Bains 的瑞士西北應(yīng)用科技大學(xué)安全實(shí)驗(yàn)室針對(duì)LLVM編譯組件開(kāi)發(fā)的代碼混淆工具,該工具完全開(kāi)源,這個(gè)OLLVM主要為了增加逆向工程的難度,保證代碼的安全性。

Obfuscator-LLVM (OLLVM)集成了LLVM編譯器,并且兼容LLVM支持的所有語(yǔ)言(C,C++, Objective-C, Ada and Fortran)和平臺(tái)(x86, x86-64, PowerPC,PowerPC-64,ARM,Thumb,SPARC,Alpha,CellSPU,MIPS, MSP430, SystemZ,XCore)。

OLLVM的混淆原理,就是在不改變?cè)创a功能前提下,將C或C++代碼中的控制語(yǔ)句if、while、for、do等轉(zhuǎn)換成switch分支語(yǔ)句。這樣實(shí)現(xiàn)的優(yōu)勢(shì)是,它可以模糊switch中case代碼塊之間的關(guān)系,從而增加逆向分析代碼難度。

混淆的具體實(shí)現(xiàn)思路,首先將要實(shí)現(xiàn)代碼平坦化的函數(shù)分成多個(gè)基本塊(就是case代碼塊)和一個(gè)入口塊,并為每個(gè)基本塊設(shè)置編號(hào),并讓這些基本塊都有共同的前驅(qū)模塊和后繼模塊。前驅(qū)模塊主要是進(jìn)行基本塊的分發(fā),后繼模塊的分發(fā)通過(guò)改變switch變量來(lái)實(shí)現(xiàn)。

OLLVM和LLVM主要的功能的代碼差異點(diǎn)如下圖所示

6d27261a-372d-11ed-ba43-dac502259ad0.png

OLLVM功能介紹

OLLVM全面模式支持以下四種代碼包含模式

1、-mllvm -fla: 控制流化扁平化

2、-mllvm -sub:指令替換

3、-mllvm -bcf: 控制流程

4、-mllvm -sobf: 字符串加密

以O(shè)LLVM保護(hù)后的功能效果都在文章的后部分進(jìn)行展示。

-mllvm -fla中fla的全稱(chēng):Control Flow Flattening,它也稱(chēng)為控制流扁平化,這個(gè)功能模式主要原理就是把一些if-else語(yǔ)句,嵌套成do-while語(yǔ)句。

它支持以下3種保護(hù)功能模式:

-mllvm -fla: 激活控制流扁平化

-mllvm -split:激活基本塊分裂。一起使用時(shí)提高平整度。

-mllvm -split_num=3:如果激活通行證,則在每個(gè)基本塊上應(yīng)用 3 次。默認(rèn)值:1

-mllvm -sub,它的全稱(chēng)Instructions Substitution,它又稱(chēng)為指令替換,這個(gè)的原理可以理解為就是不改變功能的前提下,將簡(jiǎn)單的指令替換成更復(fù)雜的指令,當(dāng)有多個(gè)等效指令序列可用時(shí)候,會(huì)隨機(jī)選擇一個(gè)指令進(jìn)行替換。這個(gè)混淆它并不會(huì)增強(qiáng)過(guò)多的安全性,因?yàn)樗梢酝ㄟ^(guò)重新優(yōu)化生成的代碼輕松刪除,如果選擇使用隨機(jī)生成器以不同數(shù)值作為種子,指令替換會(huì)在生成的二進(jìn)制文件中帶來(lái)多樣性。

它支持以下的2種模式功能:

-mllvm -sub:激活指令替換

-mllvm -sub_loop=3:如果激活了傳遞,則在函數(shù)上應(yīng)用3次。默認(rèn)值:1

-mllvm -bcf,它的全稱(chēng)Bogus Control Flow,也稱(chēng)為虛假控制流。這個(gè)主要原理就是在當(dāng)前基本塊之前添加一個(gè)新的基本塊用來(lái)修改函數(shù)調(diào)用圖,這個(gè)新的基本塊包含一個(gè)不透明的謂詞,通過(guò)有條件地跳轉(zhuǎn)到原來(lái)的基本塊。原始的基本塊也會(huì)被克隆并填充隨機(jī)的垃圾指令。

這虛假控制流代碼保護(hù)模式主要通過(guò)在不改變代碼功能前提下往代碼里面嵌套幾層的判斷邏輯,這種模式下會(huì)大大影響程序的性能,因?yàn)樗诖a下混雜著真真假假的代碼。

這個(gè)模式下它支持3種功能選項(xiàng):

-mllvm -bcf: 激活偽造的控制流通道

-mllvm -bcf_loop=3: 如果 pass 被激活,在一個(gè)函數(shù)應(yīng)用 3 次。默認(rèn)值:1

-mllvm -bcf_prob=40:如果激活通行證,一個(gè)基本塊將以 40% 的概率被混淆。默認(rèn)值:30

-mllvm -sobf也稱(chēng)為字符串混淆,主要實(shí)現(xiàn)將代碼中的字符串做加密,使得無(wú)法通過(guò)靜態(tài)逆向方式直接看到字符串信息。

它主要支持2種功能模式選項(xiàng):

-mllvm -sobf:編譯時(shí)候添加選項(xiàng)開(kāi)啟字符串加密

-mllvm -seed=0xdeadbeaf:指定隨機(jī)數(shù)生成器種子流程

OLLVM編譯

編譯OLLVM前需要以下的工具和代碼:

1、OLLVM源碼(基礎(chǔ)之源)

https://releases.llvm.org/download.html

2、cmake工具(將OLLVM轉(zhuǎn)換為sln項(xiàng)目)

https://cmake.org/download/

3、Visual studio工具(編譯OLLVM源碼)

https://visualstudio.microsoft.com/zh-hans/

在window環(huán)境下編譯OLLVM的源碼主要需要經(jīng)歷2個(gè)步驟

1、通過(guò)利用cmake將OLLVM的源碼轉(zhuǎn)換為sln的項(xiàng)目

可以通過(guò)利用cmake工具或者用命令行方式轉(zhuǎn)換,下面以命令行方式轉(zhuǎn)換的

cmake -Thost=x64 -G "Visual Studio 16" E:ollvm9obfuscator-llvm-9.0.1obfuscator-llvm-9.0.1

上面要主要的是Visual Studio 16這個(gè)代表你環(huán)境中安裝的vs版本,我安裝2019版本的,所以用它。

通過(guò)執(zhí)行以上命令后就會(huì)出現(xiàn)下圖的效果

6d3f5078-372d-11ed-ba43-dac502259ad0.png

2、用Visual studio 2019 直接編譯前面生成的OLLVM項(xiàng)目,主要編譯Release版本。編譯后正確情況下會(huì)生成bin和lib兩個(gè)文件夾。

6d52743c-372d-11ed-ba43-dac502259ad0.png

OLLVM集成

通過(guò)前面的編譯后生成的bin和lib文件夾,集成到NDK中,并通過(guò)android studio編譯器進(jìn)行so代碼保護(hù)的應(yīng)用。

將vs編譯生成后的bin和lib文件夾,替換到NDK中的llvm文件夾下面toolchainsllvmprebuiltwindows-x86_64(替換之前切記做下備份,萬(wàn)一出問(wèn)題了還能回滾)

6d5d9a88-372d-11ed-ba43-dac502259ad0.png

通過(guò)配置Android.mk文件進(jìn)行設(shè)定需要對(duì)so文件采用什么方式的全局代碼保護(hù)。

可能大家會(huì)覺(jué)得保護(hù)強(qiáng)度越強(qiáng)越好,代碼虛擬化、字符串混淆、指令替換等等都給用下去,那樣就安全了,其實(shí)不是這樣的,這些強(qiáng)度雖然上去了但是會(huì)給項(xiàng)目帶來(lái)非常大的負(fù)擔(dān)。往往會(huì)帶來(lái)負(fù)面性能影響。

個(gè)人建議:可以針對(duì)字符串做個(gè)混淆(-mllvm -sobf),外加指定核心函數(shù)進(jìn)行做代碼保護(hù)。這樣強(qiáng)度也有了,對(duì)應(yīng)用的性能影響方面也相對(duì)較小。

6d6ab9ac-372d-11ed-ba43-dac502259ad0.png

上圖中Android.mk設(shè)置的保護(hù)方式屬于全局的保護(hù),設(shè)置后整個(gè)so就都會(huì)基于設(shè)置的保護(hù)。

通過(guò)配置Application.mk文件,進(jìn)行指定ollvm的clang具體版本數(shù)據(jù)(這個(gè)具體版本數(shù)據(jù)也可以lib文件夾下clang文件夾下查看)。

6d7a73ce-372d-11ed-ba43-dac502259ad0.png

OLLVM保護(hù)效果

為了更好展示分析ollvm保護(hù)后的效果,主要通過(guò)基于__attribute((__annotate__(("sub"))))這種方式,對(duì)指定函數(shù)進(jìn)行做保護(hù),而沒(méi)有進(jìn)行配置全局的保護(hù)。

下圖的代碼功能效果僅是為了測(cè)試OLLVM的虛假指令保護(hù)后的實(shí)現(xiàn)效果

6d864622-372d-11ed-ba43-dac502259ad0.png

下圖是基于IDA工具的原始和虛假控制流的代碼保護(hù)流程圖,可以看到代碼的執(zhí)行流程已被調(diào)整變得相對(duì)復(fù)雜化,這樣就大大強(qiáng)化了代碼的安全強(qiáng)度,這種逆向分析其代碼至少靜態(tài)分析起來(lái)就費(fèi)勁了。

6da08960-372d-11ed-ba43-dac502259ad0.png

下圖是通過(guò)指定函數(shù)進(jìn)行設(shè)置指令替換的功能的代碼展示

6db4227c-372d-11ed-ba43-dac502259ad0.png

通過(guò)下圖IDA靜態(tài)的代碼流程圖可以很清晰分析到,它實(shí)際上代碼流程是沒(méi)有任何變化的,所以這種保護(hù)模式下的代碼保護(hù)功能時(shí)沒(méi)有很明顯的效果的。

6dcbd822-372d-11ed-ba43-dac502259ad0.png

下圖的代碼是通過(guò)調(diào)用ollvm的控制流扁平化功能進(jìn)行對(duì)函數(shù)保護(hù)的代碼展示

6dd66076-372d-11ed-ba43-dac502259ad0.png

通過(guò)下圖IDA的代碼流程圖,可以看到代碼控制流扁平化保護(hù)后,整個(gè)流程就變得復(fù)雜化了。這就讓代碼的安全性上升一個(gè)層次了,這樣逆向分析還原代碼功能的成本就大大提高了。

6df3938a-372d-11ed-ba43-dac502259ad0.png

小結(jié)

通過(guò)上文OLLVM的一系列的原理集成、編譯、配置、集成、代碼生成、效果展示,主要為了給SO代碼的防破解防逆向增加點(diǎn)門(mén)檻,提高點(diǎn)安全性。這系列的代碼保護(hù)對(duì)于專(zhuān)業(yè)搞逆向的人員來(lái)說(shuō),它們可以通過(guò)基于Trace、unicron、frida這些方式去還原和去除OLLVM的混淆保護(hù)。

對(duì)于代碼的安全性思考,不過(guò)在安全攻防對(duì)抗的過(guò)程中防御一直屬于被動(dòng)狀態(tài)的也是相對(duì)滯后的。安全防護(hù)也是隨著對(duì)抗去不斷去提高變強(qiáng)。

代碼安全防護(hù)方面可以借助于OLLVM然后進(jìn)行做定制魔改,現(xiàn)有的逆向工具更多是基于標(biāo)準(zhǔn)化進(jìn)行做反匯編,那么我們可以對(duì)這些逆向工具做些防護(hù)(可以多個(gè)方案結(jié)合),然后調(diào)整成為一些非標(biāo)準(zhǔn)化的,這樣會(huì)大大增加逆向分析的成本。

只要逆向分析成本超過(guò)所破解后所獲取的收益,那么你的代碼就相對(duì)安全了。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68236
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49016

原文標(biāo)題:一種高端的APP代碼保護(hù)方案

文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)ubuntu 14.04 編譯am57xx SDK , 發(fā)生nativesdk-ti-llvm3.6異常是為什么?

    本帖最后由 一只耳朵怪 于 2018-6-5 14:11 編輯 ubuntu 14.04 編譯am57xx SDK , 發(fā)生nativesdk-ti-llvm3.6 異常, 求高手
    發(fā)表于 06-04 11:31

    LLVM編譯器編譯過(guò)程

    LLVM 編譯器 原理解析, 插件編寫(xiě)
    發(fā)表于 04-28 08:15

    LLVM clang 公開(kāi) -std=c++23

    合入 LLVM 17 倉(cāng)庫(kù)的代碼對(duì) Clang 編譯器使用 -std=c++23 代替了 -std=c++2b。 隨著 ISO C++ 委員會(huì)投票決定 C++23 標(biāo)準(zhǔn)已達(dá)到其技術(shù)完整狀態(tài)
    發(fā)表于 05-27 11:29

    GPS功能介紹

    GPS功能介紹 功能介紹
    發(fā)表于 01-29 10:35 ?4938次閱讀

    在Swift中使用LLVM的四個(gè)要點(diǎn)

    本文主要內(nèi)容是演示如何在Swift中使用LLVM,其包含了如下四個(gè)要點(diǎn): 獲取最新版本的LLVM使用CMake和llvm-config編譯程序編寫(xiě)簡(jiǎn)單的Swift程序,編譯并與LLVM
    發(fā)表于 10-13 16:55 ?0次下載
    在Swift中使用<b class='flag-5'>LLVM</b>的四個(gè)要點(diǎn)

    四個(gè)不同的系統(tǒng)上進(jìn)行LLVM/Clang 6.0 和 5.0 的編譯器Benchmark測(cè)試

    參與測(cè)試的 LLVM 5.0.1 和 LLVM 6.0.0 穩(wěn)定版都是來(lái)自 apt.llvm.org。測(cè)試期間,每個(gè)系統(tǒng)都將其 CFLAGS/CXXFLAGS 設(shè)置為 "-O3 -march
    的頭像 發(fā)表于 03-29 15:25 ?7707次閱讀

    LLVM終身程序分析與轉(zhuǎn)換的編譯框架的詳細(xì)資料說(shuō)明

    本文描述了LLVM(Low Level Virtual Machine)編譯器框架,它通過(guò)在編譯時(shí)、鏈接時(shí)、運(yùn)行時(shí)和運(yùn)行之間的空閑時(shí)間向編譯器轉(zhuǎn)換提供高級(jí)信息,支持對(duì)任意程序進(jìn)行透明的、終身的程序
    發(fā)表于 06-08 08:00 ?0次下載
    <b class='flag-5'>LLVM</b>終身程序分析與轉(zhuǎn)換的編譯框架的詳細(xì)資料說(shuō)明

    微軟與LLVM、Rust達(dá)成合作,將CFG支持添加到編譯器

    微軟方面宣布,該公司已與 LLVM 和 Rust 開(kāi)發(fā)團(tuán)隊(duì)達(dá)成合作,將對(duì) Windows Control Flow Guard(CFG)平臺(tái)安全功能的支持添加到了 Clang 和 Rustc 編譯器
    的頭像 發(fā)表于 08-20 11:44 ?2911次閱讀

    llvm-mctoll將二進(jìn)制文件轉(zhuǎn)換為LLVM IR

    ./oschina_soft/llvm-mctoll.zip
    發(fā)表于 06-22 11:35 ?0次下載
    <b class='flag-5'>llvm</b>-mctoll將二進(jìn)制文件轉(zhuǎn)換為<b class='flag-5'>LLVM</b> IR

    淺談LLVM LibFuzzer工具和實(shí)踐

    一種強(qiáng)大且智能的測(cè)試方式呢?答案是肯定的,它就是出自 LLVM 編譯器框架的 LibFuzzer 工具。
    的頭像 發(fā)表于 10-27 10:57 ?2045次閱讀

    LLVM源碼淺析-1

    作為一個(gè)優(yōu)秀的開(kāi)源編譯器框架,llvm的代碼比gcc代碼的可讀性更好。因此無(wú)論是學(xué)習(xí)c++,還是學(xué)習(xí)編譯原理、設(shè)計(jì)模式、數(shù)據(jù)結(jié)構(gòu),都是一個(gè)很好的學(xué)習(xí)目標(biāo)。
    的頭像 發(fā)表于 03-02 16:06 ?2031次閱讀
    <b class='flag-5'>LLVM</b>源碼淺析-1

    LLVM國(guó)際開(kāi)源軟件社區(qū)發(fā)布正式支持LoongArch架構(gòu)的版本

    發(fā)行版將可以直接基于上游社區(qū)版本進(jìn)行構(gòu)建,標(biāo)志著LoongArch軟件生態(tài)建設(shè)將迎來(lái)快速發(fā)展的新階段。 LLVM介紹 LLVM是如今設(shè)計(jì)和開(kāi)發(fā)編譯器的最重要的框
    的頭像 發(fā)表于 03-21 09:45 ?1687次閱讀

    LLVM16的新增功能介紹

    除了對(duì)今年架構(gòu)的標(biāo)準(zhǔn)支持外,我們還完成了對(duì)可擴(kuò)展矩陣擴(kuò)展(SME和SME2)的匯編級(jí)支持。
    的頭像 發(fā)表于 05-18 10:07 ?1634次閱讀
    <b class='flag-5'>LLVM</b>16的新增<b class='flag-5'>功能</b><b class='flag-5'>介紹</b>

    什么是LLVM?LLVM的優(yōu)勢(shì)和特點(diǎn)有哪些?

    LLVM是一個(gè)開(kāi)源的編譯器基礎(chǔ)設(shè)施項(xiàng)目,它以"Low-Level Virtual Machine"的縮寫(xiě)命名,盡管名稱(chēng)中包含了"虛擬機(jī)"一詞,但LLVM不僅僅是一個(gè)虛擬機(jī),而是一個(gè)綜合的編譯器工具鏈。
    的頭像 發(fā)表于 06-11 15:54 ?9460次閱讀

    使用LLVM-embedded-toolchain-for-Arm-17.0.1開(kāi)發(fā)STM32

    LLVM-embedded-toolchain-for-Arm 是一個(gè) ARM 公司開(kāi)源的適用于 32 位ARM芯片的工具鏈,支持多種ARM指令集架構(gòu),包括最新的 CM85 內(nèi)核。
    的頭像 發(fā)表于 10-23 16:46 ?1561次閱讀
    使用<b class='flag-5'>LLVM</b>-embedded-toolchain-for-Arm-17.0.1開(kāi)發(fā)STM32