劉宇強, 李 軍, 范志鵬
(湖北工業大學計算機學院, 湖北 武漢 430068)
惡意代碼檢測技術主要分為兩類[1-2]:靜態的、基于代碼程序結構、控制流特征的技術和動態的、基于行為特征的技術。這些技術包括建立簽名數據庫。主要的限制是,這些技術無法檢測到一個新的惡意軟件,直到它的簽名被更新。動態技術在執行過程中會分析惡意軟件樣本。檢測惡意軟件是否類似報告樣本的行為。然而,與靜態技術相比,動態技術更為精確,因為在惡意軟件執行過程中更難掩蓋其行為。但風險是檢測和識別過程可能已經對用戶的工作造成了傷害。
近年來,許多研究人員使用機器學習[3](Machine Learning,ML)技術動態處理不斷變化的惡意軟件檢測行為。機器學習技術將一個標記的數據集作為訓練數據集,并開發一個區分惡意軟件和良性樣本行為的模型。訓練后的模型能夠對測試樣本進行分類。ML技術可以通過大量的標記訓練數據中學習并提高預測精度。
為了確定惡意代碼功能屬性并對其進行分類,研究人員探索了許多對惡意代碼檢測和識別的方法[4-5],但面對大量使用混淆技術的惡意代碼來說,傳統的分析方法都存在一定的局限性[6]。為了克服加殼加密技術的影響,將惡意代碼進行神經網絡訓練已成為了惡意代碼分類檢測的主流趨勢。分類過程主要步驟:1)預處理,將惡意代碼二進制文件進行數據預處理,構建成為符合分類器的輸入模型;2)特征選擇,不同的分類器有著不同的特征選擇方法,依次選擇特征集中影響最大的幾個特征項的特征值作為特征子集,從而構建新的特征集;3)分類器訓練與分類運算[7]。惡意軟件分類的關鍵是分類模型的選擇和訓練階段定義模型的參數。模型確定后,可以用于新數據的分類。這里選擇隨機森林模型作為分類器,因為它能夠有效地處理大型和不平衡的數據集。此外,它可以處理大量的特征,而不會過度擬合。同時,考慮到惡意程序的長度、原理、以及各種技術的應用導致其代碼千差萬別,直接導致其代碼信息很難識別,筆者提出了惡意代碼的圖像紋理信息作為特征數據,將其二進制信息理解為圖像,設計了單字節、雙字節和三字節圖像紋理,達到提取特征的目的。
灰度共生矩陣GLCM(Gray Level Co-Occurrence Matrixes)是研究圖像像素的空間相關特性的常用方法。利用灰度紋理特征來表示大規模的圖像紋理數據集可以以最小的資源占比來歸納所有的圖像,Gotlied等[8]在研究共生矩陣中研究出的一種歸納特征提取的方法,該方法后被證實對于細微紋理歸納時有良好的效果。Kancherla等[9]提出用灰度紋理特征來對惡意代碼進行分類檢測并取得了95%的準確率,在此之后研究人員逐步開始利用灰度圖像來進行惡意代碼研究。
通常,GLCM是像素距離和角度的矩陣函數,它不僅能反映亮度的分布特征,還能描述給定圖像的紋理特征??梢詾檎麄€圖像計算GLCM,也可以為像素值周圍的小窗口計算GLCM。雖然給定的圖像灰度為256,但在計算灰度共生矩陣導出的紋理特征時,圖像的灰度遠小于256。主要是由于矩陣維數較大,窗口尺寸較小,灰度共生矩陣不能很好地表示紋理,同時計算量大大增加。因此在計算灰度共生矩陣之前,需要對圖像進行直方圖化處理,以降低圖像的灰度值,圖像的灰度為8或16。給定圖像灰度共生矩陣的構造公式如下:
(1)
式(1)是對圖像上保持一定距離的像素點g1,g2之間的灰度情況進行統計,根據圖像中兩個不同像素之間的距離為d,方位關系度數為θ的兩個像素點構建聯合概率分布p(g1,g2|d,θ)。將距離d的值設置為1,θ設置為0°、45°、90°和135°
(2)
R={N(N-1)θ=0°,90°(N-1)2θ=45°,135°
通常以三個角度的聯合統計數據,就能夠歸納出原始圖像的所有特征,通過選擇其中影響最大的幾個特征作為特征值,可以在關鍵信息丟失率最低的情況下進行降維處理,GLCM算法能夠找出其相關性過大的部分進行分割,除了保存關鍵信息外,也能夠很好地剔除掉干擾混淆的部分。
根據上述過程,當角度分別為0°、45°、90°和135°時,可以計算出四個GLCM。計算結果反映了圖像的紋理特征,如角二階矩、熵、逆微分矩、慣性矩和相關性。
例如熵是對圖像信息的度量。從熵的值可以看出圖像紋理的不均勻程度或復雜程度,且CLCM散射元素越多,圖像熵的值越大。二維數組數字差異變化越大,表現出的圖像越復雜,具體公式為:
(3)
其中k為灰度圖像尺寸大小,通過對圖像當中任意像素點g1,g2構造出的灰度共生矩陣進行統計,計算出4個方向上的熵值,將所有方向結果上的值進行求和,可以還原出原始灰度圖像的特征圖像。
隨機森林算法是一種能夠對大量數據進行準確分類的新型分類技術[10]。它既可以用于故障的分類,也可以用于故障的回歸類型?;跇涞膶W習算法是機器學習和數據科學中應用最廣泛的學習方法之一。
由于隨機森林分類器建立了多個決策樹,并根據這些樹的投票結果對最終結果進行評估,從而消除了單決策樹方法中存在的過度擬合問題。合并樹的過程稱為集成方法,從每棵樹中對向量進行分類,并將其視為類的投票,然后選擇投票最多的分類器作為向量。它是以分治方法為基礎的集成模型分類器。一組個體的弱學習者可以通過這個過程共同形成一個強學習者。

圖 1 隨機森林整體模型
假設數據集T具有M個特征,n個數據。T表示為X1,Y1;X2,Y2;…;Xn,Yn。其中Xi={Ai1,Ai2,…,AiM}為M個特征值創建的第i個向量,Yi為對應向量的輸出類。通過自助法重采樣技術將原始數據集T有放回的重復抽取n個樣本,形成新的訓練集樣本Ti,新的訓練集樣本大小與原始訓練集樣本大小相同,這一步驟重復S次形成S個數據集:T1,T2,…,TS,通常隨機森林分類器使用輸入數據的2/3作為訓練集,1/3作為測試集,這一類數據稱為包外數據。對于一組在數據集Ti上被選擇的向量Xi,Yi,在進行重構數據集時,可以被重新用來創造新的數據集Tj,由于隨機采樣是通過替換完成的,任何向量Xi,Yi都可以被不同的數據集Ti選擇多次,并且存在一些從未被任何Ti選擇的向量,這種情況被稱為bagging,它基于引導聚合產生[11]。對于每個數據集Ti都會形成一個決策樹Si,通過決策樹對輸出向量Vi進行分類,最后統計V1,V2,…,Vs的輸出結果,取最大的分類結果來決定Vi的類別。
K-means聚類是一種基于相似性將數據對象分為K個簇的分塊聚類方法[12]。在算法中,必須指定集群的數量K。最初選擇K個質心。每個數據對象都被分配給包含其最近質心的簇。初始質心的選擇是隨機的。用歐幾里德距離、余弦相似性來衡量與質心和數據對象的接近程度。初始分組完成后,計算每個簇的新質心以及每個數據點到每個中心的距離。根據距離重新分配數據點。如果該點與簇的所有成員之間的距離之和不能再最小化,則將簇中的點視為質心。K-means聚類的主要目的是最小化聚類成員與其質心之間的距離之和。
假設數據集X1,X2,…,Xn中,每一個樣本Xi均為d維實向量,k-means方法就是將這n個樣本劃分到k個集合當中,其中k≤n,同時滿足劃分后的聚類平方和最小為Ks,具體公式為:
(4)
其中ui為數據集X1,X2,…,Xn中所有點的平均值。
惡意軟件中的單個操作碼與普通代碼并無太大差異,而較長的操作碼具有預測現象發生的能力。每個惡意軟件文件的二進制代碼長度不一,經過文本可視化后[3],可以看到惡意軟件代碼可以理解為由眾多的1字節16進制數構成的1維向量,數據集中最長的長度為405 248×16B,最短向量的長度為8950×16B。若直接理解為圖像,顯然圖像大小不一,帶來后續訓練和檢測的困難,因此,需要提取每個惡意軟件圖像的紋理特征,并形成統一大小的特征紋理圖像。考慮到代碼的順序性,只采用了水平方向的步長,而不考慮其他方向。
首先選擇步長1、2、3建立灰度共生矩陣。原因如下:在操作系統以及匯編指令手冊的分析中可以知道,計算機代碼中大部分由1字節、2字節、3字節指令構成,如分類1:沒有操作數的指令,指令長度為1字節 ;分類2:操作數只涉及寄存器的指令,長度為2字節;分類3:操作數涉及內存地址的指令,長度為3字節等。因此,在灰度共生矩陣中采用了1字節、2字節和3字節的灰度共生矩陣。首先分別以1字節、2字節、3字節為單位切割惡意軟件代碼行向量并做統計。通常的灰度共生矩陣考慮的是距離為d的2字節同時出現的統計,在大多數文獻中[13-14]均為2字節矩陣。對于1字節,行列坐標為0-255,統計每個字節中對應的數值出現個數。對于2字節灰度矩陣,則行代表第一字節,列代表第二字節,如:EB 3C代表EB行,3C列的值加1,直至循環遍歷整個惡意軟件代碼。其中,1字節和2字節矩陣均可形成256×256的標準輸入矩陣,1字節灰度共生矩陣為主對角對稱矩陣。以樣本文件di5lC6uMRX8hJ3BQtIVf.bytes為例,通過圖像可視化得到三個紋理圖像(圖2)。

圖 2 樣本文件不同字節紋理圖像
本文采用的數據集為微軟2015年惡意代碼分類大賽中使用的數據集,BIG2015數據集包含9個惡意家族的21 741個樣本,其中10 868個樣本為帶標簽的訓練集,其他為不帶標簽的測試集。訓練集中,每一個樣本名為一個20字符的哈希ID,以及對應的一個整數值作為家族標簽,分別為Ramnit、Lollipop、Kelihos ver3、Vundo、Simda、Tracur、Kelihos、ver1、Obfuscator.ACY和Gatak。對于每個類別,對惡意代碼圖像分別做1字節,2字節和3字節紋理提取。
在這項工作中,根據第2部分生成的灰度共生矩陣生成方法,對每個惡意代碼文件重新構成了3個256×256的共生矩陣CSV文件。并根據隨機森林分類算法,將樣本與百分比分割(80%)使用。其余20%樣本向量用作測試數據集。
T={(X1,Y1),(X2,Y2),…,(Xn,Yn)}
在隨機森林分類器訓練過程中,首先從10棵決策樹開始進行訓練,通過圖3可以看出,隨著決策樹的增加,分類準確率逐步提升,但超過30棵后,準確率在96%左右變化,不再增加。準確率隨著深度增加而逐步提高,但超過10棵后增加不明顯。通過圖4可以得出,隨機森林算法還可以評估所有變量的重要性,無需顧慮變量的多元共線性問題?,F實情況下,一個數據集中往往有成百上千個特征,如何在其中選擇對結果影響最大的那幾個特征,以此來縮減建立模型時的特征數目可以提高算法的效率。這樣的方法其實很多,比如主成分分析,lasso等等??梢酝ㄟ^計算每個特征在隨機森林中的每顆樹上做了多大的貢獻,然后取平均值,最后比較特征之間的貢獻大小。該方法通常采用基尼指數來評價奉獻率。變量重要性評分(variable importance measures)用VIM來表示,將基尼指數用Gini來表示,在分類問題中,假設有k個類,樣本點屬于第k類的概率為Pk,則概率分布的Gini指數的定義為:

圖 3 樹的數目對正確率影響

圖 4 樹的深度對正確率影響
(5)
基于圖像紋理的雙字節特征相對重要性見表1?;嵯禂翟酱?,說明該變量對代碼特征的分類重要性越高,經過實驗,本方案得出的基于代碼特征的指標重要性排序為”0000” >”BC66” >”474E” >”4E49” >”69C3”>…”0001”。由表1可知,取前600個參數就可以達到96%的累計重要性比率,因此可以進一步簡化模型,分類代碼時,無須每次計算全部的256×256個矩陣參數,而只需要計算列表中
600個參數,即可達到近似的效果。經過實驗,表格1中GLCM-RF簡化版,可以達到91%。

表1 各列重要性排序表
為了檢驗基于惡意代碼圖像紋理特征提取的效果,繼續采用KNN分類方法來驗證該特征提取方式的有效性。并將隨機森林中得到的重要性特征排序進行聚類可視化排序。由圖5可知,各個類別在這些重要的特征上表現出了較強的聚類現象。

圖 5 前2列特征聚類情況分析
由于按GLCM聚類的維數較多,達到65 536維,為了更好地的顯示結果,采用了TSNE可視化方法。TSNE是一種非線性降維算法,非常適用于高維數據降維到2維或者3維,圖6為采用默認的T分布后9類別映射到二維后的結果。每種不同的演示代表了不同的種類,可以看出,紅色和綠色的種類聚類特征明顯,其他類則較為分散。
為了比較采用GLCM后對分類算法帶來的影響,直接提取惡意代碼文件的前64K字節作為數據集,用同樣的分類方法來進行比較,通過分析統計數據可以看出,采用了圖像紋理特征提取后的分類方法均比以前有了顯著的提高,其中,GLCM-RF隨機森林方法準確率達到了96.36%,較未采用圖像特征提取的RF方法提高了約10%,對于傳統的KNN方法也有了較大的提高,分類效果明顯。

圖 6 惡意軟件分為9類并采用TSNE后的聚類顯示
表2 基于GLCM的RF與傳統KNN方法比較

方法正確率召回率KNN61.10.42GLCM-KNN77.10.68RF85.3685.69GLCM-RF96.360.96GLCM-RF(簡化版)90.20.90
本研究提出一種基于惡意代碼圖像紋理的隨機森林分類方法,這種方法的優點是能夠快速高效的識別惡意代碼。并通過隨機森林分析的特征重要性排序,可以簡化圖像特征維數,加快分類識別時間。研究結果表明,圖像紋理提取簡化了代碼維數,提高了識別準確率。