【问题标题】:How can i know when a process is being created and stop it from being executed or terminated it in windows?我如何知道何时创建进程并阻止它在 Windows 中执行或终止它?
【发布时间】:2013-11-25 12:20:27
【问题描述】:

我正在尝试创建一个应用程序,它会根据白名单检查所有正在运行的进程,并且任何不在列表中的进程都将被终止。
我的想法是首先尝试使用tasklikst 命令并获取列表,让我们说每秒并对照列表进行检查。
然后我认为最好更快地检查,当一个进程创建但尚未执行时,我们根据我们的列表检查它,然后如果不在列表中则终止它。 那我该怎么办呢?
您建议采用哪种方式来解决此问题?
我也对使用哪种语言表示怀疑,C++ 还是 C#? 在这种情况下会有什么不同吗?

【问题讨论】:

标签: c# c++ windows


【解决方案1】:

C# 中最简单的方法是定期使用 Process.GetProcesses,然后使用 Process.Kill 杀死任何你想死的东西。但是,请注意,当您杀死它时,该过程可能正在做一些工作 - 它只会帮助您对抗游戏(等),而不是对抗恶意软件。另外,不要忘记用户可以将 exe 文件重命名为“notepad.exe”之类的名称。如果这是一个问题,您可以检查可执行文件的完整路径,而不仅仅是文件名。

如果您想要一种更智能的方式,无需轮询,您可以在启动过程调用上创建一个挂钩 - 请参阅Monitor process start in the system。这样,您实际上可以从一开始就阻止进程运行。

【讨论】:

    【解决方案2】:

    一种技术是使用SetWindowsHookEx 创建一个全局钩子DLL,它将被注入到每个进程中。这样,您将收到任何新流程的通知,并且您可以采取任何您想要的行动。

    当然,考虑到它将永远加载到每个进程中,您需要使该 DLL 尽可能轻量级。但我仍然认为这会比不断轮询或 IAT 修补更苗条。

    【讨论】:

    • 我可以使用 SetWindowsHookEx 挂钩 createprocess 函数吗?如果是,如何以及如果不是,我如何挂钩 createprocess?
    【解决方案3】:

    您可以在 C++ 或 C# 中实现这一点,这真的 无关紧要。选择一个你最舒服的。这是一个算法:

    • 设置一个计时器或计划任务或类似的东西会不时执行代码
    • 枚举进程
    • 对于每个找到的进程,根据白名单字典检查名称
    • 尝试终止进程

    在 C# 中,您可以使用Process class 来枚举和杀死。

    现在要了解的事情:

    • 您的应用程序可能没有足够的权限来枚举或终止其他应用程序
    • 您的代码可能需要管理员权限
    • 如果在设置了组策略的 Active Directory 中运行,事情可能会变得复杂
    • 病毒或其他不受欢迎的应用程序可以将其代码“注入”到知名或无辜的应用程序中(即您的白名单应用程序之一)
    • 您将无法杀死大多数系统任务,所以不要尝试这样做
    • 检查对全球化的支持,进程名称可以更改
    • 仅依赖名称是一种糟糕的做法。如果你想检查真实性,你应该依赖一些加密签名,当然,随着应用程序的更新,维护起来很痛苦。

    鉴于最后一段,您尝试实施的解决方案非常基本。没有什么可以阻止用户杀死您的应用程序。或者将病毒应用程序重命名为标准。看起来很像“隐蔽安全”,有一定的好处,但防御力实在是太弱了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多