暴力破解场景内存管理:Python登录爆破脚本内存溢出卡顿问题求助
内存耗尽的核心原因
你脚本卡顿的根本原因不是没有手动清理内存,是你把itertools.permutations返回的惰性迭代器强制转成了列表:
for i in list(perm):
permutations本身不会一次性生成所有排列组合,只会在遍历的时候逐一生成元素,转成列表会把所有排列结果全部加载到内存,只要你的字典稍大,比如有1万条单词,2元素排列就有1亿条结果,直接占满内存导致卡顿。
优化方案
不需要额外写条件语句手动清理内存,Python自带的引用计数机制会自动回收没有被引用的变量内存,只要做以下修改即可:
- 直接遍历
perm迭代器,不要转成列表,每次只加载一个排列组合到内存 - 匹配到目标用户名后直接终止所有循环,避免无效计算
- 删掉冗余的嵌套循环,原代码里对排列后的二元组做了两次重复遍历,完全没有必要
- 如果确实需要强制回收内存,可以在每次排列遍历结束后调用
gc.collect(),但绝大多数场景下不需要额外处理
修正后的代码
import sys from itertools import permutations import requests as req # 只有需要强制GC的时候才导入 # import gc symbols = '''0123456789_;.:=!@#$^*-''' symbols = list(symbols) # 注意原symbols里多写了一个0,已经删掉 crack = "User_name" found = None with open(sys.argv[1], encoding='utf-8') as wordlist: # 逐行读取避免大字典一次性加载,也可以直接用生成器表达式 words = (line.strip() for line in wordlist) perm = permutations(words, 2) # 直接遍历迭代器,不要转list for a, b in perm: for j in symbols: # 每次只生成两个需要验证的字符串,用完自动回收 attempt1 = a + j + b attempt2 = a + b + j # 这里替换成你实际的登录验证逻辑 if attempt1 == crack or attempt2 == crack: found = attempt1 if attempt1 == crack else attempt2 # 匹配到直接跳出所有循环 break if found: break # 强制GC的话可以在这里加,非必要 # gc.collect() if found: print(f"匹配到目标用户名: {found}") else: print("字典内未匹配到目标用户名")
额外注意事项
暴力破解属于未授权访问行为,仅可在你拥有合法授权的目标上使用,避免违反法律法规。
内容的提问来源于stack exchange,提问作者Chinese Billi
相关产品推荐
相关产品推荐

