<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代碼,破解加密zip文件的密碼

          共 2186字,需瀏覽 5分鐘

           ·

          2021-03-11 00:20


          大家好,歡迎來(lái)到 Crossin的編程教室 !


          今天的文章來(lái)自 盞茶作酒 同學(xué)。他在老電腦中發(fā)現(xiàn)了一個(gè)加密的 zip 文件,于是用 Python 破解了文件密碼。在破解的過(guò)程中出現(xiàn)了內(nèi)存爆炸的問(wèn)題,通過(guò)閱讀 Python 源代碼找到了解決方案。


          下面就來(lái)給大家分享一下他的操作。



          之前在家里的老電腦中,發(fā)現(xiàn)一個(gè)加密zip壓縮包,由于時(shí)隔太久忘記密碼了,依稀記得密碼是6位字母加數(shù)字,網(wǎng)上下載了很多破解密碼的軟件都沒(méi)有效果,于是想到自己用Python寫(xiě)一個(gè)暴力破解密碼的腳本。

          Python 有一個(gè)內(nèi)置模塊 zipfile 可以解壓 zip 壓縮包。先來(lái)測(cè)試一波:創(chuàng)建一個(gè)測(cè)試文件,壓縮,設(shè)置解壓密碼為123。

          59a80a83dc0ca80d74904695a8536c77.webp
          import?zipfile

          #?創(chuàng)建文件句柄
          file?=?zipfile.ZipFile("測(cè)試.zip",?'r')
          #?提取壓縮文件中的內(nèi)容,注意密碼必須是bytes格式,path表示提取到哪
          file.extractall(path='.',?pwd='123'.encode('utf-8'))

          運(yùn)行效果如下圖所示,提取成功。

          2920d002553ebd340830f12ff5348887.webp

          既然如此,那我不停嘗試所有可能的密碼組合去解壓縮不就行了嘛~

          a91bd7e1005ae53e25c115158c1fc05e.webp

          好了,開(kāi)始破解老文件的密碼。

          為了提高速度,我還加了多線程的代碼:

          import?zipfile
          import?itertools
          from?concurrent.futures?import?ThreadPoolExecutor

          def?extract(file,?password):
          ????if?not?flag:?return
          ????file.extractall(path='.',?pwd=''.join(password).encode('utf-8'))


          def?result(f):
          ????exception?=?f.exception()
          ????if?not?exception:
          ????????#?如果獲取不到異常說(shuō)明破解成功
          ????????print('密碼為:',?f.pwd)
          ????????global?flag
          ????????flag?=?False


          if?__name__?==?'__main__':
          ????#?創(chuàng)建一個(gè)標(biāo)志用于判斷密碼是否破解成功
          ????flag?=?True
          ????#?創(chuàng)建一個(gè)線程池
          ????pool?=?ThreadPoolExecutor(100)
          ????nums?=?[str(i)?for?i?in?range(10)]
          ????chrs?=?[chr(i)?for?i?in?range(65,?91)]
          ????#?生成數(shù)字+字母的6位數(shù)密碼
          ????password_lst?=?itertools.permutations(nums?+?chrs,?6)
          ????#?創(chuàng)建文件句柄
          ????zfile?=?zipfile.ZipFile("加密文件.zip",?'r')
          ????for?pwd?in?password_lst:
          ????????if?not?flag:?break
          ????????f?=?pool.submit(extract,?zfile,?pwd)
          ????????f.pwd?=?pwd
          ????????f.pool?=?pool
          ????????f.add_done_callback(result)

          然而,事情并沒(méi)有那簡(jiǎn)單……

          代碼跑一會(huì)兒,內(nèi)存爆了!

          26b104b4376fe5791506e9779dd9e8cd.webp

          b5df5869bf9dd0f79182fcb2ae1bc404.webp

          于是,為了找尋問(wèn)題所在,我就去查看了一下源碼,發(fā)現(xiàn)ThreadPoolExecutor默認(rèn)使用的是無(wú)界隊(duì)列。而程序中嘗試密碼的速度跟不上生產(chǎn)密碼的速度,就會(huì)把生產(chǎn)任務(wù)無(wú)限添加到隊(duì)列中。導(dǎo)致內(nèi)存被占滿。內(nèi)存直接飆到95:

          a8a04f4784120e97f8b5f9e7572b3599.webp

          找到病根兒,剩下的就是對(duì)癥下藥了。

          繼承并重寫(xiě)了ThreadPoolExecutor類中的_work_queue屬性,將無(wú)界隊(duì)列改成有界隊(duì)列,這樣就不會(huì)出現(xiàn)內(nèi)存爆滿的問(wèn)題,看代碼:

          import?queue
          from?concurrent.futures?import?ThreadPoolExecutor


          class?BoundedThreadPoolExecutor(ThreadPoolExecutor):
          ????def?__init__(self,?max_workers=None,?thread_name_prefix=''):
          ????????super().__init__(max_workers,?thread_name_prefix)
          ????????self._work_queue?=?queue.Queue(self._max_workers?*?2)?#?設(shè)置隊(duì)列大小

          用自定義的BoundedThreadPoolExecutor類替代前面代碼中的ThreadPoolExecutor。

          再次執(zhí)行……

          14260bdaec1c76fd1840a19fda5fe7bd.webp

          程序輸入如下圖內(nèi)容:

          e2ec4e53dc6951bb89227955e5c30127.webpBingo!破解成功!(原來(lái)密碼如此簡(jiǎn)單……dac688977276ec6fa6ba261c6d00ad68.webp)話說(shuō)回來(lái),畢竟這個(gè)壓縮包我是隱約知道它的位數(shù)和范圍(字母和數(shù)字),所以破解出來(lái)需要的時(shí)間是可以忍受的。如果有天你在網(wǎng)上找了一個(gè)無(wú)人認(rèn)領(lǐng)的加密壓縮包,想要一窺究竟但又并不知道它有多少位密碼,那我只能祝你好運(yùn)啦~如果文章對(duì)你有幫助,歡迎轉(zhuǎn)發(fā)/點(diǎn)贊/收藏~


          作者:盞茶作酒

          來(lái)源:未聞Code



          _往期文章推薦_

          用Python破解WiFi密碼




          瀏覽 65
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  免费观看日批视频 | 北条麻妃无码视频在线观看 | 婷婷精品无码 | 蜜桃无码视频小说网站 | 中文天堂网视频在线 |