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

posted @ 2021-08-26 16:39  磐正  阅读(850)  评论(1)    收藏  举报