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