1. 程式人生 > 其它 >Windows驅動開發學習記錄-遍歷核心已載入模組之三(使用 AuxKlib)

Windows驅動開發學習記錄-遍歷核心已載入模組之三(使用 AuxKlib)

  • 附另兩種方法連結

《Windows驅動開發學習記錄-遍歷核心已載入模組之一(使用DriverSection) 》

《Windows驅動開發學習記錄-遍歷核心已載入模組之二(使用ZwQuerySystemInformation) 》

1.主要區別

上面兩個連結使用的方法中的函式或者結構體都為未文件化的,所以存在不同系統環境下結構體或者其它定義不同的情況,可能需要針對性除錯系統才能獲取。而當前文件介紹的方法為文件化的。

2.原型

NTSTATUS AuxKlibQueryModuleInformation(
  PULONG BufferSize,
  ULONG  ElementSize,
  PVOID  QueryInfo
);

引數:

  • BufferSize 【In/Out】 一個指向接收資料緩衝區大小的指標,大小為位元組。如果QueryInfo為空,該值為驅動必須分配的接收穫取的資訊的大小的位元組數。如果QueryInfo不為空,則為給定的緩衝區大小。
  • ElementSize【In】 QueryInfo指標指向陣列中每個元素的位元組大小,可設定的值為sizeof(AUX_MODULE_BASIC_INFO)或sizeof(AUX_MODULE_EXTENDED_INFO)。
  • QueryInfo【Out/Optional】 指向結構體AUX_MODULE_BASIC_INFO 或者AUX_MODULE_EXTENDED_INFO
    陣列的指標,該陣列用來接受已載入模組的資訊。如果指標為空,AuxKlibQueryModuleInformation 將需要的緩衝區大小寫入BufferSize指標

返回值:

  操作成功返回STATUS_SUCCESS ;
如果QueryInfo 不為空,且驅動提供的緩衝區大小不夠則返回STATUS_BUFFER_TOO_SMALL ;
可能還會返回其它NTSTATUS值。

備註:

要獲取系統載入模組資訊,驅動必須做以下操作:
1、呼叫AuxKlibQueryModuleInformation且QueryInfo傳空,返回後BufferSize為需要分配緩衝區位元組大小數。
2、呼叫記憶體申請例程,例如 ExAllocatePoolWithTag,為該陣列分配緩衝區。
3、再次呼叫AuxKlibQueryModuleInformation,QueryInfo為申請的緩衝區地址指標。AuxKlibQueryModuleInformation返回後,緩衝區包含載入模組的陣列。

在使用AuxKlibQueryModuleInformation之前必須呼叫AuxKlibInitialize。

要求:

標頭檔案aux_klib.h (include Aux_klib.h)
包含庫 Aux_Klib.lib

3.結構體

typedef struct _AUX_MODULE_BASIC_INFO {
  PVOID ImageBase;
} AUX_MODULE_BASIC_INFO, *PAUX_MODULE_BASIC_INFO;
 
 
typedef struct _AUX_MODULE_EXTENDED_INFO {
  AUX_MODULE_BASIC_INFO BasicInfo;
  ULONG                 ImageSize;
  USHORT                FileNameOffset;
  UCHAR                 FullPathName[AUX_KLIB_MODULE_PATH_LEN];
} AUX_MODULE_EXTENDED_INFO, *PAUX_MODULE_EXTENDED_INFO;

4.程式碼實現

  標頭檔案:

#if DBG
#define KDPRINT(projectName, format, ...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, projectName "::【" __FUNCTION__ "】" ##format, ##__VA_ARGS__ )
#else
#define KDPRINT(format, ...)
#endif

typedef enum
{
MmTagTypeAux = 'XUA',
}MmTagType;

  CPP檔案:

 1 NTSTATUS PrintAllLoadedMoudleByAux()
 2 {
 3         NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
 4         PAUX_MODULE_EXTENDED_INFO pModules = NULL;
 5         ULONG ulMoudleSize = 0;
 6         ULONG ulNumberOfModules = 0;
 7         do
 8         {
 9                 ntStatus = AuxKlibInitialize();
10                 if (!NT_SUCCESS(ntStatus))
11                 {
12                         KDPRINT("【PrintLoadedModule】", "AuxKlibInitialize Failed!\r\n");
13                         break;
14                 }
15                 ntStatus = AuxKlibQueryModuleInformation(
16                         &ulMoudleSize,
17                         sizeof(AUX_MODULE_EXTENDED_INFO),
18                         NULL);
19                 if (STATUS_BUFFER_TOO_SMALL == ntStatus || ulMoudleSize != 0)
20                 {
21                         ulNumberOfModules = ulMoudleSize / sizeof(AUX_MODULE_EXTENDED_INFO);
22 
23                         pModules = (PAUX_MODULE_EXTENDED_INFO)ExAllocatePoolWithTag(PagedPool, ulMoudleSize, MmTagTypeAux);
24                         if (pModules == NULL)
25                         {
26                                 KDPRINT("【PrintLoadedModule】", "ExAllocatePoolWithTag Failed!\r\n");
27                                 ntStatus = STATUS_INSUFFICIENT_RESOURCES;
28                                 break;
29                         }
30                         RtlZeroMemory(pModules, ulMoudleSize);
31                         ntStatus = AuxKlibQueryModuleInformation(
32                                 &ulMoudleSize,
33                                 sizeof(AUX_MODULE_EXTENDED_INFO),
34                                 pModules);
35                         if (!NT_SUCCESS(ntStatus))
36                         {
37                                 KDPRINT("【PrintLoadedModule】", "AuxKlibQueryModuleInformation 2 Failed!\r\n");
38                                 break;
39                         }
40                         for (ULONG i = 0; i < ulNumberOfModules; i++)
41                         {
42                                 KDPRINT("【PrintLoadedModule】", "Path:%-50s BaseAddress:0x%p\r\n",
43                                         pModules[i].FullPathName, pModules[i].BasicInfo.ImageBase);
44                         }
45                         KDPRINT("【PrintLoadedModule】", "共計%d個核心模組!\r\n", ulNumberOfModules);
46                 }
47 
48         } while (false);
49         if (pModules)
50         {
51                 ExFreePoolWithTag(pModules, MmTagTypeAux);
52         }
53         return ntStatus;
54 }

5.執行結果

  • xp 32位:

  

  • win10 x64