文章目錄
1. 軟件下載
mac、linux和win32用戶請參考打包教程使用源代碼打包。
2. 破解測試

3. 文件說明
run.exe:壓縮包密碼破解軟件,支持zip和rar格式pwd.txt:包含所有3位數的密碼字典,從000到999res.txt:破解成功后保存密碼的文件999.rar:加密的rar壓縮包,加密密碼是:999,里面的內容是一張圖片999.zip:加密的zip壓縮包,加密密碼是:999,里面的內容是個txt文件run.py:python源碼UnRAR64.dll:rar解壓依賴庫文件app.ico:軟件圖標gan.py:生成密碼字典的代碼readme.md:項目說明文件
4. 項目簡介
這是一個基於python開發的壓縮包密碼破解軟件,利用多線程技術高速地讀取密碼字典並對壓縮包嘗試破解。
5. 項目地址
github: https://github.com/XavierJiezou/python-compression-crack
6. 破解思路
壓縮包加密算法基本上都是不可逆的,即我們不能在算法層面上推理出它的明文。所以我們只能用窮舉法不斷的碰撞,大白話就是隨機生成很多密碼,然后一個一個的試。具體思路如下:

7. 開發環境
我們用到的模塊有:
from unrar.rarfile import RarFile
import concurrent.futures as cf
from zipfile import ZipFile
import time
import os
os、time、zipfile和concurrent.futures都是python內置模塊,無需安裝。
unrar是第三方模塊,可以通過pip指令安裝:
pip install unrar
根據pypi官網可知,安裝后還需要配置一下庫文件才能正常使用:

具體配置教程如下:(windows)
1、下載庫文件的壓縮包
2、選擇解壓路徑D:\Program Files (x86)\UnrarDLL,點擊Install解壓

3、解壓后的主要目錄結構如下:
D:\Program Files (x86)\UnrarDLL
├─Documentation
├─Examples
├─NoCrypt
├─Examples
└─x64
│ └─UnRAR64.lib
├─UnRAR.lib
4、配置系統環境變量。變量名必須是:UNRAR_LIB_PATH,變量值:D:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll(如果你是win32系統,變量值:D:\Program Files (x86)\UnrarDLL\UnRAR.dll)

