之前学习断链的时候了解到了LDR,最近考试周刚过,比较闲,就整理了一下当时学习过程中的笔记,很基础,本人小菜一枚,在本文中如果有任何不正确的地方,还望各位巨巨指正!
在windows中,每一个模块(exe,dll)对应了一个LDR_MODULE,这个模块是让系统认识到每个模块的存在,在获取模块基址,获取api地址用的很多,进而可以用来隐藏模块,编写外壳程序等……
关于结构LDR_MODULE的定义:
typedef struct _LDR_MODULE
{
[B]LIST_ENTRY InLoadOrderModuleList;[/B] //按加载模块顺序构成的模块链表
[B]LIST_ENTRY InMemoryOrderModuleList;[/B] //按内存顺序的模块链表
[B]LIST_ENTRY InInitializationOrderModuleList;[/B] //按初始化顺序的模块链表
PVOID BaseAddress; //模块的基地址
PVOID EntryPoint; //模块的入口
ULONG SizeOfImage; //模块镜像大小
UNICODE_STRING FullDllName; //路径名
UNICODE_STRING BaseDllName; //模块名
ULONG Flags;
SHORT LoadCount; //引用计数
SHORT TlsIndex;
LIST_ENTRY HashTableEntry;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
而后来我在查看PEB_LDR_DATA结构的时候:
typedef struct _PEB_LDR_DATA
{
ULONG Length;
BOOLEAN Initialized;
HANDLE SsHandle;
[B]LIST_ENTRY InLoadOrderModuleList;[/B]
[B]LIST_ENTRY InMemoryOrderModuleList;[/B]
[B]LIST_ENTRY InInitializationOrderModuleList;[/B]
PVOID EntryInProgress;
} PEB_LDR_DATA, *PPEB_LDR_DATA;
也发现了这三个链表InLoadOrderModuleList, InMemoryOrderModuleList, InInitializationOrderModuleList
那么这三个链表存在于两个结构中,到底有和对应的关系呢?
编写了一个程序helloworld.exe,windbg载入:
0:000> !peb
PEB at 7efde000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: Yes
ImageBaseAddress: 01000000
..........
0:000> dt _PEB 7efde000
ntdll!_PEB
+0x000 InheritedAddressSpace : 0 ''
+0x001 ReadImageFileExecOptions : 0 ''
+0x002 BeingDebugged : 0x1 ''
+0x003 BitField : 0x8 ''
+0x003 ImageUsesLargePages : 0y0
+0x003 IsProtectedProcess : 0y0
+0x003 IsLegacyProcess : 0y0
+0x003 IsImageDynamicallyRelocated : 0y1
+0x003 SkipPatchingUser32Forwarders : 0y0
+0x003 SpareBits : 0y000
+0x004 Mutant : 0xffffffff Void
+0x008 ImageBaseAddress : 0x01000000 Void
+0x00c Ldr : 0x77d90200 _PEB_LDR_DATA
+0x010 ProcessParameters : 0x00421918 _RTL_USER_PROCESS_PARAMETERS
..................
0:000> dt _PEB_LDR_DATA 0x77d90200
ntdll!_PEB_LDR_DATA
+0x000 Length : 0x30
+0x004 Initialized : 0x1 ''
+0x008 SsHandle : (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x593510 - 0x5941a8 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x593518 - 0x5941b0 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x5935b0 - 0x5941b8 ]
+0x024 EntryInProgress : (null)
+0x028 ShutdownInProgress : 0 ''
+0x02c ShutdownThreadId : (null)
0:000> dt _LDR_DATA_TABLE_ENTRY 0X593510
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x5935a0 - 0x77d9020c ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x5935a8 - 0x77d90214 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x018 DllBase : 0x01360000 Void
+0x01c EntryPoint : 0x0137110e Void
+0x020 SizeOfImage : 0x1c000
+0x024 FullDllName : _UNICODE_STRING "F:\helloworld.exe"
+0x02c BaseDllName : _UNICODE_STRING "helloworld.exe"
+0x034 Flags : 0x4000
+0x038 LoadCount : 0xffff
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x77d948a0 - 0x77d948a0 ]
+0x03c SectionPointer : 0x77d948a0 Void
+0x040 CheckSum : 0x77d948a0
+0x044 TimeDateStamp : 0x548284c9
+0x044 LoadedImports : 0x548284c9 Void
+0x048 EntryPointActivationContext : (null)
+0x04c PatchInformation : (null)
+0x050 ForwarderLinks : _LIST_ENTRY [ 0x593560 - 0x593560 ]
+0x058 ServiceTagLinks : _LIST_ENTRY [ 0x593568 - 0x593568 ]
+0x060 StaticLinks : _LIST_ENTRY [ 0x594288 - 0x594260 ]
+0x068 ContextInformation : 0x77ccc984 Void
+0x06c OriginalBase : 0
+0x070 LoadTime : _LARGE_INTEGER 0x0
可以看到windbg中的_LDR_DATA_TABLE_ENTRY就是对应着LDR_MODULE结构,三个链表InLoadOrderModuleList, InMemoryOrderModuleList, InInitializationOrderModuleList都分别对应着各自的LDR_MODULE结构
用图来表示如下

