關於LDR的疑問與探索

之前學習斷鏈的時候瞭解到了LDR,最近考試周剛過比較閒,就整理了一下當時學習過程中的筆記,很基礎的文章。

在windows中,每一個模塊(exe,dll)對應了一個LDR_MODULE,這個模塊是讓系統認識到每個模塊的存在,在獲取模塊基址,獲取api地址用的很多,進而可以用來隱藏模塊,編寫外殼程序等……

關於結構LDR_MODULE的定義:

typedef struct _LDR_MODULE 
{ 
    LIST_ENTRY InLoadOrderModuleList; //按加載模塊順序構成的模塊鏈表
    LIST_ENTRY InMemoryOrderModuleList; //按內存順序的模塊鏈表
    LIST_ENTRY InInitializationOrderModuleList; //按初始化順序的模塊鏈表
    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; 
    LIST_ENTRY InLoadOrderModuleList; 
    LIST_ENTRY InMemoryOrderModuleList; 
    LIST_ENTRY InInitializationOrderModuleList; 
    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 中順序是
xxx.exe——>ntdll.dll——>kernel32.dll——->KERNELBASE.dll——–>MSVCR110D.dll——>null

用同樣的方法得到在在調試 InMemoryOrderModuleListInInitializationOrderModuleList中就出現了一個問題,按照之前讀地址就出現了錯誤(因爲苦逼學生黨晚上斷電,第二天重新加載了程序,地址會跟上面的會有不同,但是仍然出現無法正確讀出一些信息)

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      : _UNICODE_STRING "㗜ii䣈睡䣈睡㩴ii䣘睡䣘睡䣠睡䣠睡䣨睡䣨睡䣰睡䣰睡䣸睡䣸睡"
   +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 鏈表就可以完全讀出來個所以然,而偏偏到InInitializationOrderModuleListInMemoryOrderModuleList就不行了呢?

從調試信息來看,應該是地址不對,可是到底哪出了問題呢?
我們回過頭再來看這個結構體:
這裏寫圖片描述

所以_PEB_LDR_DATA中InMemoryOrderLinks其實指向的是_LDR_DATA_TABLE_ENTRY中InMemoryOrderModuleList成員地址,
而_PEB_LDR_DATA中InInitializationOrderModuleList指向的也是_LDR_DATA_TABLE_ENTRY中InInitializationOrderModuleLinks成員地址。

在CONTAINING_RECORD中應該是這樣計算結構體的地址的:
結構體的地址 + 成員變量的偏移 = 成員變量的地址

所以在進行鏈表遍歷查看的時候應該減去對應的成員變量的偏移:
InMemoryOrderLinks的地址 = InMemoryOrderModuleList - 0x008
InInitializationOrderModuleLinks地址 = InInitializationOrderModuleList - 0x010

而InLoadOrderModuleList = InLoadOrderLinks -0x000,這也就解釋了爲什麼這有這個地方可以讀出正確的地址而另外兩個鏈表不行
InMemoryOrderLinks:

0:000>  dt _LDR_DATA_TABLE_ENTRY 0x693510 -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 0x6935a0  -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鏈基本結構弄清楚之後,接下來要做的就是斷鏈了,之後補充上去。

這篇文章剛也同時發到看雪上了
關於LDR的疑問與探索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章