1. 程式人生 > >【python小課堂專欄】python小課堂17 - 30行程式碼破解加密ZIP檔案

【python小課堂專欄】python小課堂17 - 30行程式碼破解加密ZIP檔案

python小課堂17 - 30行程式碼破解加密ZIP檔案

前言

今天來點實戰乾貨,想必之前的小課堂中一直在講基礎也會顯得非常枯燥,有了前面的相關知識,即可以實現本章內容。若有不懂得的地方,請回顧python小課堂1-16。

在多數人眼中一直覺得黑客很神祕,實際上當初我學python入門時正是因為那會在學安全相關的東西,機緣巧合得以在360和愛春秋聯合組織的網課中學到了不少安全相關的知識。很早以前,python就被公認為黑客屆的程式語言之一,自身有著強大的第三方庫(也就是包和模組的統稱)來使用,並且語言上手度非常容易。廢話不多說,今天就來演示下如何手寫一段python程式來實現暴力破解壓縮檔案的密碼!重點在於程式設計的思路!

宣告:本章內容僅供學習記錄使用,請勿用於商業以及非法用途!

暴力破解的實現思路

利用python內建模組zipfile來實現破解檔案,zipfile模組有一種函式,其可以實現將壓縮檔案路徑傳入,通過函式返回值去呼叫提取檔案的方法,若檔案是加密的且密碼傳入的不正確,程式則會發生異常(也就是程式報錯)。通過這樣的思想,我們可以通過讀取一個字典檔案(字典檔案就是包含各種弱密碼的一個txt文字檔案),用for迴圈讀取此檔案來實現迴圈嘗試。但是python單執行緒跑比較大的字典文字會非常耗時,所以此程式採用多執行緒來實現呼叫。

PS:執行緒是計算機中的專有概念,舉個例子來說吧,比如咱們平時用到的360防毒軟體,它整體作為一個軟體被大家使用,而這樣的一個獨立軟體可以稱之為程序,當我們使用360防毒時,在它正在執行防毒的過程中,我們還可以用它對電腦進行解除安裝軟體,或者清理垃圾等操作,這樣在同一時刻,可以幹很多事情,就利用到了多執行緒。一個程序軟體下可以同時幹好多事情,而執行緒就是可以幹好多事情的“人”。多執行緒使得計算機程式的執行效率大大提高,減少了我們平時使用時候的耗時。

破解密碼效果演示

1. 自己建立一個加密的zip檔案,密碼自主設定。

我們將一個文字檔案進行加密,將其壓縮成zip檔案。
在這裡插入圖片描述

2. 開啟命令列,執行py指令碼。

我這裡命令列用的是git bash shell,這是一種windows下的類linux命令列,非常好用,相容所有linux命令,裝了git的同學用了都說好!!~

在這裡插入圖片描述

可以看到有個進度條,進度條前面走的數字就是每個行密碼都去開一個執行緒,字典一共200W行,在讀取到2W多行時將密碼破解出來,接下來手動停止程式即可。

3. 關於zip加密若不正確

這裡要說下,正常情況下,一個加密的zip檔案,即使你輸入錯誤的密碼也是能用壓縮檔案開啟的,只不過相應的文字檔案是被加密的。所以,通過手動方式去解壓加密zip檔案,即使是錯誤密碼也可以提取到原文字檔案,只不過是亂碼罷了,如下圖:

在這裡插入圖片描述

程式碼的實現講解

1. 命令列函式程式碼

# 第一行通過呼叫optparse的函式建立一個parser的例項化物件
parser = optparse.OptionParser('\n  %prog -z <zipfile> -d <dictionary>')
# 第二行新增一個引數,在命令列上輸入-z xxxx 可將命令列上的zip路徑作為字串傳入到變數zname中
parser.add_option('-z', dest='zname', type='string', help='specify zip file')
# 第三行新增一個引數,在命令列上輸入-d xxxx 可將命令列上的字典檔案作為字串傳入到變數dname中
parser.add_option('-d', dest='dname', type='string', help='specify dictionary file')
# 第四行進行解析,得到相關引數,得到options。
options, args = parser.parse_args()
# 第五行,通過zname和dname判斷是否傳入的引數為空
if options.zname and options.dname:
    zip_name = options.zname
    dict_name = options.dname