由图可知,这三个链表结构其实是被PEB_LDR_DATA和LDR_MODULE结构共用
那么这三个链表InLoadOrderModuleList, InMemoryOrderModuleList, InInitializationOrderModuleList又都有什么区别呢?
用上面那个测试程序:
对InLoadOrderModuleList 加载模块顺序构成的模块链表进行调试
//针对0x593510链表的flink进行遍历
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x593510 - 0x5941a8 ]
..................
0:000> dt _LIST_ENTRY 0X593510
ntdll!_LIST_ENTRY
[ 0x5935a0 - 0x77d9020c ]
+0x000 Flink : 0x005935a0 _LIST_ENTRY [ 0x593920 - 0x593510 ]
+0x004 Blink : 0x77d9020c _LIST_ENTRY [ 0x593510 - 0x5941a8 ]
0:000> dt _LIST_ENTRY 0X5935a0
ntdll!_LIST_ENTRY
[ 0x593920 - 0x593510 ]
+0x000 Flink : 0x00593920 _LIST_ENTRY [ 0x593a38 - 0x5935a0 ]
+0x004 Blink : 0x00593510 _LIST_ENTRY [ 0x5935a0 - 0x77d9020c ]
0:000> dt _LIST_ENTRY 0X593920
ntdll!_LIST_ENTRY
[ 0x593a38 - 0x5935a0 ]
+0x000 Flink : 0x00593a38 _LIST_ENTRY [ 0x5941a8 - 0x593920 ]
+0x004 Blink : 0x005935a0 _LIST_ENTRY [ 0x593920 - 0x593510 ]
0:000> dt _LIST_ENTRY 0X593a38
ntdll!_LIST_ENTRY
[ 0x5941a8 - 0x593920 ]
+0x000 Flink : 0x005941a8 _LIST_ENTRY [ 0x77d9020c - 0x593a38 ]
+0x004 Blink : 0x00593920 _LIST_ENTRY [ 0x593a38 - 0x5935a0 ]
0:000> dt _LIST_ENTRY 0X5941a8
ntdll!_LIST_ENTRY
[ 0x77d9020c - 0x593a38 ]
+0x000 Flink : 0x77d9020c _LIST_ENTRY [ 0x593510 - 0x5941a8 ]
+0x004 Blink : 0x00593a38 _LIST_ENTRY [ 0x5941a8 - 0x593920 ]
0:000> dt _LIST_ENTRY 0X77d9020c
ntdll!_LIST_ENTRY
[ 0x593510 - 0x5941a8 ]
+0x000 Flink : 0x00593510 _LIST_ENTRY [ 0x5935a0 - 0x77d9020c ]
+0x004 Blink : 0x005941a8 _LIST_ENTRY [ 0x77d9020c - 0x593a38 ]
按照上面的地址0X593510-0X5935a0-0X593920-0X593a38-0X5941a8-0X77d9020c
,分别查看对应的LDR_DATA_TABLE_ENTRY结构
0:000> dt _LDR_DATA_TABLE_ENTRY 0X593510
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x5935a0 - 0x77d9020c ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x5935a8 - 0x77d90214 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x018 DllBase : 0x01360000 Void
+0x01c EntryPoint : 0x0137110e Void
+0x020 SizeOfImage : 0x1c000
+0x024 FullDllName : _UNICODE_STRING "F:\helloworld.exe"
+0x02c BaseDllName : _UNICODE_STRING "helloworld.exe"
.....................
0:000> dt _LDR_DATA_TABLE_ENTRY 0X5935a0
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x593920 - 0x593510 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x593928 - 0x593518 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x593a48 - 0x77d9021c ]
+0x018 DllBase : 0x77c90000 Void
+0x01c EntryPoint : (null)
+0x020 SizeOfImage : 0x180000
+0x024 FullDllName : _UNICODE_STRING "C:\Windows\SysWOW64\ntdll.dll"
+0x02c BaseDllName : _UNICODE_STRING "ntdll.dll"
.....................
0:000> dt _LDR_DATA_TABLE_ENTRY 0X593920
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x593a38 - 0x5935a0 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x593a40 - 0x5935a8 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x5941b8 - 0x593a48 ]
+0x018 DllBase : 0x76ff0000 Void
+0x01c EntryPoint : 0x770035c8 Void
+0x020 SizeOfImage : 0x110000
+0x024 FullDllName : _UNICODE_STRING "C:\Windows\syswow64\kernel32.dll"
+0x02c BaseDllName : _UNICODE_STRING "kernel32.dll"
.....................
0:000> dt _LDR_DATA_TABLE_ENTRY 0X593a38
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x5941a8 - 0x593920 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x5941b0 - 0x593928 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x593930 - 0x5935b0 ]
+0x018 DllBase : 0x76f60000 Void
+0x01c EntryPoint : 0x76f674b1 Void
+0x020 SizeOfImage : 0x47000
+0x024 FullDllName : _UNICODE_STRING "C:\Windows\syswow64\KERNELBASE.dll"
+0x02c BaseDllName : _UNICODE_STRING "KERNELBASE.dll"
.....................
0:000> dt _LDR_DATA_TABLE_ENTRY 0X5941a8
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x77d9020c - 0x593a38 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x77d90214 - 0x593a40 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x77d9021c - 0x593930 ]
+0x018 DllBase : 0x571f0000 Void
+0x01c EntryPoint : 0x5724a4d0 Void
+0x020 SizeOfImage : 0x19b000
+0x024 FullDllName : _UNICODE_STRING "C:\Windows\system32\MSVCR110D.dll"
+0x02c BaseDllName : _UNICODE_STRING "MSVCR110D.dll"
.....................
0:000> dt _LDR_DATA_TABLE_ENTRY 0X77d9020c
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x593510 - 0x5941a8 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x593518 - 0x5941b0 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x5935b0 - 0x5941b8 ]
+0x018 DllBase : (null)
+0x01c EntryPoint : (null)
+0x020 SizeOfImage : 0
+0x024 FullDllName : _UNICODE_STRING ""
+0x02c BaseDllName : _UNICODE_STRING ""
+0x034 Flags : 0
+0x038 LoadCount : 0
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x03c SectionPointer : (null)
+0x040 CheckSum : 0
+0x044 TimeDateStamp : 0
+0x044 LoadedImports : (null)
+0x048 EntryPointActivationContext : (null)
+0x04c PatchInformation : (null)
+0x050 ForwarderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x058 ServiceTagLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x060 StaticLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x068 ContextInformation : (null)
+0x06c OriginalBase : 0
+0x070 LoadTime : _LARGE_INTEGER 0x0
很清楚的看到在InLoadOrderModuleList 中顺序是
helloworld.exe------>ntdll.dll------>kernel32.dll------->KERNELBASE.dll-------->MSVCR110D.dll------>null
用同样的方法得到在在调试 InMemoryOrderModuleList,InInitializationOrderModuleList中就出现了一个问题,按照之前读地址就出现了错误(因为苦逼学生党晚上断电,第二天重新加载了程序,地址会跟上面的会有不同,但是仍然出现无法正确读出一些信息)
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x693a48 - 0x7761021c ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x77510000 - 0x0 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x180000 - 0x3c003a ]
+0x018 DllBase : 0x00693630 Void
+0x01c EntryPoint : 0x00140012 Void
+0x020 SizeOfImage : 0x77555df0
+0x024 FullDllName : _UNICODE_STRING "--- memory read error at address 0x0000ffff ---"
+0x02c BaseDllName : [COLOR="Red"]_UNICODE_STRING "㗜i㗜i䣈睡䣈睡㩴i㩴i䣘睡䣘睡䣠睡䣠睡䣨睡䣨睡䣰睡䣰睡䣸睡䣸睡"[/COLOR]
+0x034 Flags : 0x4ec49d10
+0x038 LoadCount : 0
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x6935f0 ]
+0x03c SectionPointer : (null)
+0x040 CheckSum : 0x6935f0
+0x044 TimeDateStamp : 0x6935f0
+0x044 LoadedImports : 0x006935f0 Void
+0x048 EntryPointActivationContext : 0x006935f8 _ACTIVATION_CONTEXT
+0x04c PatchInformation : 0x006935f8 Void
+0x050 ForwarderLinks : _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x058 ServiceTagLinks : _LIST_ENTRY [ 0x0 - 0x7de70000 ]
+0x060 StaticLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x068 ContextInformation : 0xabababab Void
+0x06c OriginalBase : 0xabababab
+0x070 LoadTime : _LARGE_INTEGER 0x0
为什么dt _LDR_DATA_TABLE_ENTRY之中InLoadOrderModuleList 链表就可以完全读出来个所以然,而偏偏到InInitializationOrderModuleList和InMemoryOrderModuleList就不行了呢?
从调试信息来看,应该是地址不对,可是到底哪出了问题呢?
我们回过头再来看这个结构体:

所以_PEB_LDR_DATA中InMemoryOrderLinks其实指向的是_LDR_DATA_TABLE_ENTRY中InMemoryOrderModuleList成员地址,
而_PEB_LDR_DATA中InInitializationOrderModuleList指向的也是_LDR_DATA_TABLE_ENTRY中InInitializationOrderModuleLinks成员地址。
在CONTAINING_RECORD中应该是这样计算结构体的地址的:
结构体的地址 + 成员变量的偏移 = 成员变量的地址
所以在进行链表遍历查看的时候应该减去对应的成员变量的偏移:
InMemoryOrderLinks = addr(
0x693518)-@@(#FIELD_OFFSET(ntdll!_ldr_data_table_entry, InMemoryOrderLinks)
InInitializationOrderModuleLinks = addr(
0x6935b0)-@@(#FIELD_OFFSET(ntdll!_ldr_data_table_entry, InInitializationOrderLinks)
即:
InMemoryOrderLinks的地址 = InMemoryOrderModuleList - 0x008
InInitializationOrderModuleLinks地址 = InInitializationOrderModuleList - 0x010
而InLoadOrderModuleList = InLoadOrderLinks -0x000,这也就解释了为什么这有这个地方可以读出正确的地址而另外两个链表不行
InMemoryOrderLinks:
0:000> dt _LDR_DATA_TABLE_ENTRY [COLOR="Red"]0x693510[/COLOR] -r2
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x6935a0 - 0x7761020c ]
+0x000 Flink : 0x006935a0 _LIST_ENTRY [ 0x693920 - 0x693510 ]
+0x000 Flink : 0x00693920 _LIST_ENTRY [ 0x693a38 - 0x6935a0 ]
+0x004 Blink : 0x00693510 _LIST_ENTRY [ 0x6935a0 - 0x7761020c ]
+0x004 Blink : 0x7761020c _LIST_ENTRY [ 0x693510 - 0x6941a8 ]
+0x000 Flink : 0x00693510 _LIST_ENTRY [ 0x6935a0 - 0x7761020c ]
+0x004 Blink : 0x006941a8 _LIST_ENTRY [ 0x7761020c - 0x693a38 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x6935a8 - 0x77610214 ]
+0x000 Flink : 0x006935a8 _LIST_ENTRY [ 0x693928 - 0x693518 ]
+0x000 Flink : 0x00693928 _LIST_ENTRY [ 0x693a40 - 0x6935a8 ]
+0x004 Blink : 0x00693518 _LIST_ENTRY [ 0x6935a8 - 0x77610214 ]
+0x004 Blink : 0x77610214 _LIST_ENTRY [ 0x693518 - 0x6941b0 ]
+0x000 Flink : 0x00693518 _LIST_ENTRY [ 0x6935a8 - 0x77610214 ]
+0x004 Blink : 0x006941b0 _LIST_ENTRY [ 0x77610214 - 0x693a40 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x000 Flink : (null)
+0x004 Blink : (null)
+0x018 DllBase : 0x01340000 Void
+0x01c EntryPoint : 0x0135110e Void
+0x020 SizeOfImage : 0x1c000
+0x024 FullDllName : _UNICODE_STRING "F:\helloworld.exe"
+0x000 Length : 0x22
+0x002 MaximumLength : 0x24
+0x004 Buffer : 0x006922da "F:\helloworld.exe"
+0x02c BaseDllName : _UNICODE_STRING "helloworld.exe"
+0x000 Length : 0x1c
+0x002 MaximumLength : 0x1e
+0x004 Buffer : 0x006922e0 "helloworld.exe"
+0x034 Flags : 0x4000
+0x038 LoadCount : 0xffff
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x776148a0 - 0x776148a0 ]
+0x000 Flink : 0x776148a0 _LIST_ENTRY [ 0x69354c - 0x69354c ]
+0x000 Flink : 0x0069354c _LIST_ENTRY [ 0x776148a0 - 0x776148a0 ]
+0x004 Blink : 0x0069354c _LIST_ENTRY [ 0x776148a0 - 0x776148a0 ]
+0x004 Blink : 0x776148a0 _LIST_ENTRY [ 0x69354c - 0x69354c ]
+0x000 Flink : 0x0069354c _LIST_ENTRY [ 0x776148a0 - 0x776148a0 ]
+0x004 Blink : 0x0069354c _LIST_ENTRY [ 0x776148a0 - 0x776148a0 ]
+0x03c SectionPointer : 0x776148a0 Void
+0x040 CheckSum : 0x776148a0
+0x044 TimeDateStamp : 0x548284c9
+0x044 LoadedImports : 0x548284c9 Void
+0x048 EntryPointActivationContext : (null)
+0x04c PatchInformation : (null)
+0x050 ForwarderLinks : _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x000 Flink : 0x00693560 _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x000 Flink : 0x00693560 _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x004 Blink : 0x00693560 _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x004 Blink : 0x00693560 _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x000 Flink : 0x00693560 _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x004 Blink : 0x00693560 _LIST_ENTRY [ 0x693560 - 0x693560 ]
+0x058 ServiceTagLinks : _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x000 Flink : 0x00693568 _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x000 Flink : 0x00693568 _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x004 Blink : 0x00693568 _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x004 Blink : 0x00693568 _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x000 Flink : 0x00693568 _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x004 Blink : 0x00693568 _LIST_ENTRY [ 0x693568 - 0x693568 ]
+0x060 StaticLinks : _LIST_ENTRY [ 0x694288 - 0x694260 ]
+0x000 Flink : 0x00694288 _LIST_ENTRY [ 0x694260 - 0x693570 ]
+0x000 Flink : 0x00694260 _LIST_ENTRY [ 0x693570 - 0x694288 ]
+0x004 Blink : 0x00693570 _LIST_ENTRY [ 0x694288 - 0x694260 ]
+0x004 Blink : 0x00694260 _LIST_ENTRY [ 0x693570 - 0x694288 ]
+0x000 Flink : 0x00693570 _LIST_ENTRY [ 0x694288 - 0x694260 ]
+0x004 Blink : 0x00694288 _LIST_ENTRY [ 0x694260 - 0x693570 ]
+0x068 ContextInformation : 0x7754c984 Void
+0x06c OriginalBase : 0
+0x070 LoadTime : _LARGE_INTEGER 0x0
+0x000 LowPart : 0
+0x004 HighPart : 0n0
+0x000 u : <unnamed-tag>
+0x000 LowPart : 0
+0x004 HighPart : 0n0
+0x000 QuadPart : 0n0
InInitializationOrderModuleLinks:
0:000> dt _LDR_DATA_TABLE_ENTRY [COLOR="Red"]0x6935a0[/COLOR] -r2
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x693920 - 0x693510 ]
+0x000 Flink : 0x00693920 _LIST_ENTRY [ 0x693a38 - 0x6935a0 ]
+0x000 Flink : 0x00693a38 _LIST_ENTRY [ 0x6941a8 - 0x693920 ]
+0x004 Blink : 0x006935a0 _LIST_ENTRY [ 0x693920 - 0x693510 ]
+0x004 Blink : 0x00693510 _LIST_ENTRY [ 0x6935a0 - 0x7761020c ]
+0x000 Flink : 0x006935a0 _LIST_ENTRY [ 0x693920 - 0x693510 ]
+0x004 Blink : 0x7761020c _LIST_ENTRY [ 0x693510 - 0x6941a8 ]
+0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x693928 - 0x693518 ]
+0x000 Flink : 0x00693928 _LIST_ENTRY [ 0x693a40 - 0x6935a8 ]
+0x000 Flink : 0x00693a40 _LIST_ENTRY [ 0x6941b0 - 0x693928 ]
+0x004 Blink : 0x006935a8 _LIST_ENTRY [ 0x693928 - 0x693518 ]
+0x004 Blink : 0x00693518 _LIST_ENTRY [ 0x6935a8 - 0x77610214 ]
+0x000 Flink : 0x006935a8 _LIST_ENTRY [ 0x693928 - 0x693518 ]
+0x004 Blink : 0x77610214 _LIST_ENTRY [ 0x693518 - 0x6941b0 ]
+0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x693a48 - 0x7761021c ]
+0x000 Flink : 0x00693a48 _LIST_ENTRY [ 0x693930 - 0x6935b0 ]
+0x000 Flink : 0x00693930 _LIST_ENTRY [ 0x6941b8 - 0x693a48 ]
+0x004 Blink : 0x006935b0 _LIST_ENTRY [ 0x693a48 - 0x7761021c ]
+0x004 Blink : 0x7761021c _LIST_ENTRY [ 0x6935b0 - 0x6941b8 ]
+0x000 Flink : 0x006935b0 _LIST_ENTRY [ 0x693a48 - 0x7761021c ]
+0x004 Blink : 0x006941b8 _LIST_ENTRY [ 0x7761021c - 0x693930 ]
+0x018 DllBase : 0x77510000 Void
+0x01c EntryPoint : (null)
+0x020 SizeOfImage : 0x180000
+0x024 FullDllName : _UNICODE_STRING "C:\Windows\SysWOW64\ntdll.dll"
+0x000 Length : 0x3a
+0x002 MaximumLength : 0x3c
+0x004 Buffer : 0x00693630 "C:\Windows\SysWOW64\ntdll.dll"
+0x02c BaseDllName : _UNICODE_STRING "ntdll.dll"
+0x000 Length : 0x12
+0x002 MaximumLength : 0x14
+0x004 Buffer : 0x77555df0 "ntdll.dll"
+0x034 Flags : 0x4004
+0x038 LoadCount : 0xffff
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x776148c0 - 0x776148c0 ]
+0x000 Flink : 0x776148c0 _LIST_ENTRY [ 0x6935dc - 0x6935dc ]
+0x000 Flink : 0x006935dc _LIST_ENTRY [ 0x776148c0 - 0x776148c0 ]
+0x004 Blink : 0x006935dc _LIST_ENTRY [ 0x776148c0 - 0x776148c0 ]
+0x004 Blink : 0x776148c0 _LIST_ENTRY [ 0x6935dc - 0x6935dc ]
+0x000 Flink : 0x006935dc _LIST_ENTRY [ 0x776148c0 - 0x776148c0 ]
+0x004 Blink : 0x006935dc _LIST_ENTRY [ 0x776148c0 - 0x776148c0 ]
+0x03c SectionPointer : 0x776148c0 Void
+0x040 CheckSum : 0x776148c0
+0x044 TimeDateStamp : 0x4ec49d10
+0x044 LoadedImports : 0x4ec49d10 Void
+0x048 EntryPointActivationContext : (null)
+0x04c PatchInformation : (null)
+0x050 ForwarderLinks : _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x000 Flink : 0x006935f0 _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x000 Flink : 0x006935f0 _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x004 Blink : 0x006935f0 _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x004 Blink : 0x006935f0 _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x000 Flink : 0x006935f0 _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x004 Blink : 0x006935f0 _LIST_ENTRY [ 0x6935f0 - 0x6935f0 ]
+0x058 ServiceTagLinks : _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x000 Flink : 0x006935f8 _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x000 Flink : 0x006935f8 _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x004 Blink : 0x006935f8 _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x004 Blink : 0x006935f8 _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x000 Flink : 0x006935f8 _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x004 Blink : 0x006935f8 _LIST_ENTRY [ 0x6935f8 - 0x6935f8 ]
+0x060 StaticLinks : _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x000 Flink : 0x00693600 _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x000 Flink : 0x00693600 _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x004 Blink : 0x00693600 _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x004 Blink : 0x00693600 _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x000 Flink : 0x00693600 _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x004 Blink : 0x00693600 _LIST_ENTRY [ 0x693600 - 0x693600 ]
+0x068 ContextInformation : (null)
+0x06c OriginalBase : 0x7de70000
+0x070 LoadTime : _LARGE_INTEGER 0x0
+0x000 LowPart : 0
+0x004 HighPart : 0n0
+0x000 u : <unnamed-tag>
+0x000 LowPart : 0
+0x004 HighPart : 0n0
+0x000 QuadPart : 0n0
由此得到InMemoryOrderLinks中链表顺序:
0x693510 F:\helloworld.exe
0x6935a0 ntdll.dll
0x693920 kernel32.dll
0x693a38 KERNELBASE.dll
0x6941a8 MSVCR110D.dll
0x7761020c null
InInitializationOrderModuleLinks中链表顺序:
0x6935a0 ntdll.dll
0x693920 kernel32.dll
0x693a38 KERNELBASE.dll
0x6941a8 MSVCR110D.dll
0x7761020c null
0x00693510 F:\helloworld.exe
对比发现,InMemoryOrderLinks和InLoadOrderLinks链表顺序相同,而与InInitializationOrderModuleLinks不同,其实也很好理解,在初始化过程中,一般是先初始内核模块,然后到应用层,而在内存中肯定一般先是用户层模块,在之后是内核模块啦!
LDR链基本结构弄清楚之后,接下来要做的就是断链了,先占个坑,上完课晚上回来补充O(∩_∩)O~~
Windows开发不完全指南