最詳細Python批量字典暴力破解zip密碼
阿新 • • 發佈:2020-12-11
## 工具破解
前兩天在網上下來了一波專案案例,結果全是加密的壓縮包,於是去網上找了一個壓縮包破解的工具
苦於工具破解太慢,一個壓縮包要好久,解壓了三個之後就放棄了,準備另尋他法
## 密碼字典
巧的是破解的三個都是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