2023年7月31日发(作者:)

⼀⼩段Python代码,破解加密zip⽂件的密码今天的⽂章来⾃

盏茶作酒 同学。他在⽼电脑中发现了⼀个加密的 zip ⽂件,于是⽤ Python 破解了⽂件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决⽅案。下⾯就来给⼤家分享⼀下他的操作。之前在家⾥的⽼电脑中,发现⼀个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,⽹上下载了很多破解密码的软件都没有效果,于是想到⾃⼰⽤Python写⼀个暴⼒破解密码的脚本。Python 有⼀个内置模块 zipfile 可以解压 zip 压缩包。先来测试⼀波:创建⼀个测试⽂件,压缩,设置解压密码为123。import zipfile# 创建⽂件句柄file = e("测试.zip", 'r')# 提取压缩⽂件中的内容,注意密码必须是bytes格式,path表⽰提取到哪tall(path='.', pwd='123'.encode('utf-8'))运⾏效果如下图所⽰,提取成功。既然如此,那我不停尝试所有可能的密码组合去解压缩不就⾏了嘛~好了,开始破解⽼⽂件的密码。为了提⾼速度,我还加了多线程的代码:import zipfileimport itertoolsfrom s import ThreadPoolExecutordef extract(file, password): if not flag: return tall(path='.', pwd=''.join(password).encode('utf-8'))def result(f): exception = ion() if not exception: # 如果获取不到异常说明破解成功 print('密码为:', ) global flag flag = Falseif __name__ == '__main__': # 创建⼀个标志⽤于判断密码是否破解成功 flag = True # 创建⼀个线程池 pool = ThreadPoolExecutor(100) nums = [str(i) for i in range(10)] chrs = [chr(i) for i in range(65, 91)] # ⽣成数字+字母的6位数密码 password_lst = ations(nums + chrs, 6) # 创建⽂件句柄 zfile = e("加密⽂件.zip", 'r') for pwd in password_lst: if not flag: break f = (extract, zfile, pwd) = pwd = pool _done_callback(result)然⽽,事情并没有那简单……代码跑⼀会⼉,内存爆了!于是,为了找寻问题所在,我就去查看了⼀下源码,发现ThreadPoolExecutor默认使⽤的是⽆界队列。⽽程序中尝试密码的速度跟不上⽣产密码的速度,就会把⽣产任务⽆限添加到队列中。导致内存被占满。内存直接飙到95:找到病根⼉,剩下的就是对症下药了。继承并重写了ThreadPoolExecutor类中的_work_queue属性,将⽆界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:import queuefrom s import ThreadPoolExecutorclass BoundedThreadPoolExecutor(ThreadPoolExecutor): def __init__(self, max_workers=None, thread_name_prefix=''): super().__init__(max_workers, thread_name_prefix) self._work_queue = (self._max_workers * 2) # 设置队列⼤⼩⽤⾃定义的BoundedThreadPoolExecutor类替代前⾯代码中的ThreadPoolExecutor。再次执⾏……程序输⼊如下图内容:Bingo!破解成功!(原来密码如此简单……)话说回来,毕竟这个压缩包我是隐约知道它的位数和范围(字母和数字),所以破解出来需要的时间是可以忍受的。如果有天你在⽹上找了⼀个⽆⼈认领的加密压缩包,想要⼀窥究竟但⼜并不知道它有多少位密码,那我只能祝你好运啦~

2023年7月31日发(作者:)

⼀⼩段Python代码,破解加密zip⽂件的密码今天的⽂章来⾃

盏茶作酒 同学。他在⽼电脑中发现了⼀个加密的 zip ⽂件,于是⽤ Python 破解了⽂件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决⽅案。下⾯就来给⼤家分享⼀下他的操作。之前在家⾥的⽼电脑中,发现⼀个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,⽹上下载了很多破解密码的软件都没有效果,于是想到⾃⼰⽤Python写⼀个暴⼒破解密码的脚本。Python 有⼀个内置模块 zipfile 可以解压 zip 压缩包。先来测试⼀波:创建⼀个测试⽂件,压缩,设置解压密码为123。import zipfile# 创建⽂件句柄file = e("测试.zip", 'r')# 提取压缩⽂件中的内容,注意密码必须是bytes格式,path表⽰提取到哪tall(path='.', pwd='123'.encode('utf-8'))运⾏效果如下图所⽰,提取成功。既然如此,那我不停尝试所有可能的密码组合去解压缩不就⾏了嘛~好了,开始破解⽼⽂件的密码。为了提⾼速度,我还加了多线程的代码:import zipfileimport itertoolsfrom s import ThreadPoolExecutordef extract(file, password): if not flag: return tall(path='.', pwd=''.join(password).encode('utf-8'))def result(f): exception = ion() if not exception: # 如果获取不到异常说明破解成功 print('密码为:', ) global flag flag = Falseif __name__ == '__main__': # 创建⼀个标志⽤于判断密码是否破解成功 flag = True # 创建⼀个线程池 pool = ThreadPoolExecutor(100) nums = [str(i) for i in range(10)] chrs = [chr(i) for i in range(65, 91)] # ⽣成数字+字母的6位数密码 password_lst = ations(nums + chrs, 6) # 创建⽂件句柄 zfile = e("加密⽂件.zip", 'r') for pwd in password_lst: if not flag: break f = (extract, zfile, pwd) = pwd = pool _done_callback(result)然⽽,事情并没有那简单……代码跑⼀会⼉,内存爆了!于是,为了找寻问题所在,我就去查看了⼀下源码,发现ThreadPoolExecutor默认使⽤的是⽆界队列。⽽程序中尝试密码的速度跟不上⽣产密码的速度,就会把⽣产任务⽆限添加到队列中。导致内存被占满。内存直接飙到95:找到病根⼉,剩下的就是对症下药了。继承并重写了ThreadPoolExecutor类中的_work_queue属性,将⽆界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:import queuefrom s import ThreadPoolExecutorclass BoundedThreadPoolExecutor(ThreadPoolExecutor): def __init__(self, max_workers=None, thread_name_prefix=''): super().__init__(max_workers, thread_name_prefix) self._work_queue = (self._max_workers * 2) # 设置队列⼤⼩⽤⾃定义的BoundedThreadPoolExecutor类替代前⾯代码中的ThreadPoolExecutor。再次执⾏……程序输⼊如下图内容:Bingo!破解成功!(原来密码如此简单……)话说回来,毕竟这个压缩包我是隐约知道它的位数和范围(字母和数字),所以破解出来需要的时间是可以忍受的。如果有天你在⽹上找了⼀个⽆⼈认领的加密压缩包,想要⼀窥究竟但⼜并不知道它有多少位密码,那我只能祝你好运啦~