1. 程式人生 > >徐鬆亮Python教學-黑客篇-zip壓縮檔案的破解

徐鬆亮Python教學-黑客篇-zip壓縮檔案的破解

首先,此文件已學習為主,不要用來隨意破解別人的zip檔案。其次,你想破解也破解不了,千萬不要以為這麼多人用的保密檔案方式,靠本文幾句話就給破解啦,那是扯淡!上面兩句話是不是互相矛盾?哈哈,本文介紹的是字典破解和暴力破解,字典破解就是有個密碼集,挨個試,說破解不了是因為你怎麼建立密碼集?暴力破解就是完全窮舉,如果密碼只是幾位數字還好說,如果是字母數字加符號的長密碼,需要的時長估計你在有限的生命裡是夠嗆能看到結果啦,閒言少敘,進入正題!

一,概念

  • 字典破解

    • 建立一個密碼集,程式通過讀取密碼集的每條資料作為密碼來逐個嘗試。
  • 暴力破解

    • 根據條件窮舉所有的可能性,比如4為資料密碼就是從0000~9999挨個實驗

二,準備工作

  • 建立用於字典破解的字典檔案

    • 新建文字檔案:xsl_hacker_1_crackzip.txt,因為只是用於實驗,我們只加入以下少量密碼集。
  • 建立用於字典破解的密碼檔案

    • 用任意一種zip軟體,壓縮任意檔案,壓縮的時候加上壓縮密碼(從上面的字典裡選取,本示例是用的xslxhn),壓縮後的檔名稱為:xsl_hacker_1_crackzip.zip
  • 建立用於窮舉破解的密碼檔案

    • 用任意一種zip軟體,壓縮任意檔案,壓縮的時候加上壓縮密碼99999(因為在本例中我們做暴力破解實驗是從0-9,00-99,000-999,0000-9999,00000-99999這些資料段逐個嘗試,設定到最末尾,我們可以瞭解到破解5以內數字密碼的計算機單執行緒最長時間),壓縮後的檔名稱為:xsl_hacker_1_crackzip99999.zip

三,程式碼講解

  • 字典破解

  • 暴力破解

四,原始碼

  • #!/usr/bin/python
    #--------------------------------------------------
    #                       徐鬆亮編寫
    #--------------------------------------------------
    import sys              # 系統
    import time             # 時間
    import zipfile          # 壓縮與解壓縮
    import threading        # 多執行緒
    #--------------------------------------------------	
    StrLine = "--------------------"
    LineNum = 1
    #--------------------------------------------------
    #                       字典破解
    #--------------------------------------------------
    crackzip_str_zipfileName = "xsl_hacker_1_crackzip.zip"
    crackzip_str_passfileName = "xsl_hacker_1_crackzip.txt"
    #
    print (StrLine,LineNum,"-字典破解解壓zip檔案")
    LineNum+=1
    
    zipfile_state=0
    timeout=0
    
    # fun:extract file
    def extractFile(zFile, password):
        try:
            global zipfile_state 
            zFile.extractall(pwd=str.encode(password))
            print('\nFound Password = ' + password + '\n')
            zipfile_state=1
        except:
            pass
    # open zip file
    zfile = zipfile.ZipFile(crackzip_str_zipfileName)
    # open dictionaries
    passfile=open(crackzip_str_passfileName)
    # read passfile line
    for line in passfile.readlines():
            # strip \n
            password = line.strip('\n')
            # run thread extract file
            t = threading.Thread(target=extractFile, args=(zfile, password))
            # run thread
            t.start()
    # waiting finish
    while zipfile_state==0:
            timeout=timeout+1
            if timeout>10:
                    break
            else:
                    time.sleep(1)
    # file close        
    passfile.close()
    zfile.close()
    #--------------------------------------------------
    #                       暴力破解
    #--------------------------------------------------
    crackzip_str_zipfile99999Name = "xsl_hacker_1_crackzip99999.zip"
    #
    print (StrLine,LineNum,"-暴力破解解壓zip檔案")
    print ("5位數字暴力破解(單執行緒) 包括0-9 00-99 000-999 0000-9999 00000-99999")
    zfile = zipfile.ZipFile(crackzip_str_zipfile99999Name)
    password=0
    zipfile_state=0;
    ticks_begin = time.time()
    zfile_cmt=0;
    # fun:
    def str_setlen(d,l):
            s=str(d)
            while len(s) < l:
                    s='0'+s
            return s
    for num in range(1,6):
            password=0
            dmax = pow(10,num)-1
            while 1:
                    extractFile(zfile,str_setlen(password,num))
                    password = password+1
                    zfile_cmt = zfile_cmt+1
                    if password>dmax or zipfile_state==1:
                            break;
                    if zfile_cmt%1000==0:
                            print("%02d %%" % int((zfile_cmt*100)/(9+99+999+9999+99999)))
    ticks_end = time.time()                
    if zipfile_state==0:
            print ("單執行緒暴力破解失敗 耗時(秒)=%d" % int(ticks_end-ticks_begin))
    else:
            print ("單執行緒暴力破解成功 耗時(秒)=%d" % int(ticks_end-ticks_begin))
    zfile.close()
    '''
    print ("5位數字暴力破解(多執行緒)")
    zfile = zipfile.ZipFile('zip_99999.zip')
    password=0
    zipfile_state=0;
    ticks_begin = time.time()
    while(1):
            t = threading.Thread(target=extractFile, args=(zfile, str_setlen(password,5)))
            t.start()
            password = password+1
            if zipfile_state==1:
                    break
    while zipfile_state==0:
            if zipfile_state==1:
                    break
            else:
                    time.sleep(1)
    ticks_end = time.time()                
    if zipfile_state==0:
            print ("多執行緒暴力破解失敗 耗時(秒)=%d" % int(ticks_end-ticks_begin))
    else:
            print ("多執行緒暴力破解成功 耗時(秒)=%d" % int(ticks_end-ticks_begin))
    zfile.close()
    '''
    del zfile
    del passfile
    del zipfile_state
    del ticks_begin
    del ticks_end
    del zfile_cmt
    #--------------------------------------------------
    sys.exit()
    #--------------------------------------------------
    
    
    

五,執行效果

六,注意事項

  • 所有檔案必須放到同一目錄下。
  • 暴力破解的多執行緒解決方案在原始碼中已經被遮蔽,不用開啟了,開啟也不好使。
  • 本文的執行環境是在windows10+python3.7。