Windows驱动开发Demo

驱动是运行在内核级别的程序,拥有掌控所有设备的权力,需谨慎使用!

大部分开发人员,在公司中都会使用公司提供的设备或干脆使用云电脑之类的进行工作办公。有时,公司为了安全就会对我们使用的操作系统做一些相应的改造,最简单的就是对办公文件的加解密。

我们来简单研究一下实现思路。要想实现办公文件的加解密,最理想的情况就是不影响用户的正常使用,那只要在用户打开之前进行文件解密,在关闭之后进行文件加密操作即可。但是如何实现呢?

这种操作所要达到的一个条件就是,拥有一定的权限,在用户态,若是操作系统没有提供相应的API是无法实现的(查了一下没查到),那么我们想要实现就必须在内核态考虑一下了。Windows提供了驱动开发的功能,这个功能可以将我们开发好的程序注册到操作系统的内核态去运行。

很好,我们找到了解决方案,简单说一下原理,以下是一个使用C开发的简易核心Demo:

#include <ntddk.h>

    // 定义驱动程序入口函数
    DRIVER_INITIALIZE DriverEntry;

    NTSTATUS DriverEntry(
    _In_ PDRIVER_OBJECT   DriverObject,
    _In_ PUNICODE_STRING  RegistryPath
    )
    {
        UNREFERENCED_PARAMETER(RegistryPath);

        // 注册驱动程序的卸载例程
        DriverObject->DriverUnload = UnloadDriver;

        // 注册文件操作的回调函数
        DriverObject->MajorFunction[IRP_MJ_CREATE] = InterceptFileOpen;
        DriverObject->MajorFunction[IRP_MJ_CLOSE] = InterceptFileClose;

        return STATUS_SUCCESS;
    }

    NTSTATUS InterceptFileOpen(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp
    )
    {
        // 在文件打开前执行的操作
        // 可以在这里加入文件解密逻辑
        // TODO: Add decryption code here

        // 继续原始文件打开操作
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DeviceObject, Irp);
    }

    NTSTATUS InterceptFileClose(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp
    )
    {
        // 在文件关闭后执行的操作
        // 可以在这里加入文件加密逻辑
        // TODO: Add encryption code here

        // 继续原始文件关闭操作
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DeviceObject, Irp);
    }

    VOID UnloadDriver(
    _In_ PDRIVER_OBJECT DriverObject
    )
    {
        // 卸载驱动程序时的清理操作
    }

这只是一个简单的示例,用于演示如何注册文件系统过滤驱动程序,并在文件打开和关闭时插入一些加解密操作。这样就达到了我们的要求,接下来只要注册到操作系统就可以了,Windows提供使用*.inf来进行安装(Inf是安装描述文件):

[Version]
Signature="$WINDOWS NT$"
Class=SampleFilter
ClassGuid={your-guid-here}
Provider=%ManufacturerName%
DriverVer=10/13/2023,1.0.0
CatalogFile=mydriver.cat

[SourceDisksFiles]
[SourceDisksFiles.amd64]
[SourceDisksFiles.x86]

[DestinationDirs]
DefaultDestDir = 12

[Manufacturer]
%ManufacturerName% = Standard,NTx86,NTamd64

[Standard.NTx86]
%DeviceDesc% = SampleDriver_Inst, ROOT\SampleFilter

[Standard.NTamd64]
%DeviceDesc% = SampleDriver_Inst, ROOT\SampleFilter

[Standard.NTx86.Services]
AddService = SampleDriver,, SampleDriver.Service

[Standard.NTamd64.Services]
AddService = SampleDriver,, SampleDriver.Service

[SampleDriver.Service]
DisplayName    = %ServiceName%
ServiceType    = 1
StartType      = 3
ErrorControl   = 1
ServiceBinary  = %12%\sampledriver.sys
LoadOrderGroup = Extended Base

[SampleDriver_Inst]
CopyFiles = DriverFiles

[DriverFiles]
sampledriver.sys

[Strings]
ManufacturerName="Your Manufacturer"
DeviceDesc="Sample Filter Driver"
ServiceName="SampleDriver

请注意以下几点:

  • 将 %ManufacturerName% 替换为制造商名称。
  • %DeviceDesc% 是设备的描述,可以根据实际情况修改。
  • %ServiceName% 是服务的名称。
  • 按需修改 ServiceType、StartType、ErrorControl,以适应您的驱动程序需求。
  • ServiceBinary 应指向您的驱动程序文件的路径。
  • 替换 CatalogFile 为您的驱动程序的数字签名目录(如果有的话)。

要安装此驱动程序,可以使用 devcon 工具,或者在设备管理器中选择 “更新驱动程序” 并选择 INF 文件。但请注意,驱动程序开发和部署需要小心谨慎,特别是在生产环境中,应遵循最佳实践和安全性规则。这个Demo只是为了演示原理。

好了,那就这样~


Windows驱动开发Demo
https://blog.cikaros.top/doc/ec463b4e.html
作者
Cikaros
发布于
2023年10月13日
许可协议