今天發生了個有趣的事情,有個朋友發了一個帶密碼保護的Zip文件給我,卻不給我密碼,我就琢磨這怎麼可以'猜'到密碼呢? 經過一系列的嘗試,最終使用python把這個密碼給'猜'出來了。要想寫出破解密碼的腳本需要瞭解一下python的zipfile庫,這裡百度上的資源多的很,我就直接給大家上代碼再一一解 ...
今天發生了個有趣的事情,有個朋友發了一個帶密碼保護的Zip文件給我,卻不給我密碼,我就琢磨這怎麼可以'猜'到密碼呢?
經過一系列的嘗試,最終使用python把這個密碼給'猜'出來了。要想寫出破解密碼的腳本需要瞭解一下python的zipfile庫,這裡百度上的資源多的很,我就直接給大家上代碼再一一解釋。
import zipfile from threading import Thread
首先導入zipfile 和 Thread庫下的threading,作用分別是:可以通過代碼來打開zip文件,有密碼保護我們提供密碼就行了(至於怎麼提供我後面會講^_^); 開啟多線程來'猜'密碼,使得效率更高!
這裡我們可以練習一下zipfile是怎麼打開文件的呢?
zipFile = zipfile.ZipFile("test1.zip") zipFile = extractall(pwd= bytes("123", "utf8" ))
我們在和這個練習的python腳本相同路徑下生成一個壓縮密碼為:123的壓縮包,命名為test1.zip 當然你可以在任何地方生成練習文件,打開的時候記得寫上絕對路徑就OK啦~~
你會發現這個代碼運行後你的壓縮文件被解壓啦,我們思考一下那麼密碼錯誤怎麼辦呢,當然就是打不開啦。我們利用這個特性,使用python的預防錯誤機制try ,except 這個機制的意思是:如果我放在try:裡面要執行的代碼有問題,程式不會報錯而會運行except: 下麵的代碼。
核心:那我們就利用這點,讓程式去給我們嘗試幾乎無限種可能的密碼的排列組合,如果密碼錯誤就跳過,知道找到密碼為止~
題外話:我覺得我那個朋友設置的密碼應該會是數字,所有我用python寫了一個.txt文件:將0到10000000的數字全部寫入。貌似有80多MB....真的很大...
接下來就開始猜密碼了:
def extractFile(zipFile, password): ###提取文件的類 try: zipFile.extractall(pwd= bytes(password, "utf8" )) ###打開壓縮文件,提供密碼... print("This file\'s password is " + password) ###破解到密碼 except: pass ###假如失敗,就跳過繼續
寫了一個方法:這個方法需要我們提供需要破解的文件的相關信息, 然後需要我們提供這個文件的密碼(我們當然不知道密碼,不過很快就會知道的了~~~)
def mainStep(): zipFile = zipfile.ZipFile('C:\\Users\\Flash\\Desktop\\Secret.zip') # 這裡的第二個參數用r表示是讀取zip文件,w是創建一個zip文件,預設是r PwdLists = open('C:\\Users\\Flash\\Desktop\\dictionary.txt') #讀入所有密碼 for line in PwdLists.readlines(): #挨個挨個的寫入密碼 Pwd = line.strip('\n') t = Thread(target=extractFile, args=(zipFile, Pwd)) t.start()
然後我們再寫一個方法:這個方法是為extractFile方法提供需要破解文件的相關信息的, 然後在打開‘密碼字典’把密碼字典的所有東西都讀到PwdLists裡面, 通過for迴圈把PwdLists裡面的每個密碼都拿去嘗試,直到有正確密碼為止 t = Thread(target=extractFile, args=(zipFile, Pwd)) 這個的意思是線上程先運行使得嘗試的速度更快,具體可以百度瞭解線程的知識。
這個是我生成的密碼字典 和 我破解的朋友的密碼~~~/得意 O(∩_∩)O哈哈~
我貼出全部代碼:
import zipfile from threading import Thread def extractFile(zipFile, password): ###提取文件的類 try: zipFile.extractall(pwd= bytes(password, "utf8" )) ###打開壓縮文件,提供密碼... print("This file\'s password is " + password) ###破解到密碼 except: pass ###假如失敗,就跳過繼續 def mainStep(): zipFile = zipfile.ZipFile('C:\\Users\\Flash\\Desktop\\Secret.zip') # 這裡的第二個參數用r表示是讀取zip文件,w是創建一個zip文件,預設是r PwdLists = open('C:\\Users\\Flash\\Desktop\\dictionary.txt') #讀入所有密碼 for line in PwdLists.readlines(): #挨個挨個的寫入密碼 Pwd = line.strip('\n') t = Thread(target=extractFile, args=(zipFile, Pwd)) t.start() if __name__ == '__main__': mainStep()
註意:我用的是絕對路徑,大家可以根據自己的路徑修改哦
代碼不難,卻是很有趣,做什麼事情沒有絕對的興趣也沒有絕對的枯燥乏味,我們要自己讓自己覺得有意思起來:這個很有趣,這個很有趣...(心裡:一點也沒有!! 哈哈 開個玩笑。)
希望我們抱著一種開心的心態學習和進步。大家一起努力吧~~