用Python写一个zip文件的密码破解程序
最近在读《python绝技:运用python成为顶级黑客》一书,文中有如何运用Python中zipfile自带的方法破解zip文件。短短的十几行代码就将一个程序实现了。下面给出书中所用的代码:
# -*- coding:utf- -*-
import zipfile
import threading def extractFile(zFile,password):
'''
破解方法
:param zFile: 需要破解的文件
:param password: 尝试密码
:return:
'''
try:
zFile.extractall(pwd=password)
print("Found Passwd:", password)
return password
except:
pass def main():
'''
主函数
'''
zFile=zipfile.ZipFile('python.zip')
passFile=open('14365003.txt')
for line in passFile.readlines():
password = line.strip('\n')
t = threading.Thread(target=extractFile, args=(zFile, password))
t.start() if __name__=='__main__':
main()
上文中的python.zip是我的测试文件,而14365003.txt则是字典文件。然而当我运行这段程序时,我压缩的密码是字典文件中的第一行,然而程序跑了十几分钟还没有停下来,我瞬间觉得有些不对劲了。
仔细看完代码,这段小程序会遍历字典文件中的每一行密码去尝试,然而很令人难过的是,当某一个子线程尝试匹配到正确密码时,程序并不会停止,而是继续完成其他线程,甚至开会继续开启经常直至遍历完整个字典文件。大胆的查看了一下我的字典文件大小,额162MB,原因瞬间找到。
那么怎么解决呢?去修改字典文件显然是不可能的,毕竟字典文件很可能更大。那么能不能试着在子线程找到正确密码时,由父线程杀死所有线程呢?或者类似于Ctrl+C这样的指令去终止程序执行呢?首先,网上查阅后发现Python一般情况下不允许杀死线程,通常是发送信号来终止。而当去尝试终止程序执行时,也不能成功。
几经周折,最终想到了一个办法,通过event来通信,当子线程成功执行时,通知父线程不再开启其他线程。最终代码如下:
# -*- coding:utf- -*-
import zipfile
import threading def extractFile(zFile,password):
'''
破解方法
:param zFile: 需要破解的文件
:param password: 尝试密码
:return:
'''
try:
zFile.extractall(pwd=password)
print("Found Passwd:", password)
event.set()
return password
except:
event.wait()
pass def main():
'''
主函数
'''
zFile=zipfile.ZipFile('python.zip')
passFile=open('14365003.txt')
for line in passFile.readlines():
if event.isSet():
print "End"
return
else:
password = line.strip('\n')
t = threading.Thread(target=extractFile, args=(zFile, password))
t.start() if __name__=='__main__':
event=threading.Event()
main()
测试该程序,这次破解出密码只需要35秒了。
另外还有什么更好的方法吗?希望能告诉我。
用Python写一个zip文件的密码破解程序的更多相关文章
- Python的一个解释凯撒密码的程序
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' { Title:CaserCode Author:naiquan Type:crypto Detai ...
- python实践项目十:zipfile模块-将一个文件夹备份到一个 ZIP 文件
描述:将指定路径下的某文件夹备份到一个zip文件 代码: #!/usr/bin/python # -*- coding: UTF-8 -*- # backupToZip - Copies an ent ...
- Python实践练习:将一个文件夹备份到一个 ZIP 文件
题目 项目要求:假定你正在做一个项目,它的文件保存在 C:\AlsPythonBook 文件夹中.你担心工作会丢失, 所以希望为整个文件夹创建一个 ZIP 文件, 作为"快照" . ...
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- Python写一个自动点餐程序
Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- Advanced Archive Password Recovery (ARCHPR) 是一个强大的压缩包密码破解工具,适用于ZIP和RAR档案的高度优化的口令恢复工具。
RAR压缩文件密码破解工具是一款简单易用的RAR文档和ZIP文档密码破解软件,如果你不小心忘了解压密码或是下载的RAR文件需要密码,那么均可以使用本软件进行暴力破解.不管WinRAR /RAR 的密码 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- [py]python写一个通讯录step by step V3.0
python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...
随机推荐
- [SDOI2017]天才黑客
题目大意 给一张有向图,再给一颗字典树,有向图上的每条边有一个非负边权还有一个字典树上的字符串,从一条边到另一条边的代价是那条边的边权和这两个字符串的最长公共前缀,问从1到其他点的最短路. 题解 一看 ...
- 洛谷P5155 [USACO18DEC]Balance Beam(期望,凸包)
你以为它是一个期望dp,其实它是一个凸包哒! 设平衡木长度为\(L\),把向右走平衡木那个式子写一下: \[dp[i]=\frac{dp[i+1]+dp[i-1]}{2}\] 然后会发现这是一个等差数 ...
- numba学习教程
一.对于python的基础介绍 Python是一种高效的动态编程语言,广泛用于科学,工程和数据分析应用程序..影响python普及的因素有很多,包括干净,富有表现力的语法和标准数据结构,全面的“电池包 ...
- Java程序设计第一次作业
虽说这学期Java比上学期的C语言要简单些许,但是初次面对java程序,还是有点难度的.
- js重点--原型链
通过将一个构造函数的原型对象指向父类的实例,就可以调用父类中的实例属性及父类的原型对象属性,实现继承. function animals(){ this.type = "animals&qu ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...
- Nuxt.js笔记
前置知识 SSR服务器渲染 Vue SSR(server side rendering)服务端渲染 和 Vue SPA(single page application)单页应用 Vue SSR-> ...
- vue的计算属性与方法的不同
计算属性 vue的模板里可以使用表达式,但是它的设计初衷是用于简单计算,在模板中放入太多逻辑会让模板过重且难以维护.例如: <div id="example"> {{ ...
- Python+Selenium+Unittest框架使用——Selenium——定位元素(二)
1.定位元素(id.name.class.link.partial link) (1)find_element_by_id() 用百度定位测试,用firebug查看定位元素 ,输入框的id为“kw”, ...
- 找出链表中倒数第K个结点
思路:两个指针,也是快指针和慢指针,先让快指针走k -1步,这时慢指针开始和快指针一起走到尾部.慢指针停止的点就是倒数第k个节点. public static ListNode findCountDo ...