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
返回值:
操作成功返回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