【入門篇】靜態混淆與動態混淆
混淆
目前軟體反分析技術的主要手段是混淆,根據是保護的階段不同可以將軟體保護分為,在編譯器編譯之前的基於源代碼的混淆和編譯之後的基於二進位機器碼的混淆。前者的特點和優勢是自由度高、針對性強,比如白盒加密就是一種對特定演算法(加密演算法)的混淆技術,但其缺點也非常明顯:一是適用範圍有限,因為必須取得程序源碼,二是其對於機器碼的混淆能力有限。基於二進位機器碼的保護技術可以對大部分二進位程序進行保護,適用範圍廣、靈活性高,但實現難度高,主要難點在於如何確保二進位代碼反彙編的正確性、如何對可執行文件進行重構、平衡保護強度和開銷等。
靜態混淆
根據保護時是否需要運行程序,軟體分析技術主要包括靜態分析和動態分析,所謂的靜態分析是在不運行代碼的情況下,對代碼的靜態特徵和功能模塊進行分析的方法。靜態分析代碼的優勢在於它能描繪程序的輪廓,包括控制流和數據結構。
靜態分析對應的保護方法就是靜態混淆。靜態混淆技術主要可以分為混淆控制流和混淆數據結構兩大類。靜態混淆在JAVA、.NET等虛擬機語言上起到很好的效果,由於這類代碼並不是被編譯成二進位機器碼,而是以中間代碼的形式在運行時環境中被解釋執行,而這種中間碼非常容易被逆向,所以不得不進行混淆。類似的還有對Javascript等腳本語言的混淆保護,這類保護方案都是在源碼的基礎上進行的。
對二進位文件的典型的靜態控制流混淆方法包括花指令、控制流平面化等。典型的數據結構混淆方法包括合併和拆分類和結構體,隱藏虛表等。
另外有些被加密打包的程序,即所謂的加殼程序,其實在嚴格意義上講並不屬於靜態混淆,但其也能一定程度上抵抗靜態分析。
動態混淆
動態分析是通過在可控環境中運行代碼,全程監控代碼的所有操作,觀察其狀態和執行流程的變化,獲得執行過程中的各種數據的分析方法。常用的動態分析方法有:調試、剖分、跟蹤、模擬器等。動態分析框架相比於動態分析的優勢就是可以跟蹤並觀察每一步的狀態,從而獲取更多的信息。但動態分析也有自身的不足,比如嚴重依賴程序的輸入,必須構造良好的測試環境才能保證需要分析的代碼正確執行。另外,許多經過保護的程序可以偵測到自己被調試或者在虛擬機運行,從而啟動防禦機制。
動態混淆技術在實現上主要包括自修改代碼技術和虛擬機保護技術。
自修改代碼技術是程序運行期間修改或產生代碼的一種機制,其主要利用了馮羅伊曼體系結構的存儲程序的特點,即指令和數據存儲在同一個內存空間中,因此指令可以被視作數據被其他指令讀取和修改。程序在運行時向代碼段中寫數據,並且寫入的數據被作為指令執行,達到自我修改的效果。自修改保護機制可以有效抵禦靜態逆向分析而且由於代碼僅在需要時才以明文的形式出現,可以在一定程度上阻礙逆向工具獲取程序所有的明文代碼,從而抵抗動態分析。
虛擬機保護其實也屬於自修改代碼的一種,但是由於其保護強度高,逐漸成為研究的熱點,從而自成體系。虛擬機保護與傳統自修改代碼技術的最主要區別是虛擬機增加了一層自定義的指令集,而且其難以逆向,破解者想要獲得程序源碼,首先必須弄懂虛擬機的指令集,這極大增加了逆向的開銷。虛擬機保護技術通過增加複雜度和在時間和空間上開銷,獲取了更高的保護強度。
小結
泛泛地說說混淆技術其實沒什麼神秘的,原理都很簡單。個人認為軟體保護技術本身主要是工程問題,而且充滿著權衡。效率與開銷、時間與空間,都是不可兼得的,所以需要根據具體情況選擇適合的保護方法。
版權聲明:允許轉載,須全文轉載並註明原文鏈接
推薦閱讀: