Python使用CRC32實現(xiàn)校驗文件
CRC文件校驗是一種用于驗證文件完整性的方法,通過計算文件的CRC
值并與預先計算的CRC
校驗值進行比較,來判斷文件是否發(fā)生變化,此類功能可以用于驗證一個目錄中是否有文件發(fā)生變化,如果發(fā)生變化則我們可以將變化打印輸出,該功能可用于實現(xiàn)對特定目錄的驗證。
首先實現(xiàn)文件與目錄的遍歷功能,遞歸輸出文件或目錄,在Python
中有兩種實現(xiàn)方式,我們可以通過自帶的os.walk
函數(shù)實現(xiàn),也可以使用os.listdir
實現(xiàn),這里筆者依次封裝兩個函數(shù),函數(shù)ordinary_all_file
使用第一種方式,函數(shù)recursion_all_file
使用第二種,這兩種方式都返回_file
列表,讀者可使用列表接收輸出數(shù)據(jù)集。
import os,hashlib,time,datetime from zlib import crc32 import argparse # 遞歸版遍歷所有文件和目錄 def recursion_all_file(rootdir): _file = [] root = os.listdir(rootdir) for item in range(0,len(root)): path = os.path.join(rootdir,root[item]) if os.path.isdir(path): _file.extend(recursion_all_file(path)) if os.path.isfile(path): _file.append(path) for item in range(0,len(_file)): _file[item] = _file[item].replace("\\","/") return _file # 通過自帶OS庫中的函數(shù)實現(xiàn)的目錄遍歷 def ordinary_all_file(rootdir): _file = [] for root, dirs, files in os.walk(rootdir, topdown=False): for name in files: _file.append(os.path.join(root, name)) for name in dirs: _file.append(os.path.join(root, name)) for item in range(0,len(_file)): _file[item] = _file[item].replace("\\","/") return _file
針對計算方法此處也提供兩種,第一種Calculation_md5sum
使用hashlib
模塊內的md5()
方法計算特定文件的MD5
特征,第二種Calculation_crc32
則使用zlib
庫中的crc32
方法計算特定文件的CRC32
值,如下所示。
# 通過hashlib模塊讀取文件并計算MD5值 def Calculation_md5sum(filename): try: fp = open(filename, 'rb') md5 = hashlib.md5() while True: temp = fp.read(8096) if not temp: break md5.update(temp) fp.close() return (md5.hexdigest()) except Exception: return 0 # 計算目標CRC32 def Calculation_crc32(filename): try: with open(filename,"rb") as fp: crc = crc32(fp.read()) while True: temp = fp.read(8196) if not temp: break return crc except Exception: return 0 return 0
在主函數(shù)中,我們通過argparse
解析庫傳入?yún)?shù),并分別實現(xiàn)三個功能,其中使用dump
功能可以保存特定目錄內文件的hash
值到dump.json
文件中,其次check
功能可用于根據(jù)dump.json
中的內容檢查文件是否被改動過,最后的set
則可用于批量設置文件的時間戳,這三類功能都屬于較為常用的。
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--mode",dest="mode",help="指定需要使用的方法名稱,(set/dump/check)") parser.add_argument("-d","--dir",dest="dir",help="指定一個需要遍歷的文件目錄(非文件)") parser.add_argument("-f","--files",dest="files",help="指定一個本地快照文件,或轉儲的文件名稱") parser.add_argument("-t","--time",dest="time",help="指定需要統(tǒng)一修改的文件時間") args = parser.parse_args() # 保存快照: main.py --mode=dump -d "D:/lyshark" -f dump.json if args.mode == "dump" and args.dir and args.files: file = recursion_all_file(args.dir) fp = open(args.files,"w+") for item in file: Single = [] Single.append(Calculation_crc32(item)) Single.append(item) fp.write(str(Single) + "\n") print("[+] CRC: {} ---> 路徑: {}".format(Single[0],Single[1])) fp.close() # 檢查文件完整性: main.py --mode=check -d "D:/lyshark" -f dump.json elif args.mode == "check" and args.dir and args.files: fp = open(args.files,"r") for item in fp.readlines(): _list = eval(item) # 取出json文件里的目錄進行MD5計算 _md5 = Calculation_crc32(_list[1]) # 如果該文件的md5與數(shù)據(jù)庫中的記錄不一致,說明被修改了 if _list[0] != _md5 and _md5 != 0: print("[-] 異常文件: {}".format(_list[1])) elif _md5 == 0: print("[x] 文件丟失: {}".format(_list[1])) # 設置文件修改時間: main.py --mode=set -d "D:/lyshark" -t "2019-01-01 11:22:30" elif args.mode == "set" and args.dir and args.time: _list = ordinary_all_file(args.dir) _time = int(time.mktime(time.strptime(args.time,"%Y-%m-%d %H:%M:%S"))) for item in _list: os.utime(item,(_time, _time)) print("[+] 時間戳: {} ---> 路徑: {}".format(str(_time),item)) else: parser.print_help()
指定mode
模式為dump
用于實現(xiàn)將特定文件計算CRC
特征,并將該特征保存至dump.json
文件內,如下圖所示;
指定mode
模式為check
并指定轉存之前的dump.json
文件,則可用于驗證當前目錄下是否存在異常文件,如果文件特征值發(fā)生了變化則會提示異常文件,而如果文件被刪除或被重命名則會輸出文件丟失,如下圖所示;
指定mode
模式為set
則可實現(xiàn)對特定目錄內特定文件修改時間參數(shù),例如將d://lyshark
目錄內的文件全部重置時間戳為2019-01-01 11:22:30
則可執(zhí)行如下命令,執(zhí)行后讀者可自行觀察文件時間變化,如下圖所示;
文件與目錄遍歷功能,不僅可以用于對文件的特征掃描,還可以與fopen
等函數(shù)實現(xiàn)對特定文件內特定內容的掃描,如下是一段實現(xiàn)對文件內特定目錄的關鍵字掃描,運行后讀者通過傳入需要掃描的路徑,掃描的關鍵字,以及需要掃描文件類型即可。
import os,re import argparse def spider(script_path,script_type): final_files = [] for root, dirs, files in os.walk(script_path, topdown=False): for fi in files: dfile = os.path.join(root, fi) if dfile.endswith(script_type): final_files.append(dfile.replace("\\","/")) print("[+] 共找到了 {} 個 {} 文件".format(len(final_files),script_type)) return final_files def scanner(files_list,func): for item in files_list: fp = open(item, "r",encoding="utf-8") data = fp.readlines() for line in data: Code_line = data.index(line) + 1 Now_code = line.strip("\n") #for unsafe in ["system", "insert", "include", "eval","select \*"]: for unsafe in [func]: flag = re.findall(unsafe, Now_code) if len(flag) != 0: print("函數(shù): {} ---> 函數(shù)所在行: {} ---> 路徑: {} " .\ format(flag,Code_line,item)) if __name__ == "__main__": # 使用方式: main.py -p "D://lyshark" -w eval -t .php parser = argparse.ArgumentParser() parser.add_argument("-p","--path",dest="path",help="設置掃描路徑") parser.add_argument("-w","--word",dest="func",help="設置檢索的關鍵字") parser.add_argument("-t","--type",dest="type",default=".php",help="設置掃描文件類型,默認php") args = parser.parse_args() if args.path and args.func: ret = spider(args.path, args.type) scanner(ret, args.func) else: parser.print_help()
如下圖所示,我們通過傳入d://lyshark
以及關鍵字gumbo_normalized_tagname
并設置掃描后綴類型*.c
當程序運行后,即可輸出該目錄下所有符合條件的文件,并輸出函數(shù)所在行,這有利于我們快速跳轉并分析數(shù)據(jù)。
到此這篇關于Python使用CRC32實現(xiàn)校驗文件的文章就介紹到這了,更多相關Python CRC32校驗文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用eval函數(shù)解析和執(zhí)行字符串
在Python中,eval函數(shù)是一個非常強大的函數(shù),它可以將字符串作為代碼進行解析和執(zhí)行,本文主要介紹了如何使用eval函數(shù)解析和執(zhí)行字符串,需要的可以了解下2024-01-01Python使用SQLAlchemy模塊實現(xiàn)操作數(shù)據(jù)庫
SQLAlchemy 是用Python編程語言開發(fā)的一個開源項目,它提供了SQL工具包和ORM對象關系映射工具,使用SQLAlchemy可以實現(xiàn)高效和高性能的數(shù)據(jù)庫訪問,下面我們就來學習一下SQLAlchemy模塊的具體應用吧2023-11-11python matplotlib 畫dataframe的時間序列圖實例
今天小編就為大家分享一篇python matplotlib 畫dataframe的時間序列圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11