Mathematics Malware Detected Tools
重要:由於缺少測試數據,部分結論可能不正確。更多更准確的結論,還需要進行大量實驗。
概述
mmdt(Mathematics Malware Detected Tools)是一款基於數學方法的最簡單的類“機器學習”工具。該工具通過數學方法對目標對象進行處理,生成相應的標准“指紋”,通過對指紋的處理,實現“機器學習”中的“分類”、“聚類”方法。
並在此基礎上,從“分類”衍生出惡意代碼檢測功能,從“聚類”衍生出惡意代碼同源樣本挖掘功能。
備注:
- 對該工具而言,分類、聚類之間唯一的區別是有無已知標簽,除此之外完全一樣。
- 這里“分聚類”的意思已經幾乎等價於機器學習中的分聚類,類似的,分類需要有已知的訓練集,聚類則不需要。
工具特點
工具特點如下:
- 還原最古老、原始、簡單的機器學習過程,
- 實現從數據到信息的轉換,適用於最真實的大數據場景
- 檢測過程高效、快捷,支持多級索引,實現毫秒級處理
- 單機模式對百萬級數量的特征實現毫秒級的檢索、匹配
- 實現100%“見過即可查”,將檢出問題簡單轉化為數據問題,數據越多,檢出越多
- 不用擔心數據災難,維度災難等問題。
- 支持幾乎所有文件格式
工具目的
可參考著名工具ssdeep的目的及意義。
該工具相對於ssdeep的優勢:
- 處理結果的記憶屬性:提供處理結果存儲功能,實現對歷史數據的回溯。
- 對大數據的支持:單機版支持百萬級別的特征數量,100萬條特征所占磁盤空間不足100M。
- 快速高效的匹配:增加多級索引模式,支持更高效快速的檢索、匹配。
- 完整的使用流程:傻瓜式的適用方式,類似於常規機器學習過程,設置標簽,配置參數,提供訓練集,即可以自動化的生成最小規則庫(機器學習中的最小模型)
- 智能的學習過程:學習結果實時反饋,避免重復學習。
原理概要
通過壓縮算法對文件進行縮放,生成標准文件、使用哈希函數對標准文件進行處理,得到“分片”哈希(指紋)。詳細內容參見后續論文(撰寫論文中)。
(原理不夠,表情包湊。
在完全一樣的約束條件下,能推論出一個特解。我的狀態:
弱化(減少)約束條件之后,面對新的數學問題時,我的狀態:
在群里請教大佬數學問題時,我的狀態:
配置參數說明
main.ini
主配置文件,用於配置執行相關功能時的參數選項。
[version]
auto-add=0 // function-type=3時生效,用於分類“訓練模型”時(是否自動更新模型)0:不更新,非0:更新
auto-move=0 // 用於聚類時是否移動文件,0:不移動,非0:移動
function-type=3 // 選擇功能,2:相似度計算比較,3:分類訓練/掃描,4:聚類
normalization-standar=100 // 歸一化標准,默認100
scan-level=10 // 掃描覆蓋率,取值在[0, 5]之間時越大覆蓋率越高,准確性越低,其他值為默認掃描,覆蓋率最低,准確性最高
first-level=60 // 方式1的准確度,取值在[0, 100]之間,越低越准確,覆蓋率越低
second-level=50 // 方式2的准確度,取值在[0, 100]之間,越低越准確,覆蓋率越低
accury-level=3 // 計算相似度方式,取值為1、3,取值為1時使用低精度方式,取值為3時使用高精度方式
thresold=0.5 // 判定閾值
classify-id=-1 // 分類“訓練模型”是生效,需要給定當前這批文件的標簽
max-cluster-number=1000 //支持最大聚類數量
max-file-size=20971520 //支持最大處理文件大小20M,超過的截斷處理
rule-file=rule.db // 規則庫(模型存儲)
label-file=classify-label.ini // 標簽配置文件
classify-label.ini
標簽配置文件,用於分類(掃描)時,將id轉成對應的字符串,節約存儲空間。詳細使用參考使用場景
[version]
version=1.0.0
[owner]
name=mmdt
[label_name]
-1=Unknown // id: -1 保留值,映射為 Unknown
0=Clean // id: 0 保留值,映射為 Clean
1=Sality // id: 1 自增,映射為 Sality(病毒名)
... // 后續依次自增
cmd參數
參數意義見main.ini
Version: 1.0.0
Options:
--help, -h,show help info.
--auto-add, -a,auto add rule.
--auto-move, -b,auto move cluster.
--function-type, -f,function type.
--normalization-standard, -n,normalization standard.
--scan-level, -l,scan level.
--first-level, -d,first level.
--second-level, -e,second level.
--classify-id, -j,classify id.
--thresold, -p,thresold value.
--compare-file, -c,comare file.
--max-cluster-number, -m,max cluster number.
--ini-file, -i,ini file
--label-file, -o,label file
--rule-file, -r,rule file
--target, -t,target
使用場景
本段落主要說明工具的用法以及怎么用。不同的使用場景需要配置不同的參數。
目前考慮到使用場景具體包括:
- 分類場景,惡意代碼檢測
- 聚類場景,自動同源性的化惡意代碼挖掘
- 相似度計算場景,如計算可執行文件相似度、計算源代碼相似度、計算webshell相似度、計算宏代碼相似度、計算圖片相似度
分類場景
生成特征庫(模型“訓練”)
對有標簽樣本提取特征,生成指紋,融入特征庫。
執行命令如下:
./mmdt -f 3 -a 1 -j 1 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Sality/
./mmdt -f 3 -a 1 -j 2 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Berbew/
./mmdt -f 3 -a 1 -j 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Gandcrab/
- ...(依次對其他文件夾進行處理,生成庫文件[“模型”])
-f: 3表示采用掃描/訓練模式
-a: 1表示自動存儲滿足條件的指紋
-j: 1表示標簽id
-r: 特征庫文名稱
-o: 標簽文件
-t: 目標對象,可以是單個文件,也可以是目錄(目錄必須帶上最后的斜桿)
可執行文件檢測
執行命令:
./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Wabot/
./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Gandcrab/
輸出檢出情況。
total number: 表示一共掃描的文件個數
scanned number: 表示本工具能處理的文件個數
can't recognize number: 表示本公舉不能處理的文件個數
add rule number: 表示添加的規則數
total classify number: 表示能識別的文件總數
checkout classify ratio: 表示識別率
total run : 表示本次程序執行時間
非可執行文件檢測(與PE文件檢測完全一致)
執行命令:
- 掃描宏:
./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/Macros/
- 掃描11882漏洞利用:
./mmdt -f 3 -r rule.db -o classify-label.ini -t /Users/ddvv/gitcode/mmdt/tmp/test/CVE-2017-11882/
聚類場景
惡意代碼聚類
對51個文件,共計9個大類進行聚類,執行命令:
- 聚類,並將同類移動到同一個文件夾下:
./mmdt -f 4 -b 1 -m 1000 -t /Users/ddvv/gitcode/mmdt/tmp/test/All/
-f: 4表示采用聚類模式
-b: 1表示自動移動同源文件到相同目錄
-m: 表示本次聚類支持的最大類別數量
-t: 目標對象,可以是單個文件,也可以是目錄(目錄必須帶上最后的斜桿)
結果如下:
51個樣本聚類數量29類。從截圖信息可以看出,mmdt_000是CVE-2018-0802類型,共計8個樣本
相似度計算場景
用於計算文件間的相似度。
惡意文件相似度計算
計算Gandcrab_2和其他文件之間的相似度,執行命令:
./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/Gandcrab/Gandcrab_2 -t /Users/ddvv/gitcode/mmdt/tmp/test/All/
-f: 2表示采用計算相似度模式
-c: 表示比較的目標對象(只能是文件,不能是文件夾)
-t: 表示目標對象,可以是單個文件,也可以是目錄(目錄必須帶上最后的斜桿)
結果如下:
...
計算CVE-2018-0802_1和其他文件之間的相似度:執行命令:
./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/CVE-2018-0802/CVE-2018-0802_1 -t /Users/ddvv/gitcode/mmdt/tmp/test/All/
結果如下:
源代碼相似度計算
對ssdeep中不同commit間的engine.cpp源碼進行相似度計算,原始差異如下圖:
執行命令(歸一化標准設置為500),
./mmdt -f 2 -n 500 -c /Users/ddvv/gitcode/mmdt/tmp/test/source/engine_new.cpp -t /Users/ddvv/gitcode/mmdt/tmp/test/source/engine_old.cpp
相似度計算結果如下:
webshell相似度計算
對webshell進行相似度計算,原始差異如下圖:
執行命令(歸一化標准設置為默認100),
./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/webshell/php1 -t /Users/ddvv/gitcode/mmdt/tmp/test/webshell/
相似度計算結果如下:
宏代碼相似度計算
對宏代碼進行相似度計算,原始差異如下圖:
執行命令(歸一化標准設置為默認100),
./mmdt -f 2 -c /Users/ddvv/gitcode/mmdt/tmp/test/Macros/Macros_3 -t /Users/ddvv/gitcode/mmdt/tmp/test/Macros/
相似度計算結果如下:
其他使用場景
通過一些參數優化等方式,有可能也能利用在相似圖像查找上面。
原圖如下:
執行命令(歸一化標准設置為210),
./mmdt -f 2 -k 3 -n 210 -c /Users/ddvv/gitcode/mmdt/tmp/test/Img/img1.jpeg -t /Users/ddvv/gitcode/mmdt/tmp/test/Img/
相似度計算結果如下:
惡意代碼檢測
對314個惡意樣本使用同一參數(見main.ini文件),進行測試統計(樣本來源參考malware-samples和APT-Sample)。
標簽名 | 樣本數量 | 規則數量 | 規則/樣本數量比率 |
---|---|---|---|
Clean | 5 | 4 | 0.800 |
Sality | 3 | 2 | 0.667 |
Berbew | 4 | 4 | 1.000 |
Gandcrab | 6 | 3 | 0.500 |
Malex | 3 | 1 | 0.333 |
Wabot | 3 | 3 | 1.000 |
CVE-2017-11882 | 7 | 5 | 0.714 |
CVE-2018-0802 | 16 | 4 | 0.250 |
Macros | 4 | 3 | 0.750 |
Malware | 78 | 71 | 0.910 |
APT | 185 | 171 | 0.924 |
總計 | 314 | 271 | 0.863 |
RS比率=規則/樣本數量比率
可推導出的結論包括:
- RS比率越低表示識別效果越好
- RS比率與惡意樣本類型相關
- RS比率高低與配置參數相關
- 放大數據集,RS比率會降低
其他
為什么不開源代碼?
主要還是如下兩個原因:
- code水平很差,代碼太丑,暫時不好意思開源
- 這個工具是論文的驗證demo,需要完成論文后,才方便開源
為什么提供該工具?
出於兩方面的原因考慮:
- 主要希望能換取更多的合法數據(樣本),進行測試
- 次之希望有大佬能提供測試結果,能引用到論文中。
未來是否對這個工具的改進?
會。比如考慮支持以下一些場景和功能:
- 結合動態技術,對內存做運算,生成指紋,進行匹配
- 增加C/S,B/S模式,增加緩存機制,以支持更大數據集提供更好的特征子集
- 智能配置文檔生成,更優支持更多的文件類型
Github地址
Github -- ddvv
壓縮包解壓碼
解壓碼:mmdt