王 博,蔡弘昊,蘇 旸
(1.武警工程大學 密碼工程學院,西安 710086; 2.網絡與信息安全武警部隊重點實驗室(武警工程大學),西安 710086;3.武警工程大學 信息工程學院,西安 710086)
隨著信息技術的飛速發展,呈指數增長的惡意代碼已經成為網絡安全的主要威脅。賽門鐵克指出:2016年有4.01億份惡意代碼被發現,其中包括3.57億份新的惡意代碼變種[1]。針對當前數量龐大的惡意代碼,需要一種自動化分析方法對其進行檢測與分類,包括基于靜態分析的方法和基于動態分析的方法,但是傳統的基于特征碼的自動化分析容易被混淆技術繞過,基于動態特征的自動化分析方法(如沙箱技術)雖然對惡意代碼有較高的識別率,但是系統開銷較大,檢測速度較低,不適合于大樣本集的惡意代碼檢測。
近幾年來,由于惡意軟件的制作者開始使用標準軟件工程實踐的方法,所以惡意軟件由其他幾個代碼樣本復合而成的現象變得越來越廣泛,從而使代碼的重用變得更加普遍[2],并且,大多數惡意軟件都是復用的,并不是從零開始編寫的。2014年,賽門鐵克指出:隨著惡意軟件程序員們致力于完善現有的惡意軟件,真正新創建的惡意軟件家族的數量已經放緩,事實上,一些惡意代碼正在被重用和修改[3],所以,大部分惡意軟件的變種和母體有重復的代碼片段。
因此,有研究者利用這一特點將惡意軟件可視化。在惡意軟件的分類問題上,區別于傳統的特征提取方法,他們利用可視化后得到的圖像特征來對樣本進行分類。Yoo[4]使用自組織映射圖來檢測和可視化可執行文件中的惡意代碼,該方法假想每個惡意樣本都有其獨有的基因圖譜,同一家族樣本之間的基因圖譜是相似的,但是該方法生成的同一家族的圖譜差異較大導致錯誤分類率較高。Han等[5]通過生成圖像矩陣的方法對惡意代碼進行分類,該方法具有較高的分類準確率但不足之處是需要反匯編提取操作碼序列,預處理較復雜。任卓君等[6]提出了一種利用熵像素圖來可視化惡意代碼的方法,通過比較熵像素圖的圖像特征來對惡意代碼進行分類,缺點是對于植入大量冗余代碼的變種分類準確率較低。
Nataraj等[7]將惡意軟件樣本轉換成灰度圖,利用惡意代碼變種之間圖譜的相似性,結合圖像處理的方法對惡意軟件進行分類。該方法具有較高的識別率與較低的預處理成本,且對一般的混淆技術有一定的抵抗力。在此基礎上,Cui等[8]針對惡意代碼家族樣本數量不均勻導致的過擬合問題采用了蝙蝠算法(Bat Algorithm, BA)并結合卷積神經網絡(Convolutional Neural Network, CNN)的方法對Nataraj提出的方案作出了改進。本文在充分研究上述研究成果的基礎上提出一種可視化方法來分類惡意代碼,該方法將二進制文件轉換為彩色圖,基于VGG(Visual Geometry Group)卷積神經網絡生成惡意樣本分類模型,并采用隨機失活(Dropout)算法解決過擬合和梯度消失問題以及降低神經網絡計算開銷。與灰度圖相比,將二進制文件轉換為彩色圖能更明顯強調圖像特征,尤其是對于二進制序列中含有重復的短數據片段的文件。利用特征更明顯的訓練集,神經網絡能生成分類效果更好的分類模型。該方法實驗結果表明,該方法使用25個族的9 342個樣本進行評估,平均分類準確率達96.16%,能有效地分類惡意代碼樣本。
本文設計的基于VGG網絡的惡意代碼變種分類模型,其結構如圖1所示,主要分為三層:樣本預處理層、卷積神經網絡層和優化層。

