一、代碼混淆的定義
代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行
二、ADVobfuscator簡介
ADVobfuscator演示如何使用C ++ 11/14語言在編譯時生成混淆代碼,而無需使用任何外部工具,也無需修改編譯器。 所提出的技術僅僅依靠ISO標準化的C ++ 11/14。 它還展示瞭如何引入某種形式的隨機性來生成多態代碼,並給出了一些具體的例子,如字符串文字的加密和使用有限狀態機的調用混淆。
三、ADVobfuscator實例分析
1. 字符串混淆
將要混淆的字符串作爲定義的宏的參數。項目提供了兩種方式來混淆字符串。
第一種,聲明和使用在同一階段:
OBFUSCATED宏先對該字符串的每個字符按照生成的隨機數進行加密,對字符串進行了替代(保證每個字符串加密使用了不同的密鑰,否則,一個簡單地逆向工程解密就可以破解所有的字符串),然後解密該加密後的字符串,還原成原來的字符串。
第二種,聲明和使用在不同階段:
DEF_OBFUSCATED宏通過同樣的方法對字符串進行加密,賦值給auto類型的變量,使用的時候再解密該變量來達到目的。
效果:
通過 strings 命令來查看編譯生成的程序,只能看到一個明文字符串
2. 函數混淆
對函數的調用通過有限狀態機來實現,增加了逆向工程的複雜性。
該實例爲有無返回值的兩種函數提供了不同的宏來混淆。
由上圖可以看到,通過有限狀態機的方式來調用函數的同時,把函數的字符串參數也進行了混淆。
該混淆方式的原理是,實現一個有限狀態機,將要調用的函數作爲最後的處理事件,通過5次狀態的轉移,最終也實現了函數調用,並返回結果。
該開源項目只是做了一個原理展示,將函數調用直接放在了狀態機的最後,真正要用到工程中,需要將函數調用放在狀態機的某個狀態中,並且通過特定的計算或事件去觸發調用它。
3. 條件(調試檢測)混淆
該功能原理與函數調用混淆大致一樣,只是在此基礎上增加了條件判斷。
該實例的目的是將代碼中重要的函數進行條件混淆,這裏的條件判斷爲是否處於debug模式下。如果檢測到處於debug模式下,則不會執行函數調用(混淆的方式調用),這樣保護了某些比較重要的函數不能輕鬆地被逆向工程破解。
可以看到,OBFUSCATED_CALL_P0宏的參數爲條件和函數。
總結
ADVobfuscator是用於C++項目的代碼混淆工具,對於大型項目需要手動改變對字符串的聲明和對函數的調用等,工程量比較大(代碼級的混淆都是這樣,需要將源碼替換爲混淆的方式)。如需要應用在wine上,直接移植不太可能(大量運用了C++中特有的模板,庫等),需要重新創建服務於C語言的項目,可以借鑑該開源項目的原理。