6.20 筆記法實例 (fuzzy.py)

import os

from viper.common.out import *
from viper.common.abstracts import Module
from viper.core.database import Database
from viper.core.session import __session__

try:
    import pydeep
    HAVE_PYDEEP = True
except ImportError:
    HAVE_PYDEEP = False

class Fuzzy(Module):
    cmd = 'fuzzy'
    description = 'Search for similar files through fuzzy hashing'

    def run(self):
        if not __session__.is_set():
            print_error("No session opened")
            return

        if not HAVE_PYDEEP:
            print_error("Missing dependency, install pydeep (`pip install pydeep`)")
            return

        if not __session__.file.ssdeep:
            print_error("No ssdeep hash available for opened file")
            return

        db = Database()
        samples = db.find(key='all')

        for sample in samples:
            if sample.sha256 == __session__.file.sha256:
                continue

            if not sample.ssdeep:
                continue

            score = pydeep.compare(__session__.file.ssdeep, sample.ssdeep)
            print("Match {0}%: {1}".format(score, sample.sha256))
先檢查 pydeep 是否 import 成功,
若有,則 flag HAVE_PYDEEP = True
若無,HAVE_PYDEEP = False

Class Fuzzy 繼承 Module class。

裡面就一個 function run。
run function 被呼叫後,會先用 __session__.is_set() 檢查 session 是否開啟。
若無則印出 No session opened。
接著跳出 run funtion。

接著檢查 HAVE_PYDEEP flag,
若 HAVE_PYDEEP = False,則印出 Missing dependency, install pydeep (`pip install pydeep`)
接著跳出 run function。

再來檢查 __session__.file.ssdeep 是否存在
若無,則印出 No ssdeep hash available for opened file。

通過三層檢查後,則初始化一個 db instance。
透過 db.find(key='all') 撈出所有的樣本。

接著用 for 迴圈進行比對
迴圈內,首先比對 __session_.file.sha256 是否與 sample.sha256 相等,若相等,則繼續迴圈。
也就是說,如果此 session 開啟檔案的 sha256 與資料庫中的樣本相同,則跳過並繼續迴圈。

接著,若 sample.ssdeep 不存在,也直接繼續迴圈下一輪。

迴圈內,通過兩道關卡檢查後,就用 pydeep.compare 比較 __session__.file.ssdeep 與資料庫中樣本的 ssdeep。
最後,印出資料庫中樣本的 sha256 以及比較後的分數。

Last updated

Was this helpful?