文件完整性監控是資安防禦的基石。本文介紹如何用 Python 編寫一個輕量級工具,掃描指定目錄(含子目錄)下特定副檔名的文件,計算其 SHA-1 雜湊值並輸出為 CSV 格式,便於後續比對發現竄改。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Snapper 1.2 - 文件完整性快照工具
用法: python snapper.py > snapshot.csv
作者: Sebastien SAUVAGE (改良版)
"""
import os
import sys
import hashlib
import stat
# 掃描根目錄與關注副檔名(可根據需求修改)
SCAN_ROOT = r'C:\Windows'
EXTENSIONS = {
'.exe', '.dll', '.ini', '.ocx', '.cpl', '.vxd', '.drv',
'.vbx', '.com', '.bat', '.src', '.sys', '.386', '.acm',
'.ax', '.bpl', '.bin', '.cab', '.olb', '.mpd', '.pdr', '.jar'
}
def file_sha1(filepath: str) -> str:
"""分塊計算文件 SHA-1,返回十六進制字串"""
sha1 = hashlib.sha1()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(65536), b''):
sha1.update(chunk)
return sha1.hexdigest()
def scan_directory(root: str, extensions: set) -> list:
"""遞歸掃描,返回 (路徑, 大小, SHA1) 元組列表"""
results = []
for dirpath, _, filenames in os.walk(root):
sys.stderr.write(f'Scanning {dirpath}\n')
for fname in filenames:
ext = os.path.splitext(fname)[1].lower()
if ext in extensions:
full = os.path.join(dirpath, fname)
try:
size = os.stat(full).st_size
digest = file_sha1(full)
results.append((full, size, digest))
except (OSError, IOError) as e:
sys.stderr.write(f' 無法讀取 {full}: {e}\n')
return results
def main():
sys.stderr.write('Snapper 1.2 - 文件完整性快照\n')
data = scan_directory(SCAN_ROOT, EXTENSIONS)
sys.stderr.write('排序中...\n')
data.sort(key=lambda x: x[0]) # 按路徑排序
# 輸出 CSV 標題
print('"File path","File size","SHA1"')
for path, size, sha1 in data:
# 轉義雙引號
safe_path = path.replace('"', '""')
print(f'"{safe_path}",{size},"{sha1}"')
sys.stderr.write('完成。\n')
if __name__ == '__main__':
main()
snapper.py。SCAN_ROOT 和 EXTENSIONS 適配環境。python snapper.py > baseline.csv 生成基線快照。diff 或 Excel 比對,異常條目即為可疑變更。hashlib.sha1() 換為 hashlib.sha256())提升抗碰撞強度。mtime(修改時間)欄位,快速過濾未變文件。watchdog 庫實現實時監控而非定期掃描。這個腳本雖簡單,卻是構建主機入侵檢測系統 (HIDS) 的核心組件之一。靈活運用,守護系統完整性。