<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python入門系列17 - 30行代碼破解加密ZIP文件

          共 3518字,需瀏覽 8分鐘

           ·

          2019-09-01 23:49

          Python入門系列17

          c6a6d051c82b9feb1f62be10cf4973cd.webp

          30行代碼破解加密ZIP文件


          本篇文字為2281字,閱讀時(shí)間約為9分鐘。


          1

          前言


          今天來點(diǎn)實(shí)戰(zhàn)干貨,想必之前的入門系列中一直在講基礎(chǔ)也會(huì)顯得非常枯燥,有了前面的相關(guān)知識,即可以實(shí)現(xiàn)本章內(nèi)容。若有不懂得的地方,請回顧python入門系列1-16。


          很早以前,python就被公認(rèn)為黑客界的編程語言之一,自身有著強(qiáng)大的第三方庫(也就是包和模塊的統(tǒng)稱)來使用,并且語言上手都非常容易。廢話不多說,今天就來演示下如何手寫一段python程序來實(shí)現(xiàn)暴力破解壓縮文件的密碼!重點(diǎn)在于編程的思路!


          聲明:本章內(nèi)容僅供學(xué)習(xí)記錄使用,請勿用于商業(yè)以及非法用途!


          2

          暴力破解的實(shí)現(xiàn)思路


          利用python內(nèi)置模塊zipfile來實(shí)現(xiàn)破解文件,zipfile模塊有一種函數(shù),其可以實(shí)現(xiàn)將壓縮文件路徑傳入,通過函數(shù)返回值去調(diào)用提取文件的方法,若文件是加密的且密碼傳入的不正確,程序則會(huì)發(fā)生異常(也就是程序報(bào)錯(cuò))。通過這樣的思想,我們可以通過讀取一個(gè)字典文件(字典文件就是包含各種弱密碼的一個(gè)txt文本文件),用for循環(huán)讀取此文件來實(shí)現(xiàn)循環(huán)嘗試。但是python單線程跑比較大的字典文本會(huì)非常耗時(shí),所以此程序采用多線程來實(shí)現(xiàn)調(diào)用。


          PS:線程是計(jì)算機(jī)中的專有概念,舉個(gè)例子來說吧,比如咱們平時(shí)用到的360殺毒軟件,它整體作為一個(gè)軟件被大家使用,而這樣的一個(gè)獨(dú)立軟件可以稱之為進(jìn)程,當(dāng)我們使用360殺毒時(shí),在它正在運(yùn)行殺毒的過程中,我們還可以用它對電腦進(jìn)行卸載軟件,或者清理垃圾等操作,這樣在同一時(shí)刻,可以干很多事情,就利用到了多線程。一個(gè)進(jìn)程軟件下可以同時(shí)干好多事情,而線程就是可以干好多事情的“人”。多線程使得計(jì)算機(jī)程序的運(yùn)行效率大大提高,減少了我們平時(shí)使用時(shí)候耗時(shí)。


          3

          破解密碼效果演示


          1. 自己建立一個(gè)加密的zip文件,密碼自主設(shè)定。


          我們將一個(gè)文本文件進(jìn)行加密,將其壓縮成zip文件。

          9a860f40ade92e1e730a2c1bb37b93ef.webp


          2. 打開命令行,執(zhí)行py腳本。


          我這里命令行用的是git bash shell,這是一種windows下的類linux命令行,非常好用,兼容所有l(wèi)inux命令,裝了git的同學(xué)用了都說好!!~


          4af12de3c45a5e7e9d0da40f9fe16779.webp


          可以看到有個(gè)進(jìn)度條,進(jìn)度條前面走的數(shù)字就是每個(gè)行密碼都去開一個(gè)線程,字典一共200W行,在讀取到2W多行時(shí)將密碼破解出來,接下來手動(dòng)停止程序即可。


          3. 關(guān)于zip加密若不正確


          這里要說下,正常情況下,一個(gè)加密的zip文件,即使你輸入錯(cuò)誤的密碼也是能用壓縮文件打開的,只不過相應(yīng)的文本文件是被加密的。所以,通過手動(dòng)方式去解壓加密zip文件,即使是錯(cuò)誤密碼也可以提取到原文本文件,只不過是亂碼罷了,如下圖:

          c3d8713655d794d3df5a123867498c2e.webp

          4

          ?代碼的實(shí)現(xiàn)講解


          1. 命令行函數(shù)代碼


          #?第一行通過調(diào)用optparse的函數(shù)創(chuàng)建一個(gè)parser的實(shí)例化對象
          parser?=?optparse.OptionParser('\n??%prog?-z??-d?')
          #?第二行添加一個(gè)參數(shù),在命令行上輸入-z?xxxx?可將命令行上的zip路徑作為字符串傳入到變量zname中
          parser.add_option('-z',?dest='zname',?type='string',?help='specify?zip?file')
          #?第三行添加一個(gè)參數(shù),在命令行上輸入-d?xxxx?可將命令行上的字典文件作為字符串傳入到變量dname中
          parser.add_option('-d',?dest='dname',?type='string',?help='specify?dictionary?file')
          #?第四行進(jìn)行解析,得到相關(guān)參數(shù),得到options。
          options,?args?=?parser.parse_args()
          #?第五行,通過zname和dname判斷是否傳入的參數(shù)為空
          if?options.zname?and?options.dname:
          ????zip_name?=?options.zname
          ????dict_name?=?options.dname
          else:
          ????print(parser.usage)
          ????exit(0)


          2. 多線程函數(shù)代碼


          #?通過try-except來抓取運(yùn)行程序時(shí)的異常,若報(bào)錯(cuò),說明傳入的文件不存在
          try:
          ????#?調(diào)用zipfile模塊的實(shí)例對象方法,將zip路徑傳入
          ????zip_file?=?zipfile.ZipFile(zip_name)
          ????#?打開字典文件,用python自帶的with關(guān)鍵詞來打開,可以交由python自主關(guān)閉文件的資源
          ????with?open(dict_name,?'r',?encoding='utf-8')?as?f:
          ????????#?讀取每一行,并且將密碼后的\n?清空,也就是清空換行符
          ????????for?line?in?tqdm(f.readlines()):
          ????????????password?=?line.strip('\n')
          ????????????#?對每個(gè)密碼開啟線程去處理,調(diào)用extract_file函數(shù),傳入的參數(shù)為元組(zip_file,?password)
          ????????????thread?=?Thread(target=extract_file,?args=(zip_file,?password))
          ????????????#?調(diào)用線程開始的方法
          ????????????thread.start()
          except?Exception?as?e:
          ????print(f'發(fā)生異常!請檢查文件是否存在!異常信息為:{e}')


          假設(shè)我輸入了錯(cuò)誤的文件名稱,可以看到報(bào)錯(cuò)!

          30a4866b5f548a8204a5e066736ebef0.webp


          3. 調(diào)用zipfile模塊的核心代碼


          這里的核心代碼便是多線程調(diào)用時(shí)觸發(fā)的函數(shù)。

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


          5

          代碼中額外的知識點(diǎn)


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


          為了我們方便讀取文件時(shí)看到相關(guān)進(jìn)度,所以這里額外安裝了第三方庫tqdm,一個(gè)非常好用的進(jìn)度條庫。tqdm在阿拉伯語中表示“progress”,而在西班牙語中則是“I love you so much”的縮寫。


          介紹一個(gè)python第三方庫的官方網(wǎng)站:https://pypi.org/

          這個(gè)網(wǎng)站有各個(gè)模塊官方的安裝命令以及文檔,比如下圖:

          ef06fa879667603e8aa092e950eface5.webp

          f1a2c3e0a0dca820156d9f3e78565641.webp


          在之前的小課堂中,如果你配置好python的環(huán)境變量,打開命令行是可以直接進(jìn)行安裝的,只需執(zhí)行命令pip install modal name即可,如下圖:

          9dd1892a3e1bca1578c28771253572e0.webp

          因?yàn)槲乙呀?jīng)安裝過了,所以會(huì)這樣提示。若沒安裝過,可以看到有下載的進(jìn)度條,最后安裝完會(huì)顯示success。


          2.??optparse、zipfile、tqdm模塊的簡介


          optarse:這是一個(gè)python自帶的庫,通過上面介紹的代碼可以和linux命令似的,帶參數(shù)執(zhí)行。舉個(gè)例子,如下圖:

          263ff614d7c9da622d388b649e7429b9.webp


          zipfile:python自帶的庫,可以對zip文件進(jìn)行解壓縮,本章實(shí)現(xiàn)的重點(diǎn)模塊,需要注意的是,在用extractall時(shí),傳入的字符串密碼進(jìn)行字節(jié)編碼的轉(zhuǎn)化。zip_file.extractall(pwd=bytes(password,'utf-8'))


          關(guān)于解壓出來的文件名字會(huì)有亂碼的情況,請看文章:

          https://www.cnblogs.com/limengjie0104/archive/2018/06/17/9192449.html


          tqdm:需要安裝的第三方庫,在可以循環(huán)迭代的對象上使用即可。如:

          for line in tqdm(f.readlines()):


          6

          爆破字典的項(xiàng)目


          爆破字典的開源項(xiàng)目,其中收錄了不少相關(guān)的密碼,可以star 或者 fork到自己的倉庫記錄使用。地址如下:

          https://github.com/rootphantomer/Blasting_dictionary


          本篇文章的完整代碼地址如下:

          https://github.com/unlimitbladeworks/python-tools/blob/master/hack/zip_hack.py


          至此完!

          瀏覽 76
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲一区二区三 | 中国免费黄色视频 | 久久久视频在线观看 | 国产精品久久久久久妇女6080 | a片一级免费 |