1. 程式人生 > >最詳細Python批量字典暴力破解zip密碼

最詳細Python批量字典暴力破解zip密碼

## 工具破解 前兩天在網上下來了一波專案案例,結果全是加密的壓縮包,於是去網上找了一個壓縮包破解的工具 苦於工具破解太慢,一個壓縮包要好久,解壓了三個之後就放棄了,準備另尋他法 ## 密碼字典 巧的是破解的三個都是4位數字密碼,這讓我想到了依靠字典破解 說幹就幹,伸手就來 ![4位數字密碼字典](https://img-blog.csdnimg.cn/20201211141814187.png) ```python #生成從0000到9999的密碼錶 f = open('passdict4.txt','w') for id in range(10000): password = str(id).zfill(4)+'\n' f.write(password) f.close() ``` 果然猜想沒錯,破解速度的確快了不 習大大說,**科技是第一生產力,創新是引領發展的第一動力** 既然有更快速的方法,那為什麼不研究個自動的方法出來呢 ## ZipFile庫 Python有個叫ZipFile的庫可以解壓zip檔案,從其相關文件中 > ZipFile.extractall(path=None, members=None, pwd=None) > 將zip文件內的指定檔案解壓到當前目錄。 >引數path指定了解析檔案儲存的資料夾 >引數members指定要解壓的檔名稱或對應的ZipInfo物件 >引數pwd為解壓密碼。 > 只需迴圈讀取資料夾下的zip檔案然後逐個解壓即可 ==注意==:python3有一箇中文檔名亂碼的,將ZipFile.py中的“cp437”改成“gbk”(兩個地方需更改)即可永久解決 ```python # zipfile開啟zip檔案 z = zipfile.ZipFile(f'{file_path}', 'r' # path為解壓路徑,解包後位於該路徑下 z.extractall(path=f"{root}) z.close() ``` 在這個基礎上再加上迴圈密碼字典 ==注意==:由於解壓是密碼錯誤會產生異常,這裡可以利用try except進行處理 ```python # 獲取字典中的內容 passFile = open(r"D:\python\passdict4.txt") # 迴圈獲得單個密碼 for line in passFile.readlines(): # 去換行 password = line.strip('\n') try: zip_file.extractall(path=f"{root}", pwd=password.encode("utf-8")) print(password) # 密碼對了就不繼續下去了 break except: # 什麼都不做 pass zip_file.close() # 關閉檔案,必須有,釋放記憶體 ``` 這麼一通操作下來本以為大功告成,沒想到事情沒那麼簡單 大多是時候是可以破解的,但是總有些就破解失敗了,束手無策的各個網站找方法 剛開始以為是extractall方法呼叫錯了,但是報的錯是密碼錯誤,這就讓我很迷 偶然見在一個看到一篇文章才得知 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201211174744267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1YWlndWFpd2FuZ2x1bw==,size_16,color_FFFFFF,t_70) >預設情況下,WinRAR在CTR模式下使用AES-256加密ZIP檔案,而傳統加密是通過CRC32加密,即ZIP 2.0傳統加密演算法,雖然AES-256比ZIP 2.0傳統加密演算法安全得多,但它可能與一些舊的解壓軟相容,而Python標準庫中的zipfile模組只支援CRC32加密的zip檔案,所以不採用傳統加密方式是無法通過zipfile庫進行解壓的 > 已經花了這麼多心思,要是到這裡就放棄,那真的是太淦了 既然加密方式不一樣,那麼解壓軟體是怎麼做到直接解壓的呢 這裡產生了一個構想,要是能從程式碼裡呼叫解壓軟體,那不就好辦了嗎 於是我趕緊使用絕技 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201211190413584.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1YWlndWFpd2FuZ2x1bw==,size_16,color_FFFFFF,t_70) 成功搜尋到,7z等多款解壓軟體有相關功能 ## 呼叫第三方軟體命令列 配置環境變數 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201211190557681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1YWlndWFpd2FuZ2x1bw==,size_16,color_FFFFFF,t_70) 命令列驗證一下 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201211190653910.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1YWlndWFpd2FuZ2x1bw==,size_16,color_FFFFFF,t_70) 奈斯,配置成功 ```python passFile = open(r"D:\python\passdict4.txt") for line in passFile.readlines(): password = line.strip('\n') # t 測試 command='7z -p'+password+' t '+file_path child=subprocess.call(command) if(child==0): print(password) break ``` 加密方式不一樣的事情是解決了,不過人的貪慾真的是可怕 重複呼叫命令列這一閃一閃的又讓我不爽了 ## pyzipper庫(終極) 恰巧在查加密方式的時候看到有人提出 Python有個pyzipper庫可以很好的相容代替zipfile,可以讀寫AES加密的zip檔案 都走到這了,沒有撤退可言 >#安裝pyzipper >pip install pyzipper > 會出現中文名亂碼情況,記得改下 ```python f1 = open('D:\python\passdict4.txt','r') with pyzipper.AESZipFile(file_path,'r') as f: for i in f1: i = i.rstrip('\n') f.pwd = str.encode(i) try: f.extractall(path=f"{root}") print(file_path+"\t密碼是:"+i) break except Exception: pass f.close() f1.close() ``` 這個方法,堪稱完美 [點選下載相關程式碼,檔案,工具](https://download.csdn.net/download/guaiguaiwangluo/13653116) >參考: >1.[【補丁破解】ZIP壓縮包密碼破解工具PassperforZIP_v3.6.0.1](https://www.yrxitong.com/h-nd-440.html) >2.[python-批量解壓zip檔案](https://blog.csdn.net/weixin_45342712/article/details/99838186) >3.[python破解同事的壓縮包密碼](https://www.jb51.net/article/197406.htm) >4.[Python實現加密的ZIP檔案解壓(密碼已知)](https://www.cnblogs.com/kangbazi666/p/13666783.html) >5.[暴力破解(一)——python指令碼暴力破解 加密的zip壓縮檔案](https://blog.csdn.net/weixin_42350212/article/details/81430886) >6.[7Z命令列詳解](https://blog.csdn.net/earbao/article/details/51382534) >7.[4.python編寫ZIP壓縮檔案爆破工具](https://blog.csdn.net/zh_cn1/article/details/110633835) >8.[Python中的zipfile模組使用詳解](https://www.jb51.net/article/68417.htm) >9.[Python3中zipfile模組檔名亂碼問題](https://www.cnblogs.com/CN-S/p/656639