python使用密碼字典暴力破解zip壓縮文件


閑來無事,照葫蘆畫瓢寫了一個Zip文件口令破解腳本。其中最主要的工作是由zipfie庫來完成的,首先可以通過help('zipfile')命令來了解這個庫:

 

 簡單介紹的話,zipfile庫是python中用來做zip格式編碼的壓縮和解壓的,它有兩個非常重要的類,分別是ZipFile和ZipInfo。前者用於壓縮和解壓zip文件,后者用於存儲zip文件的信息,我們主要使用到的是前者。當用ZipFile解壓帶有密碼的zip文件時,extractall方法需要提供密碼作為參數,而密碼的嘗試次數是不受限制的,這就是暴力破解的前提條件。我們可以通過不斷地嘗試密碼字典中的密碼,直到試出密碼或者試完字典破解失敗。為了直觀了解ZipFile,我們來 看以下它最簡單的使用場景:

1 import zipfile    #導入zipfile庫
2 zFile = zipfile.ZipFile("tast.zip")    #用同目錄下的taet.zip文件實例化一個ZipFile類
3 zFile.extractall(pwd='123456')    #使用extractall方法解壓文件,並提供”pwd”密碼參數

這就是破解的核心代碼,接下來通過函數將腳本模塊化,利用for循環遍歷字典中的密碼,不斷更換“pwd”參數:

import zipfile
from threading import Thread

# 破解函數,參數為待破解文件和密碼字典
def extractFile(zFile,passFile):
    for line in passFile.readlines():
        password = line.strip('\n')  #按行讀取字典中的密碼  
        try:
            zFile.extractall(pwd=password.encode())    #將從字典中讀取到的密碼作為參數賦值給pwd
            print("password="+password)    #如果解壓成功,則輸出密碼 
        except Exception as e:#否則輸出遇到的錯誤,這里pass了,因為在循環體里面,輸出的話太多了
            pass


# 主函數
def main():
    zFile=zipfile.ZipFile('test.zip')    #實例化zFile
    passFile1=open('dictionary1.txt')    #打開同目錄下的字典1
    passFile2=open('dictionary2.txt')    #打開同目錄下的字典2
    t1 = Thread(target=extractFile,args=(zFile,passFile1))#為每一個密碼字典生成一個線程去驗證
    t1.start()
    t2 = Thread(target=extractFile,args=(zFile,passFile2))#為每一個密碼字典生成一個線程去驗證
    t2.start()

if __name__ == '__main__':
    main()

上面就是一個簡單的zip文件密碼破解腳本,可以看出,能否破解完全依賴於字典質量,如果字典里沒有該文件的密碼的話,該方法將失效。這也警醒我們,平時設置密碼不能太簡單,不要與自己的姓名生日等信息強關聯,要定期更換密碼等。

破解腳本中使用了兩個線程,分別對字典1和字典2進行嘗試,原以為這樣能提高破解的性能,但實踐告訴我並不行。使用兩個線程同時對兩個字典進行嘗試和只有一個主線程線性地對兩個字典進行嘗試,在我使用的例子中,兩個字典分別是20000個密碼的量級,前者比后者竟然還慢1秒多,我估計原因是這樣的:線程之間切換是需要時間的,兩個線程交替的爭奪CPU資源,換來的只是兩個字典同時進行這一好處而已,反而由於線程之間的切換,使得花費的時間更久。下面是只有一個線程的破解腳本:

import zipfile

# 破解函數,參數為待破解文件和密碼字典
def extractFile(zFile,passFile):
    for line in passFile.readlines():
        password = line.strip('\n')
        try:
            zFile.extractall(pwd=password.encode())
            print("password="+password)
        except Exception as e:
            pass


# 主函數
def main():
    zFile=zipfile.ZipFile('test.zip')
    passFile1=open('dictionary1.txt')
    passFile2=open('dictionary2.txt')
    extractFile(zFile, passFile1)
    extractFile(zFile, passFile2)

if __name__ == '__main__':
    main()

以上就是python使用密碼字典暴力破解zip壓縮文件的方法和代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM