在日常工作生活中,經常用到壓縮文件,有些為了安全保密,還專門設置了密碼,如果忘記密碼要怎么破,這時暴力破解就派上了用場,本文以一個簡單的小例子,簡述如何通過Python中的zipfile模塊進行破解,僅供學習分享使用,如有不足之處,還請指正。
准備工作
在本例中,首先准備一個帶密碼的zip壓縮包,采用winrar進行壓縮,如下所示:
設置zip文件密碼,如下所示:
注意:一定要采用zip傳統加密,否則python的zipfile模塊將無法解壓成功。
破解步驟
1. 下載密碼字典
本例采用密碼字典+多線程方式進行破解,首先需要下載密碼字典,密碼字典包含常用的密碼,有多個文件,所有需要采用多線程方式,以提高破解效率。密碼字典格式如下:
2. 導入模塊文件
需要導入zipfile模塊,及多線程相關和文件目錄相關模塊,如下所示:
1 import zipfile 2 import time 3 import threading 4 import os.path 5 import os
3. 單個密碼解壓函數
通過zipfile對象的extractall可以進行解壓,解壓成功,則停止;否則,繼續。如下所示:
1 def extract(self, file, password): 2 try: 3 self.threadLock.acquire() 4 if self.is_running: 5 # password = str(password) 6 zfile = zipfile.ZipFile(file, mode='r') 7 zfile.extractall(path=".", pwd=password.encode(encoding='utf-8')) 8 print("the password is {}".format(password)) 9 end_time = time.time() 10 print('the end time is {}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))) 11 print("spend time is {}".format(end_time - self.start_time)) 12 # 成功解壓其余線程終止 13 self.is_running = False 14 zfile.close() 15 except Exception as e: 16 print('嘗試密碼:{},不對'.format(password)) 17 # print(e) 18 finally: 19 self.threadLock.release()
4. 遍歷單個密碼字典文件
遍歷單個密碼字典文件,並調用解壓函數進行解壓,如下所示:
1 def single_pwd_file(self, root, pwd_file): 2 """單個密碼本破解""" 3 file = os.path.abspath("django.zip") 4 print(file) 5 pwd_file = os.path.abspath(os.path.join(root, pwd_file)) 6 print("遍歷{}文件".format(pwd_file)) 7 try: 8 with open(pwd_file, mode='r', encoding='utf-8') as f: 9 pwd = f.readline() 10 while pwd: 11 if self.is_running: 12 self.extract(file, pwd.strip()) 13 else: 14 break 15 pwd = f.readline() 16 except Exception as e: 17 pass
5. 遍歷所有密碼字典文件
遍歷所有密碼字典文件,每一個字典文件,采用一個線程,如下所示:
1 def start(self): 2 """通過密碼本破解""" 3 self.start_time = time.time() 4 print('the start time is {}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))) 5 root = r"wpa2pojiezidian" 6 for root, dirs, files in os.walk(root, topdown=True): 7 for pwd_file in files: 8 if pwd_file.endswith('.txt') or pwd_file.endswith('.TXT'): 9 if self.is_running: 10 t = threading.Thread(target=self.single_pwd_file, args=(root, pwd_file,)) 11 t.start() 12 # t.join() 13 else: 14 break
破解示例
本例為了測試,采用的密碼比較簡單,所以破解比較快,如下所示:
源碼
為何一定要勾選傳統加密?
默認情況下,WinRAR在CTR模式下使用AES-256加密ZIP存檔。雖然AES-256比ZIP 2.0傳統加密算法安全得多,但它可能與一些較舊的解壓軟件不兼容。如果需要與這些工具兼容,可以在密碼對話框中啟用“ZIP傳統加密”選項,或在命令行模式下使用-mezl開關。
Python標准庫中的zipfile模塊僅支持CRC32加密的zip文件。
一定能暴力破解嗎?
采用密碼字典文件的方式進行破解,密碼字典只是收錄了常規的密碼,如果加密密碼正好不在密碼字典文件中,則無法破解。暴力破解,通俗的講就是逐個密碼取嘗試,有可能需要破解幾天,甚至更長時間,才可能會成功。所以技術理論上可行,但實際上可行性並不高。
備注
蘇幕遮·燎沉香
【作者】周邦彥【朝代】宋
燎沉香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽干宿雨、水面清圓,一一風荷舉。
故鄉遙,何日去。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。