當系統載入一個驅動時,會為這個驅動建立一個_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來得到所有載入的驅動。

在測試中發現,如果將某一驅動的DllBaseFullDllName.buffer填為0,那麼XueTr就不會顯示這個驅動,以下是將DllBase0時的驗證代碼:

 

 

 

 


#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;//
DllBase0
}

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填為0XueTr不會顯示ntkrnlpa.exe的存在。

濃縮版:
1
DllBase0,無可疑驅動
2
FullDllName.buffer0,有可疑驅動
3
XueTr 0.39
4
:沒有建立DeviceObject

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 殘月影 的頭像
    殘月影

    Rootkit --逆向工程技術--

    殘月影 發表在 痞客邦 留言(0) 人氣()