圖1 分類模型層次結構Fig. 1 Classification model hierarchical structure
其中,樣本預處理層根據文件的二進制序列將惡意代碼二進制文件轉換為RGB(Red Green Blue)三色圖像。由于代碼復用在同一惡意家族之間普遍存在,因此屬于同一家族的惡意代碼變種之間有相同的二進制序列片段,轉換為RGB圖像后表現為具有相同或相近的條紋圖案。根據這一特點,將原始惡意代碼轉換為圖像進行分類檢測的方法是可行的,并且,由于樣本預處理只涉及到分割文件二進制序列這一個關鍵步驟,操作簡單,完全能以自動化形式快速完成,因此適用于大規模惡意樣本的快速分類等即時性要求較高的場景。
卷積神經網絡層負責將預處理得到的圖像輸入至卷積神經網絡中,通過訓練集與驗證集每一輪的訓練結果調整網絡結構的參數,最終獲得具有較高識別率的分類模型。本文以VGG網絡為基本結構,微調了輸出層的結構使其能與分類任務相匹配。
優化層負責優化卷積神經網絡的參數或結構以避免分類模型過擬合的現象。常見的優化方法有正則化以及 Dropout,本文采用Dropout的方法在訓練模型時隨機對輸出層部分節點失活處理,多輪訓練得到多個結構精簡后的“子網絡”通過取平均的作用以及減少神經元之間復雜的共適應關系達到避免過擬合的效果。采用Dropout結構的神經網絡實現簡單,并且由于輸出層每輪參與運算的節點數顯著減少,因此減少了模型的訓練時間。
惡意軟件二進制比特串可以被分割成若干長度為8比特的子串,因為8比特可以看作0~255范圍內的無符號整數,這正好和灰度值的范圍0~255對應,所以每一個子字符串都可以看作一個像素[8]。選取連續的三個8比特字符串,分別對應于彩色圖中RGB三色通道,即第一個8比特串對應R通道的值,第二個8比特串對應G通道的值,第三個8比特串對應B通道的值,然后重復這一過程直到所有的數據都被選取完畢(最末段端數據量不足24比特的,用1補足)。舉例說明,假設有一串比特串為:011011101001100111010011,那么處理過程為011011101001100111010011 → 01101110, 10011001, 11010011 → 110,153,211。一個3字節(24比特)的二進制數B=(b23,b22,b21,…,b2,b1,b0)能通過以下方法轉換為R、G、B三色通道的值:
這樣惡意軟件二進制比特串就轉換成“length×width×3”型矩陣,其中length的值根據文件大小自適應,width的值為分段區間上的定值,根據二進制文件大小而定。Nataraj等[7]中給出了一種推薦的width取值如表1所示。

表1 不同文件大小所對應的圖像寬度 Tab. 1 Image widths corresponding to different file sizes
但考慮到本文所采用的卷積神經網絡的輸入為224像素×224像素的RGB圖像,若采用表1給定的圖像寬度取值來生成惡意代碼彩色圖,則部分樣本圖像由于長寬比例差異較大,被強制縮放成224像素×224像素時圖像中的紋理圖案會被拉伸或擠壓,造成一定的失真。為避免由圖像失真帶來的可能導致識別率降低的影響,本文在生成惡意代碼彩色圖時統一按照長∶寬=1∶1生成彩色圖(圖像正方化),然后等比例地縮放至224像素×224像素大小,從而最大限度地保持了圖像中的紋理特征。圖2給出了樣本預處理的流程。
不同惡意家族之間的紋理特征是不同的。圖3展示了經圖像正方化以后25個惡意家族中的3個家族的樣本圖,從圖中可知Adialer.C家族中上部分是稀疏的彩色像素點陣,中間有一道黑色分割線,下部分是密集的彩色像素點陣接著是黑、白、黑三道條紋;C2LOP.P家族的上約3/4部分由稀疏彩色像素點陣和兩道黑色條紋組成,下方由相間的黑色條紋和一道彩色條紋組成;Swizzor.gen!I家族雖然上約3/4部分與C2LOP.P家族相似,但是其下方顏色漸變的彩色“波紋”卻是獨有的顯著特征。

圖2 樣本預處理流程Fig. 2 Flowchart of sample preprocessing

圖3 三個家族樣本經圖像正方化至224像素×224像素Fig.3 Images of three family samples squared to 224px×224px
同一家族間的樣本具有相似的紋理圖案。圖4展示了經圖像正方化后Lolyda.AA2家族中的兩個樣本圖像,從圖中可知樣本1和樣本2自上而下的紋理特征相似。

