Python -优化代码以迭代.txt文件,将每一行作为另一个程序的参数传递(子处理?)

eanckbw9  于 2023-03-06  发布在  Python
关注(0)|答案(1)|浏览(104)

在我的网络安全实验室中,我必须编写一个python程序来遍历一个.txt密码文件和一个.txt用户名文件,并将它们与Login.pyc文件(以作为参数)进行比较,如果匹配正确,则返回“Login successful.”。

我尝试使用subprocess模块在命令行上运行python3 Login.pyc <user> <password>,密码文件中有100,000个密码,因此显然花费了非常长的时间。

import subprocess

if __name__ == "__main__":

  gang = open("gang")               #usernames .txt file (20 lines)
  pws = open("PwnedPWs100k")        #passwords .txt file  (100,000 lines)

  for name in gang:
    print("USER = ", name)
    
    for item in pws:
      
      output = subprocess.run(["python3", "Login.pyc", "{}".format(name.rstrip()), "{}".format(item.rstrip())], capture_output=True, text=True).stdout.strip("\n")
      
      if output == 'Login successful.':
        print("USER:" + name + "PASSWORD:" +item)
        break

   pws.close()
   gang.close()

UPDATE:我现在从Login.pyc导入Login()函数,因为它使用命令行参数,所以我在嵌套循环中更新sys.argv变量,并将它们传递给Login()函数,但是这与我以前的方法花费的时间类似。

if __name__ == "__main__":

  with open("gang") as gang:
    with open("PwnedPWs100k") as pws:
      sys.argv = [sys.argv[0], 1, 2]

      for name in gang:
        sys.argv[1] = name.rstrip()

        for item in pws:
          sys.argv[2] = item.rstrip()

          while not Login.Login():
            continue
          else:
            print("USER:" + name + "PASSWORD:" +item)
            break
'''

Any ideas on optimizing the runtime?
q3aa0525

q3aa05251#

Subprocessmultiprocessing是很好的模块,但它们似乎不是完成这项工作的合适工具。
启动一个新的python解释器和做一些导入和函数定义的开销会让你很难受,不需要做超过几次。
我不能简单地导入Login()函数,因为它是加密的。
我拒绝这个前提。两次。
当你说“加密”时,我相信你的意思是源文本已经被编译成字节码。这不是一个障碍。
只需要import Login,然后用dir(Login)(甚至help(Login))四处看看。我打赌像check_password这样的函数会跳出来。调用它。200万次。在同一个过程中。
此外,dis.dis()也是可用的。因此,您可以看到“if name is main:“保护程序运行了什么,也可以看到check_password中发生了什么。它为您提供了足够的信息,让您编写自己的源代码来执行相同的检查。我敢肯定,这正是您的教授希望您最终获得的见解。
https://docs.python.org/3/library/dis.html
顺便说一句,现在谁会写像gang.close()这样的东西呢?已经使用with open...上下文管理器了。
支持import和类似操作的库不止一个,看看pypi,它有一个完整的生态系统,包括标准的importlib,致力于理解二进制字节码工件。
请注意,在生成和使用.pyc文件时,可能需要使用相同的python解释器版本,但尝试的数量有限:3.8,3.9,还有一些,不会太久的。
也许第一次不会完全顺利。别担心。像一个攻击者一样思考。你是木槌。
构造一些与想象中的Login.py * 相似 * 的源代码。将其转换为.pyc字节码。* 假装 * 看不到源代码。利用字节码。
如果你不太喜欢,调整一下源,产生另一个。pyc,泡沫,重复,直到你可以自信地通过这些沃茨航行。

相关问题