枚举sys模块 枚举sys模块在内核中枚举进程的模块时我们主要通过PEB中的_PEB_LDR_DATA中的三个链表来获取进程加载的模块使用这种方法需要临时将当前地址空间切换到对应进程的地址空间因为PEB是在进程虚拟地址空间中的而不是内核地址空间。对于枚举sys模块则没有这种顾虑因为它们都是在内核地址空间中我们直接使用驱动对象的DriverSection字段得到LDR_DATA_TABLE_ENTRY然后遍历即可。下面是示例代码#includentddk.h// 使用默认的 x64 自然对齐8字节即可无需额外指定 packtypedefstruct_LDR_DATA_TABLE_ENTRY{// 0x000LIST_ENTRY InLoadOrderLinks;// 0x010LIST_ENTRY InMemoryOrderLinks;// 0x020LIST_ENTRY InInitializationOrderLinks;// 0x030PVOID DllBase;// 0x038PVOID EntryPoint;// 0x040ULONG SizeOfImage;// 0x044 (x64下从 ULONG(4字节) 过渡到 UNICODE_STRING(8字节对齐) 的天然填充)UCHAR Reserved0[4];// 0x048UNICODE_STRING FullDllName;// 0x058UNICODE_STRING BaseDllName;// 结构体结束于 0x068 之前正好符合你的需求}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;voidDriverUnload(PDRIVER_OBJECT pDrvObj){}EXTERN_C NTSTATUSDriverEntry(PDRIVER_OBJECT pDrvObj,PUNICODE_STRING pRegPath){pDrvObj-DriverUnloadDriverUnload;PLDR_DATA_TABLE_ENTRY pLdr(PLDR_DATA_TABLE_ENTRY)pDrvObj-DriverSection;PLDR_DATA_TABLE_ENTRY pCurrentListEntry(PLDR_DATA_TABLE_ENTRY)pLdr-InLoadOrderLinks.Flink;PLDR_DATA_TABLE_ENTRY pModulenullptr;while(pCurrentListEntry!pLdr){pModuleCONTAINING_RECORD(pCurrentListEntry,LDR_DATA_TABLE_ENTRY,InLoadOrderLinks);if(pModule-BaseDllName.Buffer!nullptr){DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,BaseAddr: %p; Size: %lu; Name: %wZ\n,pModule-DllBase,pModule-SizeOfImage,pModule-BaseDllName);}pCurrentListEntry(PLDR_DATA_TABLE_ENTRY)pCurrentListEntry-InLoadOrderLinks.Flink;}returnSTATUS_SUCCESS;}