我如何知道何时创建进程并阻止它在Windows中执行或终止?

时间:2013-11-25 12:20:27

标签: c# c++ windows

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您可以在C ++或C#中实现此功能,但确实不重要。选择一个你最舒服的。这是一个算法:

  • 设置计时器或计划任务或类似的任务,偶尔会执行一次代码
  • 枚举流程
  • 对于每个找到的进程,请根据列入白名单的词典检查名称
  • 尝试杀死进程

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

现在要了解的事情:

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

鉴于最后一段,您尝试实施的解决方案非常基础。没有什么能阻止用户杀死你的应用程序。或者将病毒应用程序重命名为标准内容。它看起来非常像“通过默默无闻的安全”,这有一些好处,但在防御力方面确实很弱。

答案 2 :(得分:1)

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

当然,你需要让这个DLL尽可能轻量级,因为它将被加载到每个进程中。但我仍然认为这比不断轮询或IAT补丁更加苗条。