else:
    print(parser.usage)
    exit(0)

2. 多執行緒函式程式碼

# 通過try-except來抓取執行程式時的異常,若報錯,說明傳入的檔案不存在
try:
    # 呼叫zipfile模組的例項物件方法,將zip路徑傳入
    zip_file = zipfile.ZipFile(zip_name)
    # 開啟字典檔案,用python自帶的with關鍵詞來開啟,可以交由python自主關閉檔案的資源
    with open(dict_name, 'r', encoding='utf-8') as f:
        # 讀取每一行,並且將密碼後的\n 清空,也就是清空換行符
        for line in tqdm(f.readlines()):
            password = line.strip('\n')
            # 對每個密碼開啟執行緒去處理,呼叫extract_file函式,傳入的引數為元組(zip_file, password)
            thread = Thread(target=extract_file, args=(zip_file, password))
            # 呼叫執行緒開始的方法
            thread.start()
except Exception as e:
    print(f'發生異常!請檢查檔案是否存在!異常資訊為:{e}')

假設我輸入了錯誤的檔名稱,可以看到報錯!

在這裡插入圖片描述

3. 呼叫zipfile模組的核心程式碼

這裡的核心程式碼便是多執行緒呼叫時觸發的函式。

def extract_file(zip_file, password):
    """ 提取壓縮檔案,通過密碼不斷嘗試 """
    try:
        zip_file.extractall(pwd=bytes(password,'utf-8'))
        print(f'\n  發現密碼,正確密碼為:{password}')
    except:
        pass

程式碼中額外的知識點

1. 安裝python第三方庫(python的強大之處,就是很多好用的第三方庫,人為封裝寫好的包和模組,直接拿來用即可!)

為了我們方便讀取檔案是看到相關進度,所以這裡額外安裝了第三方庫tqdm,一個非常好用的進度條庫。tqdm在阿拉伯語中表示“progress”,而在西班牙語中則是“I love you so much”的縮寫。

介紹一個python第三方庫的官方網站:https://pypi.org/

這個網站有各個模組官方的安裝命令以及文件,比如下圖:

在這裡插入圖片描述

在之前的小課堂中,如果你配置好python的環境變數,開啟命令列是可以直接進行安裝的,只需執行命令pip install modal name即可,如下圖:

在這裡插入圖片描述

因為我已經安裝過了,所以會這樣提示。若沒安裝過,可以看到有下載的進度條,最後安裝完會顯示success。

2. optparse、zipfile、tqdm模組的簡介

optarse:這是一個python自帶的庫,通過上面介紹的程式碼可以和linux命令似的,帶引數執行。舉個例子,如下圖:

在這裡插入圖片描述

zipfile: python自帶的庫,可以對zip檔案進行解壓縮,本章實現的重點模組,需要注意的是,在用extractall時,傳入的字串密碼進行位元組編碼的轉化。zip_file.extractall(pwd=bytes(password,'utf-8'))

關於解壓出來的檔名字會有亂碼的情況,請看文章:
https://www.cnblogs.com/limengjie0104/archive/2018/06/17/9192449.html

tqdm:需要安裝的第三方庫,在可以迴圈迭代的物件上使用即可。如:
for line in tqdm(f.readlines()):

爆破字典的專案

爆破字典的開源專案,其中收錄了不少相關的密碼,可以star 或者 fork到自己的倉庫記錄使用。地址如下:
https://github.com/rootphantomer/Blasting_dictionary

本篇文章的完整程式碼地址如下:
https://github.com/unlimitbladeworks/python-tools/blob/master/hack/zip/zip_hack.py
至此完!


有想學python的同學,歡迎關注公號:

在這裡插入圖片描述