圖4 來自Lolyda.AA2家族樣本且 經圖像正方化至224像素×224像素Fig. 4 Lolyda.AA2 family samples squared to 224px×224px
根據前文所設計的策略對Malimg樣本集進行預處理后得到25個惡意家族共9 342個樣本的彩圖。相比于灰度圖,彩圖在保留了灰度圖主要特征的同時,對于二進制文件中重復出現的短數據片段具有更明顯的強調效果(這里的重復出現并不是一成不變的重復,而是指偽重復,即重復的片段后一段可以與前一段有微小差異,這樣在彩色圖中就會產生顏色漸變的圖案)。本文將使用深度學習的方法,基于VGG網絡結構[9],對分類模型進行訓練,具體細節將在第3章敘述。
VGGNet(Visual Geometry Group Net)是牛津大學計算機視覺組Visual Geometry Group和Google DeepMind公司的研究員一起研發的卷積神經網絡。VGGNet探索了卷積神經網絡的深度與其性能之間的關系,通過反復地使用3×3的小型卷積核和2×2的最大池化層,VGGNet成功地構筑了16~19層深的卷積神經網絡,并在2014年的ImageNet大型視覺識別挑戰賽(ImageNet Large Scale Visual Recognition Challenge 2014, ILSVRC 2014)中獲得定位任務第一名和分類任務第二名的優異成績[9]。
VGGNet突出貢獻在于證明使用很小的卷積(3×3),增加網絡深度可以有效提升模型的效果,而且VGGNet對其他數據集具有很好的泛化能力,因此遷移到惡意代碼可視化圖像的分類問題上,VGGNet也會擁有不錯的表現。
如圖5所示,本文采用的是基于VGG16的模型,由于樣本集大小為9 342,待分種類為25種,考慮到惡意樣本彩圖的紋理圖案復雜度較低,因此本文使用一層節點數為256的全連接(Fully Connected, FC)層“FC- 256”用以整合卷積層提取的特征。

圖5 本文采用的神經網絡結構Fig. 5 Neural network structure used in this paper
本文使用15層神經網絡(灰色部分)的原因是考慮到擴展的需要。待分類的種類與樣本總數越多,該神經網絡越能體現出分類上的優勢。
Adamax算法是基于低階矩的自適應估計的隨機目標函數的梯度優化算法。該算法實現簡單,計算效率高,內存占用低,不僅適合解決擁有大量數據或者變量的問題,而且同樣適合目標是非平穩的和擁有嚴重噪聲或者稀疏梯度的問題[10]。
由于本文設計的神經網絡的參數總量達到了1 471萬,屬于大量變量問題,同時因為采用了Dropout,Dropout后的子網絡相當于對原網絡的稀疏表示,所以選擇了Adamax作為神經網絡訓練時的優化算法。
本文所用的數據集樣本分布如圖6所示。由于各惡意家族間的樣本數分布并不均勻(比如Allaple.A家族有2 949個樣本,而kintrim.N家族只有80個樣本),如果忽略樣本之間的數量差異性對神經網絡結構不作調整,則會產生過擬合現象,造成分類準確率下降。
為此,在神經網絡的全連接層部分引入了Dropout算法,原理如圖7所示。2012年,Hinton等[11]提出Dropout。當一個復雜的前饋神經網絡被用于在小的數據集上訓練時,容易造成過擬合。為了防止過擬合,可以通過阻止特征檢測器的共同作用來提高神經網絡的性能。簡言之:在前向傳播的時候,讓某個神經元以一定的概率p激活,這樣可以使模型泛化性更強,因為它不會太依賴某些局部的特征。

圖6 本文所使用的數據集的樣本分布Fig. 6 Sample distribution of dataset used in this paper

圖7 隨機失活(Dropout)原理Fig. 7 Dropout schematic diagram

如圖9所示。圖9(a)表明一個單元在訓練時是以概率p保留的并且以權重W連接至下一層的單元,圖9(b)表明在測試時,單元總是存在的(也就是不會以概率1-p抹去一部分單元),但是為了使得測試時期望的輸出與訓練時的輸出相同,因此要將權重乘以概率p。

圖8 標準網絡和隨機失活網絡前向傳播對比Fig. 8 Comparison of forward propagation of standard and dropout network