5、配置完成后,記得點擊確定保存,然后重啟代碼編輯器vscode或pycharm,不重啟不會生效的!
順便一提:
解壓rar文件時,我們用的模塊是unrar里面的rarfile,其實還有個直接叫rarfile的包,但是那個rarfile包依賴unrar環境,配置還很復雜,所以我直接放棄了,用unrar即可。
8. 生成字典
這里我生成了一個包含所有三位數的字典,並按行保存到pwd.txt文件中。
f = open('pwd.txt', 'w')
l = [str(i) for i in range(10)]
for i in l:
for j in l:
for k in l:
f.write(i+j+k+'\n')
f.close()
當然,實際情況是很復雜的。密碼可能不止三位,並且不僅包含數字,還有字母和特殊字符等。你可以在我的代碼基礎上做些修改,生成更為復雜的密碼字典。如果你不想自己寫代碼,我這里也為大家准備好了一個43G的大字典(你下載的是壓縮過的只有80MB,下載后請解壓):
這里再推薦一個提供密碼字典下載的網站:
9. 讀取密碼
密碼字典一般都很大,假如你用的密碼字典是43GB,直接讀整個文件的話可能會導致內存溢出,所以我們一般是按行讀,讀一行處理一行,處理完成后指針會自動幫你定位到下一行,往復循環即可,具體python實現如下:
def crack(self, funcname):
book = open(self.bookname)
with cf.ThreadPoolExecutor(12) as tp:
while True:
pwd = book.readline().strip()
tp.submit(funcname, pwd)
10. 嘗試破解
10.1. 嘗試破解zip格式的壓縮包
def zip_crack(self, pwd):
runtime = self.show()
print(f'破解已用時: {runtime} 當前密碼: {pwd}', end='\r')
try:
zip_file = ZipFile(self.filename)
zip_file.pwd = pwd.encode()
zip_file.extractall()
print(f'破解已完成: {runtime} 壓縮密碼: {pwd}')
with open('res.txt','w') as f:
f.write(pwd)
os._exit(0)
except:
pass
10.2. 嘗試破解rar格式的壓縮包
def rar_crack(self, pwd):
runtime = self.show()
print(f'破解已用時: {runtime} 當前密碼: {pwd}', end='\r')
try:
rar_file = RarFile(self.filename, pwd=pwd)
rar_file.extractall()
print(f'破解已完成: {runtime} 壓縮密碼: {pwd}')
with open('res.txt','w') as f:
f.write(pwd)
os._exit(0)
except:
pass
11. 完整代碼
# run.py
from unrar.rarfile import RarFile
import concurrent.futures as cf
from zipfile import ZipFile
import time
import os
class CompressionCrack(object):
def __init__(self):
self.filename = input('請輸入壓縮文件的絕對路徑: ')
self.bookname = input('請輸入密碼字典的絕對路徑: ')
self.startTime = time.time()
def show(self):
runtime = round(time.time()-self.startTime)
if runtime > 3600:
h = int(runtime/3600)
m = int(runtime % 3600/60)
s = runtime % 3600 % 60
runtime = f'{h}h{m}m{s}s'
elif runtime > 60:
m = int(runtime/60)
s = runtime % 60
runtime = f'{m}m{s}s'
else:
runtime = f'{runtime}s'
return runtime
def zip_crack(self, pwd):
runtime = self.show()
print(f'破解已用時: {runtime} 當前密碼: {pwd}', end='\r')
try:
zip_file = ZipFile(self.filename)
zip_file.pwd = pwd.encode()
zip_file.extractall()
print(f'破解已完成: {runtime} 壓縮密碼: {pwd}')
with open('res.txt', 'w') as f:
f.write(pwd)
os._exit(0)
except:
pass
def rar_crack(self, pwd):
runtime = self.show()
print(f'破解已用時: {runtime} 當前密碼: {pwd}', end='\r')
try:
rar_file = RarFile(self.filename, pwd=pwd)
rar_file.extractall()
print(f'破解已完成: {runtime} 壓縮密碼: {pwd}')
with open('res.txt', 'w') as f:
f.write(pwd)
os._exit(0)
except:
pass
def crack(self, funcname):
book = open(self.bookname)
with cf.ThreadPoolExecutor(12) as tp:
while True:
pwd = book.readline().strip()
tp.submit(funcname, pwd)
def main(self):
if self.filename.endswith('.zip'):
filetype = 1
elif self.filename.endswith('.rar'):
filetype = 0
else:
print('不支持的壓縮格式,必須是rar或zip')
os._exit(0)
if filetype:
self.crack(self.zip_crack)
else:
self.crack(self.rar_crack)
if __name__ == "__main__":
CompressionCrack().main()
12. 軟件打包
推薦在pipenv創建的虛擬環境下打包,這樣打包的體積會很小,具體打包教程如下:
- 執行命令
pip install pipenv安裝pipenv cd到項目路徑,運行命令pipenv install創建虛擬環境- 運行命令
pipenv shell激活虛擬環境 - 安裝項目開發中用到的第三方模塊:
pip install unrar - 安裝打包工具:
pip install pyinstaller - 執行打包命令:
pyinstaller -F -i app.ico run.py
第6步執行打包命令前先停一下。
unrar模塊依賴庫文件UnRAR64.dll,所以先把UnRAR64.dll復制到項目路徑下(win32復制UnRAR.dll)。
然后修改pipenv創建的虛擬環境里面的unrar的代碼,具體是修改C:\Users\xxx\.virtualenvs\python-compression-crack-ZMK49n5q\Lib\site-packages\unrar路徑下的unrarlib.py文件,將第33行代碼由lib_path = os.environ.get('UNRAR_LIB_PATH', None)改為lib_path = 'UnRAR64.dll'。
好了,可以執行打包命令了:pyinstaller -F -i app.ico run.py。
