序
本文继续记录和学习Python有趣的应用:借助Python脚本暴力破解ZIP加密文件的密码。虽然有相关工具ARCHPR,可以实现对RAR、ZIP等压缩加密文件的可视化暴力破解,但主要是为了学习Python编程应用。
Python语法
既然初衷是学习Python编程,自然要学习这个实际应用场景的编码过程中遇到的相关语法知识。
这里推荐一个Python语法的官方网站:Python的官方中文文档,可以在本地下载。
自定义迭代器
迭代是Python最强大的功能之一,也是访问***元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从***的第一个元素开始访问,直到所有元素都被访问。迭代器只能前进不能后退。迭代器有iter基本方法:iterator()和next()。
1.迭代器对象可以由常规for语句遍历:
2.您也可以使用next()函数:
3.Python支持编写类来定制迭代器。如何定制迭代器:
在自定义的类中添加了__iter__魔法方法可取得迭代器;在自定义的类中通过__next__魔法方法指出所有的数据。
看一个定制迭代类的简单例子:
代码运行效果:
Python多线程
线程是CPU分配资源的基本单位,但当一个程序开始运行时,它就变成了一个进程,一个进程就相当于一个或多个线程。没有多线程编程的时候,一个进程也是一个主线程,但是有多线程编程的时候,一个进程包含多个线程,包括主线程。使用线程可以实现程序的并发。关于Python多线程的快速介绍,请参考python3多线程编程。
3 python 3线程中两个常用的模块是:
(1)_thread;(2)threading (推荐使用)
线程模块已经被放弃,用户可以使用线程模块来代替。因此,Python3中不能再使用“线程”模块。为了兼容,Python3将thread重命名为“_thread”。
1。函数创建多线程
Python3提供了内置的模块线程。线程,可以很容易地创建多线程。穿线。Thread()通常接收两个参数:
1)线程函数名:线程放在后台要执行的函数是用户自定义的,不要加()为主;
2)线程函数的参数:线程函数名所需要的参数,作为元组传入。如果参数不是必需的,您可以不指定它们。
让我们看一个简单的多线程例子:
代码运行效果:
2。类创建多线程
首先,自定义一个类。这个定制类有两个要求:
1)必须继承 threading.Thread 这个父类;2)必须重写 run() 这个方法:run() 方法相当于第一种方法中的线程函数,可以写自己需要的业务逻辑代码,在start()后将会调用。
看一看示例代码:
3,join()方法
多线程join()的作用是调用join()的线程阻塞执行,直到一个线程结束。看一看示例代码:
代码运行效果:
4。线程同步-锁
当一个进程有多个线程的时候,它们独立做自己的任务是没问题的,但是既然属于同一个进程,那么它们总是有一定的关系的。例如,如果多个线程必须修改某个数据,可能会出现意想不到的结果。为了确保正确的操作,有必要引入锁来同步线程。
Python3中的线程模块提供了RLock锁(重入锁):
对于某一时间只能让一个线程操作的语句放到 RLock 的 acquire 方法 和 release 方法之间;即 acquire() 函数相当于给 RLock 锁 上锁,而 release() 函数相当于解锁。
看一个简单的演示案例:
代码运行效果:
5。多线程函数概要:
Python脚本
ZIP加密文件的密码爆炸将从单线程和多线程两个角度实现。
单线数字爆破
首先,生成一个ZIP压缩文件密码。用数字密码(“101”)加密的zip,压缩文件为图片pasword.png(注意勾选了“ZIP的传统加密”选项,以下代码不支持WinRAR新的默认加密方式),如下图所示:
爆破密码的脚本也比较简单,直接加载代码:
以上代码没什么需要特别解释的,简单补充两点:上面的代码没有什么特别需要解释的。简单补充两点:
需要注意的是在爆破过程需要使用异常处理机制避免密码错误时程序直接终止;对于 zipfile 库的用法有疑问请参见官方文档:ZipFile数据压缩与存档。
让我们直接看看在Pycharm中运行脚本的效果:
单线程字符爆炸
我们先来看看剧本:
将 password.png 重新压缩并将解压密码设置为 “ab12” 数字与字母组合的字符串,上述利用自定义迭代器生成的字符组合范围太广了,爆破起来可能跑到天荒地老……故演示此代码时我依据已知的密码对代码做了如下更改:Password.png将被重新压缩,解压缩密码将被设置为“ab12”字符串的数字和字母。上述自定义迭代器生成的字符组合范围太广,可能会永远结束...所以在演示这段代码时,我根据已知密码对代码做了如下修改:
设置缩小字符范围:letters = ‘abcd0123456789’;设置缩小遍历的字符串长度:for password in MyIterator(3, 4)。
我们来看看脚本的运行效果,它运行了78秒:
多线程字典爆炸
直接脚本:
代码运行效果:代码运行效果:
摘要
我感觉我上一个多线程脚本其实意义不大,仅仅是为了简单学习多线程...因为这个程序中的每次密码尝试都是单线程的,而尝试密码是否正常的逻辑函数extractfile()非常简单,所以不需要打开单线程浪费资源,除非要处理的逻辑函数extractfile()执行非常耗时的操作(比如下载文件,或者每次执行extractfile()函数都是单个大的)。
本文来自果味果冻投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/478722.html