You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows服务与内核驱动关联相关技术问题咨询

Windows服务与内核驱动关联问题解答

问题1:为何需手动启动两者?如何实现启动MyService.exe时自动加载MyDriver.sys

Windows服务和内核驱动是两个独立的服务控制管理器(SCM)条目:MyService属于用户态服务(类型SERVICE_WIN32_OWN_PROCESS),MyDriver是内核驱动服务(类型SERVICE_KERNEL_DRIVER),默认无关联逻辑,因此需要分别启动。

要实现启动MyService时自动加载驱动,只需在MyService的启动逻辑中主动调用SCM API触发驱动启动:

  1. 先通过CreateService将MyDriver注册为SCM中的服务项(类型必须设为SERVICE_KERNEL_DRIVER);
  2. 在MyService的ServiceMain函数中,调用OpenService打开MyDriver的服务句柄;
  3. 调用StartService启动驱动,完成后关闭句柄。

示例代码片段:

SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hDriverService = OpenService(hSCM, L"MyDriver", SERVICE_START);
if (hDriverService) {
    StartService(hDriverService, 0, NULL);
    CloseServiceHandle(hDriverService);
}
CloseServiceHandle(hSCM);

问题2:如何实现双向依赖(停止一方时自动停止另一方)

Windows SCM的原生依赖是单向的(比如A依赖B,启动A时自动启动B,但停止B不会触发A停止),双向联动需要手动添加逻辑:

  • 停止MyService时自动卸载驱动:在MyService的HandlerEx处理SERVICE_CONTROL_STOP请求时,调用ControlService给MyDriver发送SERVICE_CONTROL_STOP命令,触发驱动卸载流程。
  • 停止MyDriver时自动停止MyService:驱动无法直接操作用户态服务,可通过内核事件实现通知:
    1. 驱动中创建一个命名内核事件;
    2. MyService启动后打开该事件并启动监控线程等待事件触发;
    3. 当驱动收到停止请求时,设置该事件;
    4. MyService的监控线程检测到事件后,主动调用SetServiceStatus将自身状态设为SERVICE_STOP_PENDING,完成停止。

问题3:如何防护MyService.exe?ObCallback是否适用

MyService的防护可从多层面入手,ObCallback是可行的内核级防护方案:

  • ObCallback的适用性:这是内核态的对象回调机制,可在MyDriver中注册回调函数,监控进程对象的打开操作。通过过滤对MyService进程的访问请求,拒绝未授权进程获取MyService的进程句柄,从而防止注入、内存篡改等攻击。
  • 其他补充防护手段:
    • 修改MyService的安全描述符(SD),限制仅特定用户/组能启动、停止或修改服务;
    • 对MyService和MyDriver进行代码签名,启用Secure Boot强制驱动签名,阻止恶意驱动加载;
    • 使用Windows Defender Application Control(WDAC)创建规则,仅允许可信的MyService进程运行;
    • 在MyService中加入自身完整性校验逻辑,定期校验内存代码哈希,防止注入篡改。

内容的提问来源于stack exchange,提问作者CuriousDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:50:29