成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

機器學習在惡意軟件檢測中的應用

人工智能 機器學習
機器學習是計算機科學的一個分支學科,目的在于賦予計算機從數據中學習的能力,使計算機能夠有效利用當今互聯網中存在的PB量級的數據,為人們在決策制定、任務執行方面提供幫助支持,這些工作對人們而言復雜度很高且耗時巨大。

 [[188537]]

一、前言

機器學習是計算機科學的一個分支學科,目的在于賦予計算機從數據中學習的能力,使計算機能夠有效利用當今互聯網中存在的PB量級的數據,為人們在決策制定、任務執行方面提供幫助支持,這些工作對人們而言復雜度很高且耗時巨大。

惡意軟件是企業和用戶每天面臨的緊迫威脅。無論是釣魚郵件還是通過瀏覽器直接投放的漏洞利用工具,這些惡意軟件可以與多種規避技術和其他安全漏洞相結合,將現有的防御系統遠遠拋在腦后。諸如Veil、Shelter等惡意軟件框架已經被專業人士用于滲透測試中,取得了非常不錯的效果。

今天我將向讀者介紹機器學習如何在不使用特征值檢測和行為分析方法前提下來檢測惡意應用。

順便提一句,像CylanceProtect、SentinelOne、Carbon Black之類的安全產品在特征值檢測和行為分析方面做了很多工作,本文介紹的惡意軟件檢測框架不會涉及這些產品所使用的這兩類技術。

二、機器學習簡介

機器學習這個分支學科融合了數學中的多個領域,主要包括統計學、概率論、線性代數以及數學計算(如算法、數據處理、數值計算)。機器學習能夠深入挖掘大數據價值,被廣泛用于欺詐檢測、垃圾郵件檢測、電影推薦、飲食及產品購買推薦等各方面。亞馬遜、Facebook以及Google等數百家公司也使用機器學習來改進他們的產品及服務。

機器學習主要方法有兩種:有監督學習(supervised learning)和無監督學習(unsupervised learning)。有監督學習中,我們要處理的數據已事先打上標簽,無監督學習則與之相反。兩種方法都可以用于惡意軟件檢測,但我們主要關注第一種方法,因為我們的目標是對文件進行歸類。

分類(classification)是有監督學習的一個子域,分類對象可以是二進制文件(惡意或非惡意軟件)或其他類型對象(阿貓、阿狗、阿豬等等),因此惡意軟件檢測屬于二進制文件分類范疇。

機器學習的詳細介紹不在本文范圍內,你可以通過多種渠道了解詳細信息,也可以查看附錄中的資源來深入學習。

三、問題集

機器學習的工作流程包括定義問題、收集數據、整理數據(使數據符合訓練要求)、使用算法處理數據。這一系列步驟需要消耗大量資源,因此對普通人而言,機器學習在具體實現上較為困難。這些步驟稱之為機器學習的工作流程,也是機器學習所需的最少步驟。

對于本文設定的場景,我們首先需要定義工作流程:

1、首先,我們需要收集惡意軟件樣本,剔除大小小于10k的那些樣本。樣本數量越多越好。

2、其次,我們需要從樣本中提取有意義的特征,這些特征也是我們研究的基礎。所謂的特征指的就是能夠描述對象的那些屬性,比如,一棟房子的特征包括:房間數、房屋面積、房屋價格等。

3、提取特征后,我們需要對樣本進行處理,構建樣本數據集。數據集可以是一個數據庫文件或一個CSV文件,以便于轉化為數據向量,因為機器學習算法的計算對象是向量。

4、最后,我們需要一個衡量指標來評價二進制文件的分類結果。有多種指標可以用來衡量算法的性能,如ROC(Receiver Operating Characteristic,試者工作特征)、AUC(Area Under roc Curve,ROC曲線下面積)、混淆矩陣(Confusion Matrix)等。這里我們使用的是混淆矩陣指標,因為它能夠反應結果的正確比率以及假陽性比率、假陰性比例。

四、收集樣本以及特征提取

本文假設讀者已經了解PE文件格式的相關知識,或者讀者也可以先從這里學習基礎知識。收集樣本非常簡單,你可以使用付費服務(如VirusTotal)或者使用這個鏈接中的樣本源。

現在我們開始討論建模問題。

為了讓我們的算法能夠從輸入的數據中學習,我們需要清理數據,使之整潔且易于理解。本文中,我們使用12個特征來訓練算法,這12個特征提取自樣本文件,保存在CSV文件中。

(一)特征提取

我們使用pefile提取樣本特征。首先是使用python下載pefile,命令如下:

  1. pip install pefile 

工具準備完畢,在開始寫代碼前,我們先討論一下我們到底需要提取哪些特征。對于一個PE文件來說,我們關心的主要是以下幾個特征字段:

1、主映像版本(Major Image Version):表示應用程序的主版本號。對于4.0版本的Excel而言,該值為4

2、IMAGE_DATA_DIRECTORY的虛擬地址以及大小

3、操作系統版本

4、導入地址表(Import Address Table)地址

5、資源區大小

6、區段個數

7、鏈接器版本

8、保留棧大小

9、DLL屬性值

10、導出表大小和地址

為了使代碼結構更為清晰,我們使用類對象來表示PE文件信息,類結構如下所示:

  1. import os 
  2. import pefile 
  3. class PEFile: 
  4. def __init__(self, filename): 
  5. self.pe = pefile.PE(filename, fast_load=True
  6. self.filename = filename 
  7. self.DebugSize = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[6].Size 
  8. self.DebugRVA =self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[6].VirtualAddress 
  9. self.ImageVersion = self.pe.OPTIONAL_HEADER.MajorImageVersion 
  10. self.OSVersion = self.pe.OPTIONAL_HEADER.MajorOperatingSystemVersion 
  11. self.ExportRVA = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[0].VirtualAddress 
  12. self.ExportSize = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[0].Size 
  13. self.IATRVA = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[12].VirtualAddress 
  14. self.ResSize = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[2].Size 
  15. self.LinkerVersion = self.pe.OPTIONAL_HEADER.MajorLinkerVersion 
  16. self.NumberOfSections = self.pe.FILE_HEADER.NumberOfSections 
  17. self.StackReserveSize =self.pe.OPTIONAL_HEADER.SizeOfStackReserve 
  18. self.Dll =self.pe.OPTIONAL_HEADER.DllCharacteristics 
  19. 現在我們寫個簡單的函數,為每個PE文件構造一個字典,字典的鍵為特征字段,其值為特征值,這樣每個樣本都可以表示為一個python字典對象。如下所示: 
  20. def Construct(self): 
  21. sample = {} 
  22. for attr, k in self.__dict__.iteritems(): 
  23. if(attr != "pe"): 
  24. sample[attr] = k 
  25. return sample 

現在我們寫個簡單的函數,為每個PE文件構造一個字典,字典的鍵為特征字段,其值為特征值,這樣每個樣本都可以表示為一個python字典對象。如下所示:

  1. def pe2vec(): 
  2.     dataset = {} 
  3. for subdir, dirs, files in os.walk(direct): 
  4. for f in files: 
  5. file_path = os.path.join(subdir, f) 
  6. try: 
  7.                 pe = pedump.PEFile(file_path) 
  8.                 dataset[str(f)] = pe.Construct() 
  9. except Exception as e: 
  10. print e 
  11. return dataset 
  12. # now that we have a dictionary let's put it in a clean csv file 
  13. def vec2csv(dataset): 
  14.     df = pd.DataFrame(dataset) 
  15.     infected = df.transpose()  # transpose to have the features as columns and samples as rows 
  16. # utf-8 is prefered  
  17.     infected.to_csv('dataset.csv', sep=',', encoding='utf-8'

接下來我們準備處理這些數據。

(二)探索數據

這不是必要步驟,但可以讓你對這些數據有直觀上的理解。

  1. import pandas as pd 
  2. import numpy as np 
  3. import matplotlib.pyplot as plt 
  4. malicious = pd.read_csv("bucket-set.csv"
  5. clean = pd.read_csv("clean-set.csv"
  6. print "Clean Files Statistics" 
  7. clean.describe() 
  8. print "Malicious Files Statistics" 
  9. malicious.describe() 

以下兩個表格分別對應了正常程序和惡意文件的統計情況:

我們可以看到這兩組數據集之間的差異,特別是前兩個特征字段,差異更為明顯。我們可以繪制一個圖表,從直觀上感受這些差異。

  1. malicious['clean'] = 0 
  2. clean['clean'] = 1 
  3. import seaborn 
  4. %matplotlib inline 
  5. fig,ax = plt.subplots() 
  6. x = malicious['IATRVA'
  7. y = malicious['clean'
  8. ax.scatter(x,y,color='r',label='Malicious'
  9. x1 = clean['IATRVA'
  10. y1 = clean['clean'
  11. ax.scatter(x1,y1,color='b',label='Cleanfiles'
  12. ax.legend(loc="right"

圖表如下:

從上圖可知,惡意軟件樣本“聚類”程度較高,而正常文件樣本稀疏分布在x軸上。接下來我們可以試著繪制其他特征的圖表,以便全面了解這些樣本數據。

分析“DebugRVA”特征:

  1. %matplotlib inline 
  2. fig,ax = plt.subplots() 
  3. x = malicious['DebugRVA'
  4. y = malicious['clean'
  5. ax.scatter(x,y,color='r',label='Malicious'
  6. x1 = clean['DebugRVA'
  7. y1 = clean['clean'
  8. ax.scatter(x1,y1,color='b',label='Cleanfiles'
  9. ax.legend(loc="right"

繪制的圖表如下;

分析“ExportSize”特征:

  1. %matplotlib inline 
  2. fig,ax = plt.subplots() 
  3. x = malicious['ExportSize'
  4. y = malicious['clean'
  5. ax.scatter(x,y,color='r',label='Malicious'
  6. x1 = clean['ExportSize'
  7. y1 = clean['clean'
  8. ax.scatter(x1,y1,color='b',label='Cleanfiles'
  9. ax.legend(loc="right"

繪制的圖表如下:

http://p9.qhimg.com/t018ba3dba619557970.png

我們所繪制的圖表越多,我們對數據的理解也越深,對數據的整體分布情況了解也越深。目前我們手上的數據集維度很低,那么問題來了,如果我們的數據集是高維度的,我們該如何處理?有很多技術可以降低數據集的維度,使“重要”特征更為突出。比如PCA和t-SNE算法可以將數據集繪制成三維甚至二維圖像。

五、機器學習在惡意軟件檢測中的應用

前面我們已經做了足夠多的統計工作,但在機器學習方面我們只做了一部分工作,如收集數據、清理及準備訓練數據。在開始機器學習前,我們先要完成以下工作。

1、首先,我們需要將兩部分數據集(Dataset)并為一個數據框(DataFrame)。

2、其次,我們需要數據框分為兩部分,第一部分用于訓練,第二部分用于測試。

3、接下來,我們將使用幾個機器學習算法,看一下結果如何。

(一)數據集準備

  1. import pandas as pd 
  2. dataset = pd.read_csv('malware-dataset.csv'
  3. ""
  4. Add this points dataset holds our data 
  5. Great let's split it into train/test and fix a random seed to keep our predictions constant 
  6. ""
  7. import numpy as np 
  8. from sklearn.model_selection import train_test_split 
  9. from sklearn.metrics import confusion_matrix 
  10. #let's import 4 algorithms we would like to test 
  11. #neural networks 
  12. from sklearn.preprocessing import StandardScaler 
  13. from sklearn.neural_network import MLPClassifier 
  14. #random forests 
  15. from sklearn.ensemble import RandomForestClassifier 
  16. ""
  17. Let's prepare our data 
  18. ""
  19. state = np.random.randint(100) 
  20. X = dataset.drop('clean',axis = 1) 
  21. y = dataset['clean'
  22. X = np.asarray(X) 
  23. y = np.asarray(y) 
  24. X = X[:,1:] 
  25. X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.1,random_state=0) 

現在我們手上有了4個大型矩陣,其中X_train和y_train將用于訓練不同的分類器,X_test用于標簽預測,y_test用于指標衡量。事實上,我們將比較X_test和y_test的預測值,以便分析算法的具體實現。

(二)算法選擇

首先來看看“Random Forests”(隨機森林)算法,該算法是“決策樹”(Decision Trees)算法的一種集成算法,核心思想是在訓練期間內創建大量分類決策樹,輸出的分類即為樣本分類的基礎模型。隨機森林算法在解決二進制文件分類問題上非常有效。

  1. #let's start with random forests 
  2. #we initiate the classifier 
  3. clf1 = RandomForestClassifier() 
  4. #training 
  5. clf1.fit(X_train,y_train) 
  6. #prediction labels for X_test 
  7. y_pred=clf1.predict(X_test) 
  8. #metrics evaluation 
  9. ""
  10. tn = True Negative a correct prediction clean predicted as clean 
  11. fp = False Positive a false alarm clean predicted as malicious 
  12. tp = True Positive a correct prediction (malicious) 
  13. fn = False Negative a malicious label predicted as clean 
  14. ""
  15. tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel() 
  16. print "TN = ",tn 
  17. print "TP = ",tp 
  18. print "FP = ",fp 
  19. print "FN = ",fn 

程序輸出為:

  1. TN = 697 
  2. TP = 745 
  3. FP = 6 
  4. FN = 4 

根據處理結果,在沒有進行參數微調和修改的情況下,我們只有6個假陽性和4個假陰性誤判,這個結果相當不錯。我們可以正確判斷697個正常文件以及745個惡意軟件,從結果上來看,我們的小型反病毒引擎效果還可以。

接下來我們試一下另一個分類器,我們建立一個簡單的神經網絡,看看它對隨機分割的處理效果如何。

根據維基百科的詞條解釋:

多層感知器(multilayer perceptron,MLP)是一種前饋人工神經網絡模型,它將輸入數據集映射為一組適當的輸出集。MLP由有向圖中的多層節點組成,每層節點都與下一層節點完全相連。除了輸入節點之外,每個節點都是具有非線性激活功能的神經元(或處理單元)。MLP使用了反向傳播(back propagation)這種監督學習技術(supervised learning technique)來訓練神經網絡。MLP是標準線性感知器的修改版,可以用來區分不能線性分離的那些數據。

從上述定義我們可知,MLP是感知器的一種廣義形式,也是深度學習方法的基本模型之一,可以用于處理廣度和深度網絡。

  1. #our usual split 
  2. X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state=0) 
  3. #This is a special process called feature engineering where we transform our data into the same scale for better predictions 
  4. scaler = StandardScaler() 
  5. scaler.fit(X_train) 
  6. X_train = scaler.transform(X_train) 
  7. X_test = scaler.transform(X_test) 
  8. #Here we build a Multi Layer Perceptron of 12 Layers for 12 Features  you can use more if you want but it will turn into a complex zoo 
  9. mlp = MLPClassifier(hidden_layer_sizes=(12,12,12,12,12,12)) 
  10. #Training the MLP on our data 
  11. mlp.fit(X_train,y_train) 
  12. predictions = mlp.predict(X_test) 
  13. #evaluating our classifier 
  14. tn, fp, fn, tp = confusion_matrix(y_test,predictions).ravel() 
  15. print "TN = ",tn 
  16. print "TP = ",tp 
  17. print "FP = ",fp 
  18. print "FN = ",fn 

程序輸出為:

  1. TN = 695 
  2. TP = 731 
  3. FP = 8 
  4. FN = 18 

看上去強大的神經網絡并不能夠識別樣本數據集中的18個惡意軟件(假陰性),這是個很嚴重的問題,試想一下如果你的殺毒軟件將勒索軟件誤判為正常程序,會對你造成什么影響?但不用過于悲觀,因為我們這個神經網絡還是非常原始的,實際上我們可以讓它更為準確,但這已經超出了本文的討論范疇。

六、總結

本文只是一篇入門文章,我想向讀者表達的是,如果我們能夠接受99%的識別率,那么惡意軟件鑒別并不是一個難以解決的問題。當然,現實生活中,構建和部署機器學習是一件費時費事的工作,需要大量知識和大量數據。本文僅僅是機器學習和人工智能(AI)如何應用于惡意軟件識別的一篇簡單文章,希望能給讀者提供學習知識的樂趣。

責任編輯:武曉燕 來源: infosecinstitute.com
相關推薦

2020-02-27 14:47:11

人工智能機器學習故障檢測

2021-04-13 09:00:00

機器學習鐵路技術

2016-01-11 10:44:38

惡意軟件惡意軟件分析

2021-11-18 14:01:25

網絡安全數據技術

2019-06-06 08:52:00

2023-02-17 10:57:17

2014-03-13 09:28:34

2022-08-29 11:12:11

惡意軟件Jackware

2021-07-21 11:25:17

機器學習?AI人工智能

2022-03-18 17:53:14

機器學習物聯網工業物聯網

2022-04-18 11:36:43

機器學習制造業人工智能

2019-01-07 10:24:41

2011-06-01 10:13:08

Android Mar惡意軟件谷歌

2020-05-13 11:10:32

安全 機器學習數據

2022-10-27 13:38:25

2021-11-02 11:48:39

深度學習惡意軟件觀察

2023-08-25 16:29:37

人工智能機器學習

2022-09-19 09:53:37

機器學習實踐

2013-10-29 15:17:41

2022-10-20 12:07:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美不卡一区二区三区 | 黄色av网站在线免费观看 | 91免费在线看 | 欧美日产国产成人免费图片 | 免费国产精品久久久久久 | 国产精品资源在线观看 | 视频在线亚洲 | 91在线资源 | 色在线免费 | 91精品久久久久久久久久小网站 | 亚州精品天堂中文字幕 | 国产在线中文字幕 | 亚洲精品乱码久久久久久蜜桃 | 91视频一区二区 | 精品国产乱码久久久久久88av | 黄网在线观看 | www.国产视频 | 日韩一区三区 | 日本理论片好看理论片 | 天天操天天射天天舔 | 精品一区二区三区电影 | 久久久网| 一区二区三区四区在线视频 | 日韩精品免费 | 天天曰夜夜 | 香蕉婷婷 | 黄视频网站在线 | 午夜日韩| 99久久精品国产一区二区三区 | 日韩在线观看中文字幕 | 夜夜精品视频 | 亚洲一区二区免费 | 久久aⅴ乱码一区二区三区 91综合网 | 操久久| 视频精品一区 | 亚洲精品视频久久 | 午夜天堂精品久久久久 | 91精品久久久久久久 | 久久不射电影网 | 亚洲在线视频 | 91精品国产91久久久久福利 |