看流星社区

 找回密码
 注册账号
查看: 2178|回复: 0

一句话让XueTr卸载不了我们的驱动

[复制链接]

该用户从未签到

发表于 2013-2-7 08:58:37 | 显示全部楼层 |阅读模式
作者:KiDebug
  1. /*
  2. * 作者:KiDebug
  3. * 空间:http://hi.baidu.com/KiDebug/
  4. */
  5. #include <ntddk.h>

  6. void testUnload(IN PDRIVER_OBJECT DriverObject)
  7. {
  8. }

  9. NTSTATUS testDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  10. {
  11.   Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  12.   Irp->IoStatus.Information = 0;
  13.   IoCompleteRequest(Irp, IO_NO_INCREMENT);
  14.   return Irp->IoStatus.Status;
  15. }

  16. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
  17. {
  18.   ULONG i;

  19.   for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  20.     DriverObject->MajorFunction[i] = testDefaultHandler;
  21.   
  22.   DriverObject->DriverUnload = testUnload;

  23.   return STATUS_SUCCESS;
  24. }



  25. 驱动卸载时,函数调用如下:
  26. kd> kp
  27. ChildEBP RetAddr  
  28. ee5deb30 805b1bde nt!IopDeleteDriver
  29. ee5deb4c 80523bf1 nt!ObpRemoveObjectRoutine+0xe0
  30. ee5deb70 804f5778 nt!ObfDereferenceObject+0x5f
  31. ee5dec14 8057a83d nt!IopUnloadDriver+0x28a
  32. ee5dec24 8053e6d8 nt!NtUnloadDriver+0xf
  33. ee5dec24 80500231 nt!KiFastCallEntry+0xf8
  34. ee5deca0 804f55df nt!ZwUnloadDriver+0x11
  35. ee5ded48 8057a83d nt!IopUnloadDriver+0xf1
  36. ee5ded58 8053e6d8 nt!NtUnloadDriver+0xf

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

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

  43.         MmUnloadSystemImage( driverObject->DriverSection );

  44.         PpDriverObjectDereferenceComplete(driverObject);
  45.     }

  46. 如果driverObject->DriverSection不为空的话,就会调用MmUnloadSystemImage把驱动映象从内核中卸掉
  47. 如果driverObject->DriverSection为空的话呢?
  48. 那当然就不会把把驱动映象从内核中卸掉了,驱动仍然在内核中,该干嘛干嘛
  49. 所以我们只要在驱动的DriverUnload函数里面添加一句代码就行:
  50. /*
  51. * 作者:KiDebug
  52. * 空间:http://hi.baidu.com/KiDebug/
  53. */
  54. #include <ntddk.h>

  55. void testUnload(IN PDRIVER_OBJECT DriverObject)
  56. {
  57.   DriverObject->DriverSection=NULL;
  58. }

  59. NTSTATUS testDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  60. {
  61.   Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  62.   Irp->IoStatus.Information = 0;
  63.   IoCompleteRequest(Irp, IO_NO_INCREMENT);
  64.   return Irp->IoStatus.Status;
  65. }

  66. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
  67. {
  68.   ULONG i;

  69.   for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  70.     DriverObject->MajorFunction[i] = testDefaultHandler;
  71.   
  72.   DriverObject->DriverUnload = testUnload;

  73.   return STATUS_SUCCESS;
  74. }
复制代码
用InstDrv.exe加载编译后的驱动,依次点击安装、启动、停止、卸载,然后用XueTr测试一下,发现虽然能显示test.sys的存在,但菜单里面“卸载驱动(危险)”已经变灰,无法点击了。
虽然是自己在做题时根据MJ的语录翻的WRK,不知道上面这文章会不会是火星或抄袭了…还请大家指正。。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-24 10:05

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表