圖9 預測模型時隨機失活的操作Fig. 9 Operation of dropout in predicting model
Dropout可以解決過擬合的原因[12]在于:
1)取平均的作用。整個Dropout過程就相當于對很多個不同的神經網絡取平均,而不同的網絡產生不同的過擬合,一些互為“反向”的擬合相互抵消就可以達到整體上減少過擬合。
2)減少神經元之間復雜的共適應關系。因為Dropout的存在導致兩個神經元不一定每次都在一個Dropout網絡中出現。這樣權值的更新不再依賴于有固定關系的隱含節點的共同作用,阻止了某些特征僅僅在其他特定特征下才有效果的情況,迫使網絡去學習更加魯棒的特征。
除此之外,使用Dropout可以大幅度減少參與每輪訓練的節點數,提高神經網絡訓練速度。
在本文實驗中,樣本集選擇的是Vision Research Lab團隊在2011年公布的Malimg數據集,它包括了25個惡意軟件家族的9 342個樣本[7]。對樣本進行預處理后,通過神經網絡框架Keras來創建和訓練CNN。實驗環境為Intel Core i7- 8750H CPU(2.20 GHz,12 CPUs)、Nvidia GeForce GTX 1060 GPU(6 GB)和16 GB RAM。
本文通過第2章所提方法將灰度圖轉換為彩色圖并進行了圖像正方化得到9 342張惡意代碼彩色圖,按照8∶2的比例劃分訓練集和驗證集,采用python語言編程并以自動化的方式執行。在神經網絡關鍵參數的設置方面,目標函數losses=categorical_crossentropy,訓練輪次epochs=200,訓練時每一批包含的樣本數batch_size=16。圖10(a)和圖10(b)分別展示了經過200輪訓練后模型在損失值(Loss)和準確率(Accuracy)指標上的表現。
圖11展示了使用默認參數時,選用不同梯度下降優化算法對模型在損失值和準確率指標上的影響。表2給出了各優化算法的默認參數取值。顯然,在4種算法當中,Adamax的表現最好,其次分別是RMSprop(Root Mean Square prop)[13]、Adagrad[14]和SGD(Stochastic Gradient Descent)[15]。原因在于Adamax算法本質上是帶有動量項的RMSprop,它利用一階和二階矩估計動態調整每個參數的學習率使得參數值的變化比較平穩;RMSprop相比Adamax沒有記錄歷史梯度均值作為動量而是僅采用了一種遞推遞減的形式來記錄歷史梯度平方和,導致早期的歷史梯度平方和會逐漸失去影響力,系數逐漸衰減;Adagrad隨著時間的累計每個參數的歷史梯度平方和會變得很大導致所有參數的學習率急劇縮小,因此采用該算法的模型隨著訓練輪數的增加,在準確率上提升速度顯著變慢;SGD由于設置了所有參數擁有相同的學習率,并且隨機以單個樣本的梯度作為整體更新方向使得更新不穩定,波動很大且某些情況下會被困在鞍點導致梯度消失,準確率不再提升。

圖10 經過200輪訓練后模型在Loss和Accuracy指標上的表現Fig.10 Performance of model on Loss and Accuracy after 200 epochs of training

圖11 使用不同算法后模型在Loss和Accuracy指標上的表現Fig.11 Performance of model on Loss and Accuracy after using different gradient descent optimization algorithms表2 優化算法相關參數的取值

Tab. 2 Values of relevant parameters of optimization algorithms
實驗結果表明,經過200輪訓練后,對于本文的來自25個樣本的9 458個樣本,利用CNN訓練出的分類器模型準確率達96.16%,相比于文獻[8]的94.50%提高了1.66個百分點。為便于說明,將文獻[8]中使用的卷積神經網絡稱為“simpleNet”,本文所采用的神經網絡稱為“ourNet”,由實驗得到圖12所示結果。圖12(a)和圖12(b)為兩種網絡在訓練集上的表現,雖然simpleNet在前15輪左右的性能表現比ourNet好,但是隨著訓練輪數的增加,ourNet在性能上超越了simpleNet。ourNet性能表現更好的原因是采用了15層的基于VGG16的神經網絡而simpleNet采取的神經網絡為簡單的5層神經網絡,從網絡結構上來看本文使用的神經網絡結構更復雜,因此能提取出更具體的圖案特征,從而達到更好的分類效果。此外,本文將灰度圖樣本處理成彩色圖樣本,加強了樣本的紋理特點,尤其是對于二進制序列中含有重復的短數據片段的樣本,因此,得到了更高的分類準確率。

圖12 本文使用不同網絡在Loss和Accuracy指標上的表現Fig.12 Performance of neural network in this paper and simple neural network on Loss and Accuracy
本文提出一種運用CNN、Adamax算法、Dropout算法等實現惡意代碼分類的可視化方法。該方法將二進制文件轉化為彩色像素圖的惡意代碼特征可視化,采用Dropout算法減少了訓練時參與的神經網絡節點數,使得生成分類模型時間開銷小,同時一定程度上解決了過擬合問題。以自動化方式處理二進制文件,操作簡單,無需事先執行代碼或者反編譯。實驗結果表明,該方法能有效分類各族代碼。本文工作的不足包括:
1)本文方法較高的分類準確率是建立在代碼復用作為軟件工程學的方法被廣泛應用于制作惡意代碼變種的基礎上的,對于重新編寫的惡意代碼具有較低的識別率;
2)本文采用的數據集樣本數過少,不能完全體現所設計的CNN結構的優勢;
3)所設計的CNN結構參數量較大。
因此,今后的工作方向為:1)結合異常行為檢測的方法實現惡意代碼的分類;2)為擴大該方法的應用范圍,下一步將考慮收集更多的樣本;3)對CNN結構作進一步優化,減少網絡中的參數量。