网络安全实验室:优化用户名密码爆破Python代码运行效率
优化Login.pyc批量验证的运行效率方案
1. 重构Login函数,摆脱sys.argv依赖
你当前修改sys.argv传参的方式会产生不必要的全局变量操作开销,完全不符合函数调用的高效模式。可以先反编译Login.pyc拿到源码,调整函数逻辑让它直接接收用户名和密码参数:
- 用
uncompyle6反编译:uncompyle6 Login.pyc > Login.py - 修改生成的
Login.py,把函数改成直接收参的形式:
def Login(user, password): # 保留原有的验证逻辑,仅把sys.argv的读取替换为参数传入 # 给函数添加返回值,方便批量验证时判断结果 if 验证条件成立: print('Login successful.') return True return False
之后直接导入修改后的Login函数调用,无需再操作sys.argv,调用效率会明显提升。
2. 多进程并行处理验证任务
密码遍历属于CPU密集型操作,Python的GIL会限制多线程的实际效率,改用多进程可以充分利用多核CPU资源:
from concurrent.futures import ProcessPoolExecutor import sys # 导入修改后的Login函数 from Login import Login def check_credentials(args): user, pwd = args return (user, pwd, Login(user, pwd)) def main(): # 一次性把所有用户名和密码读到内存,避免重复文件IO with open('users.txt', 'r') as f: users = [line.strip() for line in f if line.strip()] with open('passwords.txt', 'r') as f: passwords = [line.strip() for line in f if line.strip()] # 生成所有待验证的用户-密码组合 all_combinations = [(user, pwd) for user in users for pwd in passwords] # 启动多进程池,max_workers设为CPU核心数 with ProcessPoolExecutor(max_workers=sys.cpu_count()) as executor: for user, pwd, success in executor.map(check_credentials, all_combinations): if success: print(f"找到有效登录组合: {user} / {pwd}") # 找到目标后立即终止所有进程并退出 executor.shutdown(wait=False) sys.exit(0) if __name__ == '__main__': main()
3. 提前过滤无效密码
如果反编译后能得知Login的验证规则(比如密码长度、字符类型限制),提前过滤不符合规则的密码,减少不必要的函数调用:
# 示例:过滤长度小于6的密码 passwords = [pwd.strip() for pwd in f if pwd.strip() and len(pwd.strip()) >= 6]
4. 改用PyPy运行脚本
PyPy的JIT编译器对循环和函数调用的优化远优于CPython,直接用pypy3 your_script.py运行,不用修改代码就能获得2-5倍的速度提升,尤其适合这种大规模循环场景。
5. 深挖验证逻辑做针对性优化
如果反编译后发现Login的验证逻辑是哈希值对比(比如存储了用户名对应的密码哈希),可以直接提取每个用户的目标哈希,然后遍历密码计算哈希值对比,跳过Login函数的调用开销,这会是效率最高的方案:
# 假设反编译后得知各用户的正确哈希 target_hashes = {"admin": "abc123...", "user1": "def456..."} def check_hash(args): user, pwd = args if user not in target_hashes: return False # 用原函数相同的哈希算法计算密码哈希 hashed_pwd = hash_function(pwd) return hashed_pwd == target_hashes[user]
内容的提问来源于stack exchange,提问作者jdash
相关产品推荐
相关产品推荐

