作者:ADLab
CIA泄漏仍在持續(xù)發(fā)酵中,維基解密正在持續(xù)放出越來越多的資料來展示CIA武器庫的威力。最近維基解密公布了CIA的代碼混淆框架Marble,該框架通過選擇的算法對代碼中的字符串進(jìn)行重新編碼,用以增加代碼的分析難度。這套代碼不僅僅可以混淆英文字符串,還可以混淆包括中文、俄文、韓語、阿拉伯語等多種語言。
Marble由4部分組成:Mibster、Mender、Validator、Marbles,其中Marbles是加密算法池,程序會從其中眾多算法中選擇一種算法來對字符串進(jìn)行加密。
Marble概述
Marble框架如下圖,當(dāng)一個項(xiàng)目想要用Marble進(jìn)行混淆時,可以在編譯該項(xiàng)目時對項(xiàng)目的預(yù)先生成事件和后期生成事件進(jìn)行設(shè)置,在編譯之前預(yù)先生成事件啟動,會調(diào)用mibster從算法池中選擇一種算法對項(xiàng)目中的字符串進(jìn)行加工,并生成一個recepit供Validator程序進(jìn)行驗(yàn)證,在項(xiàng)目編譯好之后,后期生成事件啟動,該事件會調(diào)用Mender來還原混淆的代碼。當(dāng)這一切做完之后可以使用Validator程序?qū)ι傻腂inary進(jìn)行驗(yàn)證。
Mibster的實(shí)現(xiàn)
首先我們來看整個框架最主要的程序Mibster,其主要流程為:
Mibster邏輯實(shí)現(xiàn)流程如下:
1選擇算法
Mibster首先會通過函數(shù)“ChooseMarble”來從算法池中選擇一種算法,在文件“Marble.h”中保存著算法的集合。文件“Marble.h”如下圖共支持100多種算法:
函數(shù)“ChooseMarble”分為兩種情況來選擇算法。
函數(shù)“ChooseMarble”中算法選擇邏輯如下:
在函數(shù)“ChooseMarble”中會判斷局部變量“pChosenNode”是否被賦值,來判斷有無自定義混淆算法。
在選擇好混淆算法后通過調(diào)用函數(shù)“SetScrambler”來初始化算法類。在函數(shù)“SetScrambler”中通過字符串比較尋找要初始化的對象。如下圖:
2生成混淆文件
算法初始化完成后調(diào)用函數(shù)“GenerateModifiedFiles”來生成混淆的文件。函數(shù)函數(shù)“GenerateModifiedFiles”首先會遞歸遍歷目標(biāo)文件夾(需要混淆的工程),然后尋找.c、.cpp和.h擴(kuò)展名的文件。找到源碼文件后調(diào)用函數(shù)“ProcessFile”對文件做混淆運(yùn)算。具體流程如下:
如果在遍歷過程中遇到了文件夾,則遞歸調(diào)用此函數(shù)。
如果是文件的話,觀察其后綴名,程序的混淆對象是c和c++的工程,如果屬于這種工程的代碼,則進(jìn)行混淆,并排除所有匹配“Marble.*”文件。
在找到符合規(guī)則的文件后調(diào)用函數(shù)“ProcessFile”對文件進(jìn)行混淆。這個函數(shù)會搜索文件中所有包含“ARBLE”的關(guān)鍵字,來尋找要混淆的字符串。
關(guān)鍵字“ARBLE”其實(shí)是CIA自定義的一種數(shù)據(jù)類型的后綴。這個類型的聲明在文件“Marble.h”中。
函數(shù)“ProcessFile”中尋找到關(guān)鍵字“ARBLE”后會判斷關(guān)鍵字前面一個字符來判斷是否是自定義的數(shù)據(jù)類型。只有自定義的“WARBLE”和“CARBLE”數(shù)據(jù)類型中的值才會被混淆,而“BARBLE”則未處理。
函數(shù)“ProcessFile”使用 “EDG”的庫函數(shù)“MISCMemorySearch_NSS::FindIndexOfSequenceInMemory”來尋找關(guān)鍵字。
當(dāng)在被混淆程序的代碼中找到一個需要被混淆的字符串定義后,就將這個字符串加入到一個待混淆字符串列表中,并繼續(xù)尋找下一個待混淆字符串。
同時,我們還會對被混淆的源文件生成一個后綴名為.Marble的副本用于后續(xù)處理。
之后,對待混淆字符串列表做循環(huán)。
While循環(huán)中首先定位每個待混淆字符串的內(nèi)容并賦值給pNode。
接著程序會根據(jù)開始選擇的算法對字符串進(jìn)行加密處理,并將其保存到一塊臨時內(nèi)存中。
當(dāng)沒有需要加密的字符串時,再將這塊臨時內(nèi)存寫回文件。
這就是整個混淆文件生成過程。加密前后數(shù)據(jù)對比。混淆前:
混淆后:
混淆后的文件中寫入了反混淆算法和密鑰,使用這個字符串時會通過解密算法還原出字符串的內(nèi)容然后再使用。
3生成報告
當(dāng)所有的混淆工作都完成后會使用函數(shù)“GenerateReceipt”生成xml格式的混淆報告。這個文件保存在設(shè)置的輸出目錄中,文件名為“MarbleReceipt.xml”。
在這個文件中記錄了混淆的算法、被混淆的文件和被混淆的字符串等信息。
Mender和Validator
Mender程序是專門用于將混淆后的源代碼還原用的程序,該程序在還原過程中使用到了mibster生成的*.Marble文件,其做法是遍歷被混淆的目標(biāo)工程文件夾,當(dāng)遇到*.Marble文件時,就將其中的全部內(nèi)容拷貝給相應(yīng)的被混淆的文件。
Validator是Marble框架中用來檢測混淆是否被正確使用的程序,該程序用mibster產(chǎn)生的receipt來驗(yàn)證混淆的字符串是否正確的被生成到Binary中。其過程也并不復(fù)雜,首先通過msxml16庫來讀取receipt中的信息(主要是OriginalHex,即被混淆的字符串的hex信息),并將其處理后賦值給描述字符串的節(jié)點(diǎn)中并鏈入鏈表。
接著讀取生成的文件,并循環(huán)遍歷字符串鏈表,看鏈表中的每一條字符串是否都出現(xiàn)在了生成文件中。
總結(jié)
CIA的“Marble”只是靜態(tài)的對指定字符串做了簡單的混淆,在研究人員做靜態(tài)分析的時候會加大分析人員的工作量。在動態(tài)分析的時候由于會調(diào)用解密函數(shù)所以作用不是很大。雖然算法池中算法很多,但是加密強(qiáng)度不高,調(diào)用解密函數(shù)可以較容易還原出原文。