Python 嘗試解壓縮需要密碼的zip格式壓縮文件

使用zipfile庫,python自帶的,不需要另外安裝
zip壓縮格式是開源的,rar格式是商業的,這里只說解壓縮zip格式
程序是通過密碼字典,暴力破解zip壓縮文件

解壓縮zip文件的核心代碼如下:

# 打開Zip文件
zFile = zipfile.ZipFile(filepath, mode='r')

# 解壓到軟件所在目錄
# 此處無論密碼是否正確都會創建目錄
# 如果密碼錯誤則會報異常
# 此方法中文亂碼
zFile.extractall(pwd=bytes(password, 'utf-8'), path=folder)

代碼解釋:
filepath,zip壓縮文件
password,密碼
folder,目標目錄

遇到的問題

1,中文亂碼

網上找到的思路都是使用 extract() 逐個文件解壓,這樣就可以在此過程中逐個文件修正中文亂碼問題。
親測無效。

有效的思路是:
先用 extractall() 一次性解壓全部;
再遍歷文件夾和文件名,處理中文亂碼問題

處理中文亂碼的核心代碼如下:

# 處理中文亂碼
# os.walk() 是一個深度優先遍歷算法
# topdown = False 優先遍歷最底層的子目錄
for dirpath, dirnames, filenames in os.walk(folder, topdown=False):
    # 遍歷目錄中所有文件,并重命名
    # 必須先重命名文件名,如果先重命名文件夾,則文件名路徑錯誤
    for filename in filenames:
        newFilename = filename.encode('cp437').decode('gbk')
        os.rename(os.path.join(dirpath, filename), os.path.join(dirpath, newFilename))
    # 遍歷目錄中所有文件夾,并重命名
    for dirname in dirnames:
        newDirname = dirname.encode('cp437').decode('gbk')
        os.rename(os.path.join(dirpath, 

2,密碼錯誤也會創建目標文件夾

處理方法就是,如果密碼錯誤,未能正確解壓zip文件,則刪除空的目標文件夾

刪除目錄的核心代碼如下:

# 刪除無效目錄(解壓失敗也會產生目錄)
if os.path.exists(folder):
    # 刪除目錄
    shutil.rmtree(folde)
3,使用線程時出的問題

如果壓縮包中第一個文件名無后綴名,例如:.DS_Store
則采用多線程嘗試密碼時會報錯:
FileExistsError(17, '當文件已存在時,無法創建該文件。')

不使用多線程則不會報錯
所以可做成手動選擇多線程單線程

手動選擇多線程或單線程的核心代碼如下:

for line in passFile.readlines():
    password = line.strip('\n')
    if isMultithreading:
        # 多線程
        t = Thread(target=extractZipFile, args=(zFile, password, folder))
        t.start()
    else:
        # 單線程
        extractZipFile(zFile, pass

代碼解釋:
passFile,是密碼文件,通過for循環逐個嘗試密碼
isMultithreading,是否使用多線程的標記

程序界面圖


界面.JPG

累死了~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容