【问题标题】:How Does a Windows Program Load a Kernel Driver Without Rebooting or Calling CreateServiceWindows 程序如何在不重新启动或调用 CreateService 的情况下加载内核驱动程序
【发布时间】:2015-04-30 10:17:11
【问题描述】:

我知道 Sysinternals 的 Process Explorer 会静默加载一个名为 PROCEXPxxx.SYS 的设备驱动程序。我想知道它是如何做到这一点的。对我来说,它看起来像是在我们的应用程序中静默捆绑内核模式组件的一个很好的例子。

首先,驱动程序是从 exe 动态创建的(可能作为资源)。

通过使用进程监视器检查注册表,我可以知道 PE 正在使用RegCreateKey 在HKLM\System\CurrentControlSet\Services\PROCEXPxxx 下手动创建密钥(然后立即将其删除,以便在驱动程序运行后不会留下任何东西)。

通过使用“dumpbin /imports procexp.exe”,我发现PE根本不导入CreateService。通过使用 API Monitor (http://www.rohitab.com/apimonitor),我确实确认了 CreateService 在我们运行时不会被调用。

那么,Process Explorer 如何在不重启和调用CreateService 的情况下优雅地静默加载驱动程序?

【问题讨论】:

  • 解决方案实际上可能并不优雅。请注意,kernel32.dll 函数一般只是简单地转发到 ntdll.dll,甚至 ntdll.dll 函数也可以内联到应用程序代码中,魔术发生在内核中,应用程序只需要执行SYSENTER 指令。
  • 也有可能,它使用了设备驱动程序安装功能(SetupDi*),而不是服务管理器功能。
  • Ben Voigt,SetupDi* 没有参与,因为 dumpbin 显示它甚至没有导入 setupapi.dll
  • 可以动态加载setupapi.dll。但是如果你真正需要的只是你自己的应用程序的解决方案,那么 CreateService 有什么问题,然后是 StartService?
  • 只是好奇,除了CreateService还有其他可能吗? PE 的特别之处在于它会在其驱动程序加载并运行时立即删除注册表项?不知何故,它也会从 system32\drivers 中删除 .sys 驱动程序文件。我们可以不调用StopService/DeleteService直接删除注册表项来删除驱动吗?我想 CreateService/DeleteService 应该配对

标签: windows registry device-driver process-explorer apimonitor


【解决方案1】:

经过一番研究,在我看来它正在调用NtLoadDriver() 来加载驱动程序。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2020-02-15
    • 2019-12-15
    • 1970-01-01
    • 2017-08-13
    • 2019-08-04
    • 2014-07-21
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多