首頁>技術>

不管是剛剛接觸python,還是沒有接觸過python的同學,在瀏覽本篇文章時應該都不會感覺到費力(python2.7.6版本以上)

我會盡量詳細直白的進行講解,使得即使是一個沒有python編碼基礎的小白,在閱讀完本篇文章後,大腦中也會產生如何去構建一個指令碼的思路。

希望這篇文章能夠提升你們對python的興趣,瞭解python構建指令碼時的基本思維,並且感受一下python語言的魅力所在吧。

你將難以想象,透過Python僅僅需要幾十行的程式碼和一本好用的字典就能夠輕鬆破解被加密的壓縮包檔案。言歸正傳,我們來看一下我們是如何一步步構建指令碼框架,修改完善指令碼,並最終實現口令破解的吧!!!

一.

我們先建立一個檔案,將其命名為“zip1.py”,開啟檔案後便開始了我們的程式設計之旅。在此之前,由於是在實驗環境,所以我們還需要建立一個含有口令的壓縮包:密碼設定為123456 並將其命名為”a.zip”

我們在嘗試讀取其中檔案時,便會要求我們輸入響應的口令:

下面我們就要了解,是什麼原理讓指令碼執行起來時能夠實現密碼的破解呢?我們開啟剛剛建立的“zip1.py”,然後再裡面輸入以下程式碼:

import zipfilezFile = zipfile.ZipFile("a.zip")zFile.extractall(pwd="123456")

我們首先在第一行呼叫了python中的zipfile庫。zipfile庫簡單來說可以讓我們例項化壓縮檔案,並且提供將其破解的函式。匯入庫後,用帶有口令保護的zip檔案的檔名,例項化一個新的ZipFile類。要解壓這個ZIP檔案 我們需要用的zipfile庫中的“extractall()”函式pwd就是壓縮包的密碼。

來執行一下指令碼,我們發現指令碼會將破解後的檔案解壓,並且存放在我們的根目錄下。

現在我們已經瞭解了破解流程,接下來就可以打造屬於我們自己的工具了!我們在破解的時候當然不可能逐一去輸入賬號密碼,這樣太費勁了!所以我們需要擁有一本屬於自己zip爆破字典(1.txt)有了字典之後,我們將字典中的密碼遍歷到password變數中對之前的程式碼進行一下修改:

#coding=utf-8import zipfilezFile = zipfile.ZipFile("a.zip") #破解的目標ZIP檔案passFile=open("1.txt") #這是我們的字典for line in passFile: password=line.strip("\n") zFile.extractall(pwd=password)

如果大家在學習中遇到困難,想找一個python學習交流環境,可以加入我們的python,關注小編,並私信“01”即可進裙,領取python學習資料,會節約很多時間,減少很多遇到的難題。

然後嘗試執行一下這個指令碼:我們發現報錯了我們的字典內容如下:其中包含我們的正確口令。我們再來看一下報錯資訊。

admin qweqasd 123456 akjshdkj 9999999

我們都過檢查報錯資訊的末端發現,這是由於口令錯誤引起的,進而繼續追蹤相關函式,發現正是extractall()出現錯誤引起的。函式一旦出錯便不會跳過錯誤繼續向下遍歷密碼,那麼我們就要使用try-except程式碼塊來避免程式崩潰!

改進後的程式碼如下:

#coding=utf-8import zipfilezFile = zipfile.ZipFile("a.zip") #破解的目標ZIP檔案passFile=open("1.txt") #這是我們的字典for line in passFile: password=line.strip("\n") try: zFile.extractall(pwd=password) print password except Exception,e: pass

try:嘗試執行extractall()函式破解,執行成功則輸出正確ZIP密碼,若執行失敗則進入except板塊Pass掉這個異常!這樣就不會出現因為破解失敗而導致的程式崩潰了

我們再來執行發現,指令碼能夠正常遍歷字典中所有密碼,並且輸出!我們再來執行發現,指令碼能夠正常遍歷字典中所有密碼,並且輸出!

但是我們需要的是函式模組化的指令碼,而非線性執行的程式

