首页
社区
课程
招聘
[原创]一句话让XueTr卸载不了我们的驱动(不知道这会不会是火星或抄袭了…)
发表于: 2011-5-17 12:47 10718

[原创]一句话让XueTr卸载不了我们的驱动(不知道这会不会是火星或抄袭了…)

2011-5-17 12:47
10718

一句话让XueTr卸载不了我们的驱动(不知道这会不会是火星或抄袭了…)

MJ语录“inline hook.,非标准链式hook(各自管理各自的)不存在绝对的安全 有很大几率蓝屏,所以唯一正确的办法,就是不要卸载 ”
http://www.debugman.com/discussion/1542/

来自:第三届360软件大赛--第二阶段题目的解答

驱动代码如下:
/*
* 作者:KiDebug
* 空间:http://hi.baidu.com/KiDebug/
*/
#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函数里面添加一句代码就行:
/*
* 作者:KiDebug
* 空间:http://hi.baidu.com/KiDebug/
*/
#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;
}

用InstDrv.exe加载编译后的驱动,依次点击安装、启动、停止、卸载,然后用XueTr测试一下,发现虽然能显示test.sys的存在,但菜单里面“卸载驱动(危险)”已经变灰,无法点击了。

虽然是自己在做题时根据MJ的语录翻的WRK,不知道上面这文章会不会是火星或抄袭了…还请大家指正。。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 525
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂。但是觉得挺厉害。
2011-5-17 13:26
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
3
原来卸载 inline hook 是错误的。
2011-5-17 16:39
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
KiDebug 最近好火啊
2011-5-19 02:12
0
雪    币: 3800
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
XueTr现在很出名
2011-5-19 02:55
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
虚火,都是虚火。。。
2011-5-19 10:15
0
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不知道你本机测试过吗?我虚拟机xp sp3测试失败,xuetr版本是0.39,测试详情是卸载驱动没有变灰,只是卸载掉后还在内核里,重启即消失。
2011-5-24 08:04
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
“用InstDrv.exe加载编译后的驱动,依次点击安装、启动、停止、卸载”
这是我本机的截图,Windows 7 SP1 旗舰版,XueTr 0.39
上传的附件:
2011-5-24 09:27
0
游客
登录 | 注册 方可回帖
返回
//