我想改进应用程序检查另一个实例尚未运行的方式。现在我们正在使用已命名的互斥锁来检查正在运行的进程。
目标是防止安全攻击(因为这是安全软件)。我现在的想法是,“防弹”解决方案只是编写一个驱动程序,它将提供此类信息并通过签名二进制文件对客户端进行身份验证。
有人解决了这个问题吗? 你有什么意见和建议?
答案 0 :(得分:1)
首先,请允许我说,最终无法保护您的流程免受具有管理员或系统访问权限的代理的影响。即使您编写了一个拦截所有系统调用的rootkit驱动程序(这本身就是一个困难且不安全的实践),仍然有办法使用管理员访问权限。如果这是一个要求,您的设计是错误的。
如果您将安全流程设置为作为服务运行,则可以使用Service Control Manager启动它。 SCM将仅start一个实例,将监视它是否保持运行,允许您定义在崩溃时要执行的操作,并允许您查询当前状态。由于这是由SCM控制的,服务数据库只能由管理员修改,攻击过程无法欺骗它。
答案 1 :(得分:1)
我认为没有一种安全的方法可以做到这一点。无论您使用何种系统唯一或用户唯一的命名对象,恶意第三方软件仍然可以使用完全相同的名称,这将阻止您的应用程序启动。
如果使用检查当前正在执行的进程的方法,并检查是否没有运行同名的可执行文件 - 如果恶意软件具有相同的可执行文件名,则会遇到问题。如果您还检查该可执行文件的路径,则可以从不同位置运行您的应用程序的两个副本。
如果您在开始/结束时创建/删除文件 - 也可能会被欺骗。
我唯一想到的是,您可以通过将应用程序的所有逻辑放入COM对象,然后让GUI应用程序通过COM接口与其进行交互来实现所需的效果。这只会确保只有一个COM对象 - 您可以根据需要运行尽可能多的GUI客户端。请注意,我并不是说这是一种防弹方法 - 它可能有自己的漏洞(例如 - 有人可以通过简单地编辑注册表来使您的GUI客户端连接到第三方COM对象)。
所以,简短的回答 - 没有真正安全的方法来做到这一点。
答案 2 :(得分:0)
我使用命名管道¹,其名称源自必须唯一的条件:
如果命名管道创建失败,因为已存在具有该名称的管道,那么我知道实例已在运行。我使用第二个锁来检查线程(进程)的安全性。当应用程序终止时,命名管道将自动关闭(即使终止是由End Process命令引起的)。
¹这可能不是最好的通用选项,但在我的情况下,我最终会在应用程序生命周期的后期发送数据。
答案 3 :(得分:0)
在伪代码中:
numberofapps = 0
for each process in processes
if path to module file equals path to this module file
increment numberofapps
if number of apps > 1
exit
有关如何枚举进程的详细信息,请参阅msdn.microsoft.com/en-us/library/ms682623(VS.85).aspx。