我們不得不讓我們的指令碼更靈活,更具有可塑性!下面我們來清理一下程式碼:

我們將定義一個函式extractFile(),使這個函式具有帶入字典密碼並破解口令的功能。我們再定義一個函式main(),使其能夠例項化ZIP檔案,遍歷字典內容,並執行extractFile()函式的功能!模組化的程式碼如下:
#coding=utf-8import zipfile #匯入zipfile庫def extractFile(zFile,password): #定義一個函式,形參為破解目標檔名,密碼try: #避免程式崩潰zFile.extractall(pwd=password)return password #返回密碼except:passdef main():zFile=zipfile.ZipFile('a.zip') #例項化一個類ZipFilepassFile=open("1.txt") #開啟字典檔案for line in passFile.readlines(): #For遍歷字典內容password=line.strip("\n") #取出空格 上下間隙guess = extractFile(zFile, password) #將函式放入一個變數if guess: #如果破解成功則返回出密碼 並且退出print "[*]密碼是: " + password +"\n"exit(0)if __name__ == '__main__': #如果執行的是當前指令碼 則執行函式main()main()
這裡要重點介紹一下if __name__ == ‘__main__‘: 這個條件的意思。當.py檔案被直接執行時,if __name__ ==’__main__‘之下的程式碼塊將被執行;當.py檔案以模組形式被匯入時,if __name__ == ‘__main__‘之下的程式碼塊不被執行。因為當前指令碼執行時 __name__ =main如果是在abc.py指令碼中被匯入的話 像是import zip1這樣的話__main__ =zip1 而不是main了 所以就會和__main__不匹配從而不會執行該函式。現在我們離成功就差最後一步了!我們接下來我們要設定可選引數,這樣我們就可以按照我們的要求,去使用我們想用的字典,破解我們想破解的檔案。並且我們還要為此新增多執行緒的功能,這樣在面臨龐大的字典時 也能快速的對目標檔案進行多執行緒破解!終極版程式碼如下:
#coding=utf-8import zipfile import optparse #optparse用於設定可選引數,並進行引數的解釋from threading import Thread #從threading庫匯入Thread類 主要功能是設定多執行緒def extractFile(zFile,password):  try: zFile.extractall(pwd=password) #python3中pwd需要的是byte print ('[+] Fonud Password : ' + password + '\n')  except: passdef main(): parser = optparse.OptionParser("[*] Usage: ./unzip.py -f <zipfile> -d <dictionary>") #設定引數解釋 parser.add_option('-f',dest='zname',type='string',help='specify zip file') #設定引數 可輸入讀取目標檔案 parser.add_option('-d',dest='dname',type='string',help='specify dictionary file') #設定字典引數 (options,args) = parser.parse_args() #options可以理解為sys.argv[1:] 比如(-f xxx.zip -d x.txt) if (options.zname == None) | (options.dname == None): #確認引數是否存在 print (parser.usage) #輸出我們前面設定的解釋 exit(0)  zFile = zipfile.ZipFile(options.zname) #確定破解目標物件 passFile = open(options.dname) #開啟我們需要的字典 for line in passFile: #遍歷字典內容 line = line.strip('\n')  t = Thread(target=extractFile,args=(zFile,line)) #設定多執行緒 target可理解為等於一個方法(自定義函式),args可理解為我們向函式中傳的引數 這裡就是像extractall()中傳入破解ZIP檔案和遍歷的字典密碼 t.start() #開啟執行緒if __name__ == '__main__': #如果在當前指令碼執行 那麼為真 main()

激動人心的時刻到了!

我們將指令碼執行一下看一下效果:

這裡指令碼中使用的是optparse庫來設定的引數和引數解釋因為這會讓程式碼比較簡潔並且容易理解。大家可以嘗試使用getopt庫來重新定義一下,那樣子雖然有些麻煩,但是對於剛剛接觸python的同學會更容易理解。

學習完本篇章後大家就再也不用擔心別人給ZIP檔案加密啦~

建議大家配合crunch字典生成工具使用,將會事半功倍!!!

12
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • tail命令學習例項