如何检查另一个程序是否在运行?使用“open”无效
我想写一个程序,如果某个特定的程序正在运行,就不让你继续。在这个例子中,如果 Cheat Engine.exe 这个程序打开了,你就不能继续。
我觉得代码应该像这样:
def openedprogram():
with open('Cheat Engine.exe', 'r') as f:
print("You have Cheat Engine Open! Close and uninstall it before continuing!")
else:
continue()
但是这段代码出现了一些错误。我试着把“Else:”去掉了,但又出现了一个错误,说 Cheat Engine.exe 不是一个有效的目录。希望能得到一些帮助!谢谢。
2 个回答
你的问题问的是一件事(程序是否“运行”),而你的代码检查的是另一件事(你能否成功打开一个文件来读取),同时你的错误信息和问题的内容又在讨论另一件事(某个可执行文件是否“安装”)。
在你搞清楚这些不同问题之间的区别之前,你根本无法写出一个能实现你想要功能的程序(无论那是什么)。
打开一个文件只是告诉你某个特定名字的文件在某个位置是否存在,并且你是否有权限访问它。这对防止“作弊”工具在你的程序或游戏运行时被使用是没什么用的。
你可能会通过检查路径(PATH)来看看“cheat.exe”程序是否在其中找到一些非常有限的成功。然而,这样做其实很无聊。因为只要稍微改个名字,把程序放在一个不在路径中的文件夹里,几乎没有技术门槛。估计一个十岁的小孩在玩Windows游戏时,五分钟内就能破解这个策略(“成就解锁!”)。
像“魔兽世界”这样的程序有相当复杂的“守卫”技术,试图在游戏运行时阻止其他程序(比如“Glider”或“Shadowbot”)的运行。这些程序当然可以安装在任何目录下,使用任何名字,并且在运行时可以在进程列表中改名。这些“作弊”程序基本上使用了调试器所用的相同操作系统功能(在MacOS X下是ptrace接口,Windows下有类似的东西)。这些功能允许像gdb和strace这样的程序“窥视”另一个程序的地址空间,并“插入”值。因此,它们通过查看程序存储用户界面某些模型信息的位置(比如目标的位置)并将事件插入到操作系统通常放置键盘和鼠标事件的缓冲区中(从而模拟用户交互并自动化这些交互)来工作。
理论上,“守卫”可以尝试扫描进程表寻找某些特征(类似于杀毒软件),甚至可能尝试使用类似的“调试”接口来寻找被禁止程序的痕迹。
然而,最终没有硬件的支持(像臭名昭著的TPM——受信任的平台模块)你是赢不了这个游戏的,而这种硬件目前在普通消费市场(比如通用的PC和Mac)上是不可用的。
不过,嘿,祝你玩得开心。
这几乎是不可能做到的(可以参考杀毒软件和防黑客注入的情况),但你大致上可以查看一下你的进程列表中是否有这个进程的名字。
像这样的代码可以获取当前正在运行的进程:
import os
import psutil # http://code.google.com/p/psutil/
import time
def get_procs():
while 1:
procs = psutil.get_process_list()
procs = sorted(procs, key=lambda proc: proc.name)
for proc in procs:
yield proc.name