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

工具破解

前兩天在網上下來了一波項目案例,結果全是加密的壓縮包,於是去網上找了一個壓縮包破解的工具
苦於工具破解太慢,一個壓縮包要好久,解壓了三個之後就放棄了,準備另尋他法

密碼字典

巧的是破解的三個都是4位數字密碼,這讓我想到了依靠字典破解
說干就干,伸手就來
4位數字密碼字典

#生成從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」(兩個地方需更改)即可永久解決

# zipfile打開zip文件
z = zipfile.ZipFile(f'{file_path}', 'r'
# path為解壓路徑,解包後位於該路徑下
z.extractall(path=f"{root})
z.close()

在這個基礎上再加上循環密碼字典
注意:由於解壓是密碼錯誤會產生異常,這裡可以利用try except進行處理

# 獲取字典中的內容
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方法調用錯了,但是報的錯是密碼錯誤,這就讓我很迷
偶然見在一個看到一篇文章才得知
在這裡插入圖片描述

默認情況下,WinRAR在CTR模式下使用AES-256加密ZIP文件,而傳統加密是通過CRC32加密,即ZIP 2.0傳統加密演算法,雖然AES-256比ZIP 2.0傳統加密演算法安全得多,但它可能與一些舊的解壓軟兼容,而Python標準庫中的zipfile模組只支援CRC32加密的zip文件,所以不採用傳統加密方式是無法通過zipfile庫進行解壓的

已經花了這麼多心思,要是到這裡就放棄,那真的是太淦了
既然加密方式不一樣,那麼解壓軟體是怎麼做到直接解壓的呢
這裡產生了一個構想,要是能從程式碼里調用解壓軟體,那不就好辦了嗎
於是我趕緊使用絕技
在這裡插入圖片描述
成功搜索到,7z等多款解壓軟體有相關功能

調用第三方軟體命令行

配置環境變數
在這裡插入圖片描述
命令行驗證一下
在這裡插入圖片描述
奈斯,配置成功

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

會出現中文名亂碼情況,記得改下

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()

這個方法,堪稱完美
點擊下載相關程式碼,文件,工具

參考:
1.【修補程式破解】ZIP壓縮包密碼破解工具PassperforZIP_v3.6.0.1
2.python-批量解壓zip文件
3.python破解同事的壓縮包密碼
4.Python實現加密的ZIP文件解壓(密碼已知)
5.暴力破解(一)——python腳本暴力破解 加密的zip壓縮文件
6.7Z命令行詳解
7.4.python編寫ZIP壓縮文件爆破工具
8.Python中的zipfile模組使用詳解
9.Python3中zipfile模組文件名亂碼問題

Tags: