让XueTr卸载不了我们的驱动
来源:互联网 发布:学尤克里里用什么软件 编辑:程序博客网 时间:2024/04/29 08:32
先上代码溜溜:
#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> kpChildEBP RetAddr ee5deb30 805b1bde nt!IopDeleteDriveree5deb4c 80523bf1 nt!ObpRemoveObjectRoutine+0xe0ee5deb70 804f5778 nt!ObfDereferenceObject+0x5fee5dec14 8057a83d nt!IopUnloadDriver+0x28aee5dec24 8053e6d8 nt!NtUnloadDriver+0xfee5dec24 80500231 nt!KiFastCallEntry+0xf8ee5deca0 804f55df nt!ZwUnloadDriver+0x11ee5ded48 8057a83d nt!IopUnloadDriver+0xf1ee5ded58 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,不知道上面这文章会不会是火星或抄袭了…还请大家指正。。
- 让XueTr卸载不了我们的驱动
- 很多句话让XueTr卸载不了我们的驱动(ObjectType HOOK)
- xuetr的使用
- XueTr
- 非常好用的XueTr-驱动开发,底层开发等等的好助手
- 隐藏驱动,绕过XueTr 0.39检测
- 关于offic 2010 卸载不了的解决方案
- 启动不了并无法卸载的解决方法
- SSDT HOOK技术轻松让最新版冰刃、XueTr失效
- WinCE驱动的动态卸载
- WinCE驱动的动态卸载
- WinCE驱动的动态卸载
- WinCE驱动的动态卸载
- ok6410 官方的驱动卸载
- 误装驱动的卸载
- A8开发删除不了加载的 驱动
- 一键锁屏卸载不了
- rmmod 卸载不了模块
- Linux 下搭建SVN 之部署
- 利用PDB文件获取未导出全局变量、函数等信息
- 别人的开发驱动经验(转载)
- 基于x86-64架构的汇编资料收集
- 一种躲避模块检测的方法。(断链隐藏模块Ldr)含代码。
- 让XueTr卸载不了我们的驱动
- 获取内核ntoskrnl.exe基地址的几种常见办法
- ring3下伪装进程名绕过HS 部分Inline hook (by 小枫)
- IAT随便HOOK+反检测方法
- QQ2011低级键盘钩子分析
- Android美工坊:Selector选择器的使用
- 自己定义Object Type对抗Object Hook
- make clean的问题-只删除build文件
- 【分享】网络游戏加速的实现