yara是用來檢測惡意軟件的利器,yara規則由特徵字符串、特徵字節碼等元素組成,只要惡意軟件包含這些特徵元素,就說明該文件是惡意的。但一個一個文件提特徵是很耗人力的,所以業界就慢慢出現了一些出色的yara自動化提取工具,yarGen便是其中效果比較好的一個,下面,我們就通過分析該工具的源碼,來了解這類工具的原理。
項目地址爲:https://github.com/Neo23x0/yarGen
核心文件爲yarGen.py,其他的文件大多爲配置文件。
其中dbs文件夾存放着大量的db文件,這些都是白名單元素,用來過濾特徵。包含了白導出函數名、白imphash、白字節碼、白字符串。
源碼一開始就會下載更新這些db文件,並加載,後面會用到。這是個耗時且耗內存的步驟。
加載完白名單庫後,yarGen會初始化一個貝葉斯算法訓練器,用於後面機器學習。至此,初始化結束,調用processSampleDir開始提取yara規則。
processSampleDir由3個核心函數組成:parse_sample_dir、sample_string_evaluation、generate_rules,作用分別爲:提取樣本特徵、過濾特徵、聚合特徵生成yara規則。
第一個函數做了2個操作,從樣本中提取字符串,和字節碼。
extract_strings只提取6個字符以上的字符串,及包含16進制的字符串。
extract_opcodes只提取入口點所在節段的字節碼,且提取後通過\x00進行截斷,形成一組組字節碼串。
提取完特徵後,進入到sample_string_evaluation函數過濾特徵,會篩選掉出現頻率大於等於10且出現在白名單庫裏的字符串,這樣剩下的就是可疑的字符串了。
做完簡單的過濾後,開始進行高級的過濾,filter_string_set函數,這個步驟是最關鍵的。
首先,使用貝葉斯算法匹配出跟good. txt裏的字符串相似的特徵串,過濾掉。
good.txt裏的就是些白字符串,看來機器學習也沒想象中那麼難,十多行python代碼的事。
然後進入啓發式過濾,若字符串中存在一些垃圾符號,則減去相應的惡意評分。
字符串中若帶有一些可疑字符,則加上相應的惡意評分。
最後,篩選出評分較高的字符串,作爲最終的特徵串。
將每個樣本的特徵串取交集,就得到了超級特徵,即匹配多個樣本的yara規則。
最終生成的yara規則如下: