WPF快速入門系列(7)——深入解析WPF模板
工具破解
前兩天在網上下來了一波專案案例,結果全是加密的壓縮包,於是去網上找了一個壓縮包破解的工具
苦於工具破解太慢,一個壓縮包要好久,解壓了三個之後就放棄了,準備另尋他法
密碼字典
巧的是破解的三個都是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()
這個方法,堪稱完美
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理
想要獲取更多Python學習資料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起來學習討論吧!