http://dy.163.com/v2/article/detail/F69G6PBT0511CJ6O.htmlphp
本篇工做依舊使用了隨機森林算法,而前一篇文章[Webshell檢測方法(三)]結合的是fastText,本篇文章結合的是梯度提高迭代決策樹算法。html
0x01 研究方法
web
在前一篇文章中,對於features的提取分爲兩大步:算法
1. 分析提取文件的靜態特徵shell
2. 利用PHP-VLD獲取文件的Opcode,利用fastText訓練文本分類器模型函數
一、靜態特徵工具
而本篇文章中所用和其類似,但有所提高,在前一篇文章的基礎上增長了以下文件的靜態特徵:post
1.數據壓縮比性能
因爲base64方式壓縮的webshell一般具備更均衡的特定字符分佈,而且每每具備更高的數據壓縮比,所以使用數據壓縮比檢測webshell,有必定的成效。3d
2.eval函數的使用
一句話木馬的重要特性即eval,通常的一句話木馬格式以下:
@eval ($_post[xxxxx])
所以一個文件的eval的數量是模型訓練的一個重要feature。
除此以外,以前的文章利用PHP-VLD提取文件Opcode,再使用fastText訓練文本分類器,而本篇文章與之不一樣:將得到的Opcode,使用Scikit-learn從中提取2種特徵:TF-IDF向量和Hash向量。
二、TF-IDF Vector
TF即Term frequency,詞頻計算公式以下:
其用來評估一個詞語在文本中出現的頻率。
IDF即inverse document frequency,逆文本頻率指數以下:
其用於評估該詞語在全部文本中是否罕見。
故此TF-IDF的主要思想是:若是某個詞或短語在一篇文章中出現的頻率TF高,而且在其餘文章中不多出現,則認爲此詞或者短語具備很好的類別區分能力,適合用來分類。
其計算方法以下:
三、Hash Vector
hash散列能夠將任意長度的數據轉換爲固定長度的數據,同時這種這種轉換一般是一對一的,咱們很難找到一樣的hash對應不一樣的數據。所以能夠利用hash做爲某個特徵向量的索引,所以無需建立大型字典,而這個剛好是TF-IDF所缺少的。
例如:特徵 i 會被hash到索引位置j:
h(i) = j
特徵 i 的詞頻表示爲φ(i),那麼公式以下:
在提取特徵結束後,實驗嘗試在僅使用6個靜態特徵和GBDT算法進行檢測,成功率已達96.9%。
對於GBDT算法,其核心是:每棵樹學的是以前全部樹結論和的殘差,即真實值-預測值。每一輪梯度boosting訓練都會減小上一輪訓練的殘差,即在梯度方向上訓練一個新的模型來下降上一輪訓練的殘差。
其優勢在於能夠有效減小feature,下降過擬合現象,而且具備更高的魯棒性,不太可能受到訓練集規模的影響。
這也是將其與隨機森林算法結合使用的一個緣由。同時爲了進一步提升效率,加入了PHP Opcode的特徵提取,和隨機森林算法:
在結合前6個靜態特徵後,實驗使用隨機森林獲取TF-IDF矩陣和hash矩陣的預測結果,最後結合8個feature對GBDT進行訓練。
0x02 數據實驗
實驗從Github收集了2232個webshell,2388 CMS樣本文件:
但因爲有些文件提取特徵不成功,或者並不是php文件,所以丟棄了大小超過20000的文件,並未使用。
然後從以下幾個角度評估了RF-GBDT算法的性能:
同時進行了一些對照實驗,結果以下:
能夠看到,若是僅用6個靜態features的GBDT在各方面的性能都不如使用8個features的RF-GBDT。除此以外,實驗中還挑選了一些網上主流的webshell檢測工具,結果以下:
這同時也證實了RF-GBDT具備很是好的性能。
本文爲 一葉飄零 原創稿件,受權嘶吼獨家發佈