Python 暴力破解 zip 密碼



前言

如果你手上有一份有密碼保護著的 zip 檔,但不好說它是哪裡來的 (?),而你又很好奇裡面的內容,能不能寫支程式跑整晚幫你猜猜看密碼呢?

我們今天就是要來做這件事。

猜到密碼是 ns 了!

依照習俗,首先先記錄開發環境資訊:

<meta charset="utf-8"># Version: python 3.6
    # OS: Windows 10
    # IDE: PyCharm
    # Source Code on: GitHubGist



Steps

  1. import modules
  2. zip 檔案存取與解碼函數
  3. 引用密碼表、或自行排列組合
  4. Multithreading 跑起來

Step 1 : import modules

  • [line 2]:
    zipfile : 就是用來存取 zip 檔與執行密碼測試的 module。

  • [line 3]:
    threading : 多線程,不解釋。

  • [line 4]:
    string : 製作 [A-Za-z0–9] 的字串或陣列供密碼排列之用;今天才在這裡發現要製作一個包含全字母或全 ASCII 的字串可以用這個 module 達到…整個菜味濃。


Step 2 : zip 檔案存取與解碼函數

  • [line 6]:
    定義一個解碼函數;第一個變數 zFile,實際上是去下一步 (Step 3) 所產生的物件,並使用 extractall 方法來傳入給定的密碼 (第二個變數 password)。

  • [line 8]:
    str.encode (password) :傳進 extractall 方法裡面的密碼 password,必須是 byte 的形式,因此將 password 字串 encode。

  • [line 10–12]:
    若成功則印出密碼並 return;若失敗則進入 except 跳過。


Step 3 : 引用密碼表、或自行排列組合

  • [line 15]:
    targetFile:指定你的目標 zip 檔在哪兒吧,記得 Windows 的路徑倒斜線 (\) 要跳脫 (escape)。

  • [line 16]:
    創建 zFile 物件供 python 處理 zip 檔。

  • [line 17]:
    創建變數 chars 儲存 [A-Za-z0–9],如果不切前 62 個字元 [:62],你可以拿到所有支援的符號做後續密碼猜測,這裡簡單測試起見,只用字母與數字。

  • [line 18–20]:
    這裡用了比較蠢的方法來製作測試密碼 password,用了兩層 for loop 只做兩個字元的排列組合。你可以設計其他函數,例如 import itertools 來精進你的猜測效率。

另外也可以去找廣泛使用的密碼表,使用 f.open() 等基本方式一個個做密碼猜測。


Step 4 : Multithreading 跑起來

  • [line 22–23]:
    Threading 跑起來!target 指定 step 2 中創建的函數 extractFile(),參數則給定上一步的 zFile 與產生的 password

  • [line 25–28]:
    如果猜測成功,則印出成功訊息,並 return 0 跳出函數。當 python 讀到 return 會視為函數的結束,就能達到如同在迴圈中 break 跳出的效果。

  • [line 30]:
    如果猜測失敗,則印出失敗訊息,進入下一次猜測。


Example Output:

猜到密碼是 ns 了!




Source Code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    # coding=UTF-8
    import zipfile
    import threading
    import string
    
    def extractFile(zFile,password):
        try:
            zFile.extractall(pwd=str.encode(password))
            print('Found password: '+ password)
            return password
        except:
            pass
    
    def main():
        targetFile = "<path_to_zip>.zip"
        zFile = zipfile.ZipFile(targetFile)
        chars = string.printable[:62]
        for i in chars:
            for j in chars:
                password = i+j +'test'
                t = threading.Thread(target=extractFile,args=(zFile,password))
                t.start()
    
                guess = extractFile(zFile,password)
                if guess:
                    print("[+] passoword is: + "password)
                    return 0
                else:
                    print("[-] Guessing password: + "password + " is wrong!")
                    # return
    if __name__ == '__main__':
        main()



REF {#ref}:

  1. convert String to Byte in python3
  2. Modules:zipfile, threading, string
  3. Violent Python (PDF)
  4. Does return break a loop?
  5. Is there a Python Library that contains a list of all the ascii characters?

主題 StackJimmy 設計