首页
社区
课程
招聘
[原创]Windows内核模块名称遍历
发表于: 2020-12-10 09:10 6180

[原创]Windows内核模块名称遍历

2020-12-10 09:10
6180

0x00 原理
内核模块信息以_LDR_DATA_TABLE_ENTRY结构形式存在于系统, 该结构以双向链表将所有的模块信息关联起来。

 

0x01 实现
1.1 基于WinDbg获取_LDR_DATA_TABLE_ENTRY结构
在WinDbg中调试过程中输入 dt _LDR_DATA_TABLE_ENTRY 来获取_LDR_DATA_TABLE_ENTRY结构结构信息
以下是我在调试Win10时获取的信息:

 

kd> dt _LDR_DATA_TABLE_ENTRY
nt!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY
+0x010 InMemoryOrderLinks : _LIST_ENTRY
+0x020 InInitializationOrderLinks : _LIST_ENTRY
+0x030 DllBase : Ptr64 Void
+0x038 EntryPoint : Ptr64 Void
+0x040 SizeOfImage : Uint4B
+0x048 FullDllName : _UNICODE_STRING
+0x058 BaseDllName : _UNICODE_STRING
+0x068 FlagGroup : [4] UChar
+0x068 Flags : Uint4B
+0x068 PackagedBinary : Pos 0, 1 Bit
+0x068 MarkedForRemoval : Pos 1, 1 Bit
+0x068 ImageDll : Pos 2, 1 Bit
+0x068 LoadNotificationsSent : Pos 3, 1 Bit
+0x068 TelemetryEntryProcessed : Pos 4, 1 Bit
+0x068 ProcessStaticImport : Pos 5, 1 Bit
+0x068 InLegacyLists : Pos 6, 1 Bit
+0x068 InIndexes : Pos 7, 1 Bit
+0x068 ShimDll : Pos 8, 1 Bit
+0x068 InExceptionTable : Pos 9, 1 Bit
+0x068 ReservedFlags1 : Pos 10, 2 Bits
+0x068 LoadInProgress : Pos 12, 1 Bit
+0x068 LoadConfigProcessed : Pos 13, 1 Bit
+0x068 EntryProcessed : Pos 14, 1 Bit
+0x068 ProtectDelayLoad : Pos 15, 1 Bit
+0x068 ReservedFlags3 : Pos 16, 2 Bits
+0x068 DontCallForThreads : Pos 18, 1 Bit
+0x068 ProcessAttachCalled : Pos 19, 1 Bit
+0x068 ProcessAttachFailed : Pos 20, 1 Bit
+0x068 CorDeferredValidate : Pos 21, 1 Bit
+0x068 CorImage : Pos 22, 1 Bit
+0x068 DontRelocate : Pos 23, 1 Bit
+0x068 CorILOnly : Pos 24, 1 Bit
+0x068 ChpeImage : Pos 25, 1 Bit
+0x068 ReservedFlags5 : Pos 26, 2 Bits
+0x068 Redirected : Pos 28, 1 Bit
+0x068 ReservedFlags6 : Pos 29, 2 Bits
+0x068 CompatDatabaseProcessed : Pos 31, 1 Bit
+0x06c ObsoleteLoadCount : Uint2B
+0x06e TlsIndex : Uint2B
+0x070 HashLinks : _LIST_ENTRY
+0x080 TimeDateStamp : Uint4B
+0x088 EntryPointActivationContext : Ptr64 _ACTIVATION_CONTEXT
+0x090 Lock : Ptr64 Void
+0x098 DdagNode : Ptr64 _LDR_DDAG_NODE
+0x0a0 NodeModuleLink : _LIST_ENTRY
+0x0b0 LoadContext : Ptr64 _LDRP_LOAD_CONTEXT
+0x0b8 ParentDllBase : Ptr64 Void
+0x0c0 SwitchBackContext : Ptr64 Void
+0x0c8 BaseAddressIndexNode : _RTL_BALANCED_NODE
+0x0e0 MappingInfoIndexNode : _RTL_BALANCED_NODE
+0x0f8 OriginalBase : Uint8B
+0x100 LoadTime : _LARGE_INTEGER
+0x108 BaseNameHashValue : Uint4B
+0x10c LoadReason : _LDR_DLL_LOAD_REASON
+0x110 ImplicitPathOptions : Uint4B
+0x114 ReferenceCount : Uint4B
+0x118 DependentLoadFlags : Uint4B
+0x11c SigningLevel : UChar

 

1.2 代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <wdm.h>
 
typedef struct _LDR_DATA_TABLE_ENTRY
{
    LIST_ENTRY InLoadOrderLinks;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderLinks;
    PVOID      DllBase;
    PVOID      EntryPoint;
    UINT64    SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
}LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;
 
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
    DbgPrint("DriverUnload");
}
 
 
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,UNICODE_STRING RegistryPath)
{
 
    NTSTATUS status = STATUS_SUCCESS;
 
    DbgPrint("DriverEntry");
 
    DriverObject->DriverUnload = DriverUnload;
 
    PLDR_DATA_TABLE_ENTRY pDection = DriverObject->DriverSection;    //获取当前驱动的LDR_DATA_TABLE_ENTRY地址
 
    PLDR_DATA_TABLE_ENTRY pCurrentDection = pDection;    //记录当前驱动LDR_DATA_TABLE_ENTRY地址
 
    do
    {
        pDection =  pDection->InLoadOrderLinks.Flink;   //先查询下一个
 
        DbgPrint("%ws", pDection->BaseDllName.Buffer);    //输出模块名
 
    } while (pCurrentDection != pDection);    //遍历到当前驱动LDR_DATA_TABLE_ENTRY地址时,说明查询结束
 
    return status;
 
}

0x02 结果
图片描述
图片描述
红色标注的是我自身驱动程序的名称


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-12-10 09:16 被i未若编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
LoadedModuleList链表在DriverEntry里是没加锁的,直接遍历不符合规范,上生产环境碰到用户频繁加载卸载驱动的,分分钟蓝屏给你看。这就是为什么VMP不遍历LoadedModuleList来初始化导入表非要ZwQuery一下的原因。
2020-12-10 10:44
2
雪    币: 2809
活跃值: (1210)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
hzqst LoadedModuleList链表在DriverEntry里是没加锁的,直接遍历不符合规范,上生产环境碰到用户频繁加载卸载驱动的,分分钟蓝屏给你看。这就是为什么VMP不遍历LoadedModuleL ...

谢大佬科普

最后于 2021-11-25 10:19 被i未若编辑 ,原因:
2020-12-10 14:10
0
游客
登录 | 注册 方可回帖
返回
//