【问题标题】:best method to detect win32 services creation and deletion检测win32服务创建和删除的最佳方法
【发布时间】:2018-10-25 19:40:00
【问题描述】:

我正在尝试构建一个工具来使用 C++ 监控服务 我想在不连续使用 EnumServicesStatusExW 并将结果数组与前一个数组进行比较的情况下检测新添加的服务和服务的删除

所以我来了两个函数 SubscribeServiceChangeNotifications , NotifyServiceStatusChangeA

我不知道哪个更好用,我在 ProcessHacker 的导入中看到并在导入中没有找到它们,所以我假设 ph 使用了不同的方法

【问题讨论】:

  • 如果 ProcessHacker 不使用 SCM 监控功能,它可能使用虚拟设备驱动程序来监控系统活动,类似于 SysInternals Process Monitor 的做法。另一方面,应用程序不必使用其导入表来使用 DLL 函数。它可以在运行时动态加载它们,这不会显示在导入表中。

标签: c++ service


【解决方案1】:

SubscribeServiceChangeNotifications() 可以使用SC_EVENT_DATABASE_CHANGE 事件类型检测正在添加和删除的服务。此方法在 Windows 8 及更高版本中可用。

NotifyServiceStatusChange() 还可以使用SERVICE_NOTIFY_CREATEDSERVICE_NOTIFY_DELETED 通知掩码检测正在添加和删除的服务。此方法在 Windows Vista 及更高版本中可用。

否则,您可以监视 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 注册表项的子项更改,例如使用 REG_NOTIFY_CHANGE_NAME 过滤器的 RegNotifyChangeKeyValue()。此方法在 Windows 2000 及更高版本中可用。

因此,与其说是“哪种方法最好”,不如说是“哪种方法适合我的应用程序运行的 Windows 版本”。您的应用程序可以利用所有 3 种方法。通过GetProcAddress() 使用动态加载,或编译器的延迟加载功能(如果有),您可以在运行时检查 DLL 函数是否存在并采取相应措施。如果SubscribeServiceChangeNotifications()存在则使用它,否则如果NotifyServiceStatusChange()存在则使用它,否则如果RegNotifyChangeKeyValue()存在则使用它。

【讨论】:

  • 很好,专门监控注册表项
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2015-12-19
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多