3.PEB_LDR_DATA
1 typedef struct _PEB_LDR_DATA
2 {
3 ULONG Length; // +0x00
4 BOOLEAN Initialized; // +0x04
5 PVOID SsHandle; // +0x08
6 LIST_ENTRY InLoadOrderModuleList; // +0x0c 模块加载顺序
7 LIST_ENTRY InMemoryOrderModuleList; // +0x14 模块在内存中的顺序
8 LIST_ENTRY InInitializationOrderModuleList; // +0x1c 模块初始化时的顺序
9 } PEB_LDR_DATA,*PPEB_LDR_DATA;
10 // 该结构体包含了三个双向链表(_LIST_ENTRY),它们分别指向了_LDR_DATA_TABLE_ENTRY结构体。
1 typedef struct _LIST_ENTRY 2 { 3 struct _LIST_ENTRY *Flink; // +0x00 4 struct _LIST_ENTRY *Blink; // +0x04 5 } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY; 6 // 这个双向链表指向了进程中加载的模块,结构中的每个指针,都指向了一个LDR_DATA_TABLE_ENTRY结构体。
// Blink指针指向前一个元素,Flink指针指向下一个元素。
1 typedef struct _LDR_DATA_TABLE_ENTRY
2 {
3 LIST_ENTRY InLoadOrderLinks; //WIN7: 0x00, XP:0X00
4 LIST_ENTRY InMemoryOrderLinks; //WIN7: 0x10, XP:0X08
5 LIST_ENTRY InInitializationOrderLinks; // WIN7:0x20, XP:0X10
6 PVOID DllBase; // 镜像基址 WIN7:0x30 , XP:0X18
7 PVOID EntryPoint; // 入口点 WIN7:0x38
8 ULONG SizeOfImage; // 镜像大小 WIN7:0x40
9 UNICODE_STRING FullDllName; // 模块全路径字符串 WIN7:0x48
10 UNICODE_STRING BaseDllName; // 模块名称字符串 WIN7:0x58
11 ULONG Flags;
12 WORD LoadCount;
13 WORD TlsIndex;
14 union
15 {
16 LIST_ENTRY HashLinks;
17 struct
18 {
19 PVOID SectionPointer;
20 ULONG CheckSum;
21 };
22 };
23 union
24 {
25 ULONG TimeDateStamp;
26 PVOID LoadedImports;
27 };
28 _ACTIVATION_CONTEXT * EntryPointActivationContext;
29 PVOID PatchInformation;
30 LIST_ENTRY ForwarderLinks;
31 LIST_ENTRY ServiceTagLinks;
32 LIST_ENTRY StaticLinks;
33 } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
34 // 每一个被加载的模块都对应一个该结构体,结构体中保存了该模块的一些信息。
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 00404830 mov eax,dword ptr fs:[0x30] // PEB = FS:[0x30] 2 00404836 mov eax,dword ptr ds:[eax+0xC] // PEB_LDR_DATA = [PEB+0xC] 3 00404839 mov eax,dword ptr ds:[eax+0xC] // InLoadOrderModuleList 使用模块加载顺序遍历 4 0040483C mov eax,dword ptr ds:[eax+0x18] // eax = 00400000(LDR_DATA_TABLE_ENTRY.DllBase) 第一个DLL模块基址 1 00404830 mov eax,dword ptr fs:[0x30] // PEB = FS:[0x30] 2 00404836 mov eax,dword ptr ds:[eax+0xC] // PEB_LDR_DATA = [PEB+0xC] 3 00404839 mov eax,dword ptr ds:[eax+0x14] // InMemoryOrderModuleList 使用模块在内存中的顺序遍历 4 0040483C mov eax,dword ptr ds:[eax+0x10] // eax = 00400000(LDR_DATA_TABLE_ENTRY.DllBase) 第一个DLL模块基址 1 00404830 mov eax,dword ptr fs:[0x30] // PEB = FS:[0x30] 2 00404836 mov eax,dword ptr ds:[eax+0xC] // PEB_LDR_DATA = [PEB+0xC] 3 00404839 mov eax,dword ptr ds:[eax+0x1C] // InMemoryOrderModuleList 使用模块初始化时的顺序遍历 4 0040483C mov eax,dword ptr ds:[eax+0x8] // eax = 776C0000(LDR_DATA_TABLE_ENTRY.DllBase) 第一个DLL模块基址
参考
https://blog.csdn.net/bailing1370/article/details/101957531

浙公网安备 33010602011771号