让XueTr卸载不了我们的驱动

本文介绍了一个防止驱动被XueTr卸载的方法。通过在驱动的DriverUnload函数中设置DriverObject->DriverSection为NULL,可以阻止nt!IopDeleteDriver调用MmUnloadSystemImage卸载驱动。加载编译后的驱动并测试,XueTr的“卸载驱动(危险)”选项会变灰,无法执行卸载操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上代码溜溜:


#include <ntddk.h>
void testUnload(IN PDRIVER_OBJECT DriverObject)
{
}

NTSTATUS testDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
  Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  Irp->IoStatus.Information = 0;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);
  return Irp->IoStatus.Status;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
  ULONG i;

  for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    DriverObject->MajorFunction[i] = testDefaultHandler;
  
  DriverObject->DriverUnload = testUnload;

  return STATUS_SUCCESS;
}

驱动卸载时,函数调用如下:


kd> kp
ChildEBP RetAddr  
ee5deb30 805b1bde nt!IopDeleteDriver
ee5deb4c 80523bf1 nt!ObpRemoveObjectRoutine+0xe0
ee5deb70 804f5778 nt!ObfDereferenceObject+0x5f
ee5dec14 8057a83d nt!IopUnloadDriver+0x28a
ee5dec24 8053e6d8 nt!NtUnloadDriver+0xf
ee5dec24 80500231 nt!KiFastCallEntry+0xf8
ee5deca0 804f55df nt!ZwUnloadDriver+0x11
ee5ded48 8057a83d nt!IopUnloadDriver+0xf1
ee5ded58 8053e6d8 nt!NtUnloadDriver+0xf


在nt!IopDeleteDriver中,有如下的判断代码(WRK,/base/ntos/io/iomgr/objsup.c 787行):

   
 if (driverObject->DriverSection != NULL) {
        //
        // Make sure any DPC's that may be running inside the driver have completed
        //
        KeFlushQueuedDpcs ();

        MmUnloadSystemImage( driverObject->DriverSection );

        PpDriverObjectDereferenceComplete(driverObject);
    }

如果driverObject->DriverSection不为空的话,就会调用MmUnloadSystemImage把驱动映象从内核中卸掉
如果driverObject->DriverSection为空的话呢?
那当然就不会把把驱动映象从内核中卸掉了,驱动仍然在内核中,该干嘛干嘛
所以我们只要在驱动的DriverUnload函数里面添加一句代码就行:



#include <ntddk.h>
void testUnload(IN PDRIVER_OBJECT DriverObject)
{
  DriverObject->DriverSection=NULL;
}

NTSTATUS testDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
  Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  Irp->IoStatus.Information = 0;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);
  return Irp->IoStatus.Status;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
  ULONG i;

  for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    DriverObject->MajorFunction[i] = testDefaultHandler;
  
  DriverObject->DriverUnload = testUnload;

  return STATUS_SUCCESS;
}


卸载函数时,函数调用如下:


kd> kp  
 ChildEBP RetAddr    
 ee5deb30 805b1bde nt!IopDeleteDriver  
 ee5deb4c 80523bf1 nt!ObpRemoveObjectRoutine+0xe0  
 ee5deb70 804f5778 nt!ObfDereferenceObject+0x5f  
 ee5dec14 8057a83d nt!IopUnloadDriver+0x28a  
 ee5dec24 8053e6d8 nt!NtUnloadDriver+0xf  
 ee5dec24 80500231 nt!KiFastCallEntry+0xf8  
 ee5deca0 804f55df nt!ZwUnloadDriver+0x11  
 ee5ded48 8057a83d nt!IopUnloadDriver+0xf1  
 ee5ded58 8053e6d8 nt!NtUnloadDriver+0xf 


在nt!IopDeleteDriver中,有如下的判断代码(WRK,/base/ntos/io/iomgr/objsup.c 787行):
if (driverObject->DriverSection != NULL) {  
         //  
        // Make sure any DPC's that may be running inside the driver have completed  
         //  
         KeFlushQueuedDpcs ();  

         MmUnloadSystemImage( driverObject->DriverSection );  
        PpDriverObjectDereferenceComplete(driverObject);  
    } 
 


如果driverObject->DriverSection不为空的话,就会调用MmUnloadSystemImage把驱动映象从内核中卸掉 ,如果driverObject->DriverSection为空的话呢? 那当然就不会把把驱动映象从内核中卸掉了,驱动仍然在内核中,该干嘛干嘛 ,所以我们只要在驱动的DriverUnload函数里面添加一句代码就行: 
void testUnload(IN PDRIVER_OBJECT DriverObject)  
 {  
   DriverObject->DriverSection=NULL;  
 }  

NTSTATUS testDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)  
 {  
   Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;  
   Irp->IoStatus.Information = 0;  
   IoCompleteRequest(Irp, IO_NO_INCREMENT);  
   return Irp->IoStatus.Status;  
 }  

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)  
 {  
   ULONG i;  

   for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)  

     DriverObject->MajorFunction[i] = testDefaultHandler;  

     DriverObject->DriverUnload = testUnload;  
     return STATUS_SUCCESS;  
 } 
 
用InstDrv.exe加载编译后的驱动,依次点击安装、启动、停止、卸载,然后用XueTr测试一下,发现虽然能显示test.sys的存在,但菜单里面“卸载驱动(危险)”已经变灰,无法点击了。虽然是自己在做题时根据MJ的语录翻的WRK,不知道上面这文章会不会是火星或抄袭了…还请大家指正。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值