2017-08-31 106 views
0

我工作的一所學校的項目一個簡單的壓縮文件密碼破解,我需要它來顯示密碼一旦破解它從字典中的單詞列表。每當我運行它時,它只會提取文件,並不會打印任何內容。我如何解決這個問題也顯示密碼?這是我的代碼。的Python 3郵編密碼破解

import optparse 
import zipfile 
from threading import Thread 

def extract_zip(zFile, password): 
     try: 
       password = bytes(password.encode('utf-8')) 
       zFile.extractall(pwd=password) 
       print ("[+] Password Found: " + password + '\n') 
     except: 
       pass 

def Main(): 
     parser = optparse.OptionParser("useage &prog "+\ 
         "-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, arg) = parser.parse_args() 
     if (options.zname == None) | (options.dname == None): 
       print (parser.usage) 
       exit(0) 
     else: 
       zname = options.zname 
       dname = options.dname 

     zFile = zipfile.ZipFile(zname) 
     passFile = open(dname) 

     for line in passFile.readlines(): 
      password = line.strip('\n') 
      t = Thread(target=extract_zip, args=(zFile, password)) 
      t.start() 

if __name__ == '__main__': 
     Main() 
+2

你的問題是什麼? –

+0

請閱讀[導覽],然後[問]然後[mcve]。你還沒有問一個問題,所以你需要編輯你的文章。 –

+0

@DaveS我加了問題 – Vixro

回答

1

的問題是,你要打印的編碼的密碼,而不是原來的密碼。您不能將字節連接到字符串。所以打印原始密碼,不是bytes()的結果。和

,而不是從存檔提取所有文件,使用testzip()來測試是否可以對它們進行解密。但要做到這一點,每個線程都需要自己的ZipFile對象。否則,他們會設置另一個線程使用的密碼。

def extract_zip(filename, password): 
    with ZipFile(filename) as zFile: 
     try: 
      password_encoded = bytes(password.encode('utf-8')) 
      zFile.setpassword(password_encoded) 
      zFile.testzip() 
      print ("[+] Password Found: " + password + '\n') 
     except: 
      pass 

然後改變調用者傳遞文件名到線程,而不是zFile

+0

也有,有沒有辦法讓它實際上不提取文件,只是給密碼?而如何添加一個功能可以打印一個消息,說沒有設置密碼的時候發現它無法找到一個 – Vixro

+0

@Vixro注意使用毯子'try' /'except'(即沒有具體的異常被抓住了'除了')是麻煩的祕訣,因爲它會吞噬任何發生的錯誤。當試圖打印編碼字節時,可能會發現一些異常,這些異常會顯示錯誤是什麼,但是它沒有被打印,因爲您發現了異常,然後通過。 –

+0

@JoshKarpel這就是爲什麼我告訴他在調試時添加錯誤打印。 – Barmar