ADVobfuscator開源項目分析

一、代碼混淆的定義

代碼混淆(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語言的項目,可以借鑑該開源項目的原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章