ZwQuerySystemInformation 函数可以用来枚举内核模块,使用ms 的隐藏功能即可
typedef NTSTATUS (WINAPI* PFN_ZwQuerySystemInformation)(
_In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,
_Inout_ PVOID SystemInformation,
_In_ ULONG SystemInformationLength,
_Out_opt_ PULONG ReturnLength
);
SystemInformationClass =11 的时候就是枚举内核模块
此时的数据结构定义如下
#pragma pack(push ,1)
struct SYSTEM_MODULE_INFO_ENTRY
{
ULONG unk2;
ULONG unk3;
ULONG unk4;
ULONG unk5;
ULONGLONG base;
ULONG mSize;
ULONG Flags;
USHORT Index;
USHORT NameLen;
USHORT LoadCnt;
USHORT ModuleNameOffset;
char ImageName[256];
};
typedef struct _SYSTEM_MODULE_INFO
{
ULONG count;
ULONG unk1;
SYSTEM_MODULE_INFO_ENTRY mods[1];
} SYSTEM_MODULE_INFO,*PSYSTEM_MODULE_INFO;
#pragma pack(pop)
返回
SYSTEM_MODULE_INFO 结构 如果接收缓冲区不足返回C0000004 需要调整缓冲区再使用
注意: 32位的和64位的结构体不一样
这里给的是64位的,而且程序也必须是64位的才行,否则地址会被截断