首页
论坛
课程
招聘
[原创]很多句话让XueTr卸载不了我们的驱动(ObjectType HOOK)
2011-5-24 13:34 21997

[原创]很多句话让XueTr卸载不了我们的驱动(ObjectType HOOK)

2011-5-24 13:34
21997
对于ObjectType HOOK,可以参考MJ0011和sudami的文章:

ObjectType HOOK干涉注册表操作(bypass Icesword,gmer,NIAP,etc.)
http://www.xfocus.net/articles/200802/966.html

一种Object hook的思路和实现过程
http://forum.eviloctal.com/thread-33688-1-1.html

两篇文章的共同点都是去HOOK系统已经生成的object type里面的例程,系统怎么去用这些例程呢?仍然以上篇的《一句话让XueTr卸载不了我们的驱动》为例,驱动卸载时,函数调用如下:
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

ObpRemoveObjectRoutine定义如下:
VOID
ObpRemoveObjectRoutine (
    IN  PVOID   Object,
    IN  BOOLEAN CalledOnWorkerThread
    )

Object是我们的驱动对象DriverObject,
有如下的代码:
    ObjectHeader = OBJECT_TO_OBJECT_HEADER( Object );
    ObjectType = ObjectHeader->Type;

    if (ObjectType->TypeInfo.DeleteProcedure) {

#if DBG
        KIRQL SaveIrql;
#endif

        ObpBeginTypeSpecificCallOut( SaveIrql );

        if (!CalledOnWorkerThread) {

            ObjectHeader->Flags |= OB_FLAG_DELETED_INLINE;
        }

        (*(ObjectType->TypeInfo.DeleteProcedure))(Object);

        ObpEndTypeSpecificCallOut( SaveIrql, "Delete", ObjectType, Object );
    }

可以看到是从Object取ObjectHeader,然后从ObjectHeader取ObjectType,从ObjectType取TypeInfo.DeleteProcedure。没有直接取系统已经生成的ObjectType
因此,我们可以自己构造一个ObjectType,里面填充自己定义的例程,然后覆盖Object上面的ObjectHeader里面的ObjectType,这样系统取到的TypeInfo.DeleteProcedure就是我们自己定义的例程了。

测试代码如下:
/*
* 作者:KiDebug
* 空间:http://hi.baidu.com/KiDebug/
*/
#include <ntddk.h>

UCHAR        My_OBJECT_TYPE[0x200];

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;
}

void DoNothing()
{

}

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;

        __asm
        {
                mov eax,DriverObject
                mov esi,[eax-10h]                        //+0x008 Type   +0x018 Body  两者相差 0x10
                lea edi,My_OBJECT_TYPE
                mov ecx,64h                                //_OBJECT_TYPE共0x190个字节,0x64个DWORD
                rep movsd                                //把Driver的系统自带的_OBJECT_TYPE复制到My_OBJECT_TYPE里面
                lea ebx,My_OBJECT_TYPE
                mov ecx,DoNothing                       
                mov [ebx+98h],ecx                        //+0x038 DeleteProcedure
                mov [eax-10h],ebx                        //把My_OBJECT_TYPE覆盖成自己DriverObject头上的Type
        };

        return STATUS_SUCCESS;
}
用InstDrv.exe加载编译后的驱动,依次点击安装、启动,然后用XueTr查看“驱动模块”,可以看到test.sys,可以在右键菜单中点击“卸载驱动(危险)”,但刷新后test.sys依然还在。
把My_OBJECT_TYPE覆盖掉XueTr.sys驱动对象上面的ObjectHeader里面的ObjectType,XueTr功能没影响,能干啥干啥。
这样的HOOK用XueTr查不到,可以推广到其他的对象中去,比如说注册表、进程等等。

既然能加载驱动,能进内核了,那么神马都是浮云了:看到什么就可以HOOK什么,反过来看到HOOK了什么,就可以反HOOK什么。

第五届安全开发者峰会(SDC 2021)10月23日上海召开!限时2.5折门票(含自助午餐1份)

收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 154
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leeonegor 活跃值 2011-5-24 14:05
2
0
干嘛老是针对XueTr。。。
雪    币: 150
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chenjun 活跃值 2011-5-24 14:33
3
0
XueTr 与时俱进,国内其他anitRootkits基本停止开发了~ 各位懂
雪    币: 463
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 活跃值 4 2011-5-24 15:07
4
0
谁名气大就针对谁
雪    币: 7506
活跃值: 活跃值 (298)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2011-5-24 15:12
5
0
我以前是用ObCreateObjectType创建自己的ObjectType,反正这函数是导出的……
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-5-26 08:09
6
0
顶起,目前xuetr不是最强大的了,还有个,作者未大面积公开,功能比xuetr多10个左右
雪    币: 154
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leeonegor 活跃值 2011-5-26 08:49
7
0
求继续爆料
雪    币: 122
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
butian 活跃值 2011-5-26 09:03
8
0
顶一个,学习!
雪    币: 51
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OnlyLoveMM 活跃值 2011-5-26 09:26
9
0
360名气也挺大的。你有没有研究出几个让主防不提示加载驱动的方法来?
雪    币: 463
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 活跃值 4 2011-5-26 09:45
10
0
难道是PT?



              
雪    币: 2140
活跃值: 活跃值 (404)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
zhouws 活跃值 2 2011-5-26 09:50
11
0
功能强大,我想xutre作者也能做一大堆。但你别忽略了稳定性。蓝死人不偿命
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-5-26 09:53
12
0
回答正确,100分
雪    币: 463
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 活跃值 4 2011-5-26 10:01
13
0
试了《一句话让XueTr卸载不了我们的驱动》,蓝屏了
试了《很多句话让XueTr卸载不了我们的驱动》,效果同XueTr
雪    币: 1407
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liangdong 活跃值 2011-5-26 10:42
14
0
Anti-rootkit功能强不强大靠的不是功能的多少。“PowerTool”目前稳定性、检测深度、功能细致度跟XueTr比,都有很大的差距。
就功能来说,据我所知,linxer也有不少东西没公开加入XueTr,比如ACPI Table的查看、drx寄存器的查看和操作、NTFS/Fastfat/Exfat XCB重要结构信息查看、Wait Object相关的死锁检测和操作、更多object hijack的检测和恢复...
雪    币: 303
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
痞子辉 活跃值 1 2011-5-26 11:20
15
0
XueTr还是一款相当强大的ANTI ROOTKIT工具,我支持
雪    币: 753
活跃值: 活跃值 (446)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 活跃值 9 2011-5-27 19:00
16
0
PowerTool 功能是多, 现在越来越不像ARK了.
雪    币: 753
活跃值: 活跃值 (446)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 活跃值 9 2011-6-28 20:40
17
0
很喜欢KiDebug兄弟的专研精神.
雪    币: 893
活跃值: 活跃值 (16)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
jasonnbfan 活跃值 8 2012-6-13 21:26
18
0
感谢楼主共享。
雪    币: 45
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
llongwei 活跃值 2013-4-1 08:36
19
0
学习~~~~~~
游客
登录 | 注册 方可回帖
返回