文章目錄
1. 軟件下載
mac
、linux
和win32
用戶請參考打包教程使用源代碼打包。
2. 破解測試
3. 文件說明
run.exe
:壓縮包密碼破解軟件,支持zip
和rar
格式pwd.txt
:包含所有3
位數的密碼字典,從000
到999
res.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
。