windbg访问peb结构
对于peb来说,ldr结构体指向的PEB_LDR_DATA结构;
PEB_LDR_DATA包含InMemoryOrderModuleList
InMemoryOrderModuleList 是链表的头节点
#首先更新符号:
.reload /f ntdll.dll
#查看peb,可以区分是x86还是x64:
!peb虽然是amd64架构,但程序是x86
(下文InMemoryOrderModuleList和InMemoryOrderLinks不要搞混)
所以有PEB_LDR_DATA→InMemoryOrderModuleList
InMemoryOrderModuleList→Flink,
Flink包含的指针指向LDR_DATA_TABLE_ENTRY
在LDR_DATA_TABLE_ENTRY 中又有InMemoryOrderLinks (和InMemoryOrderModuleList完全不是一回事,其中InMemoryOrderModuleList 是头节点,而InMemoryOrderLinks 是链表的组成部分)
**InMemoryOrderModuleList**32位进程中,于PEB_LDR_DATA中的偏移(offset)为0x14,
64位偏移为0x20;
InMemoryOrderLinks 32位进程中,在LDR_DATA_TABLE_ENTRY中的偏移为0x08,
64位偏移为0x10;
classDiagram
class PEB {
+0x00 Ldr : Ptr64 _PEB_LDR_DATA
}
class PEB_LDR_DATA {
+0x00 Length : Uint4B
+0x04 Initialized : UChar
+0x08 SsHandle : Ptr64 Void
+0x10 InLoadOrderModuleList : _LIST_ENTRY (32位偏移: 0x0C)
+0x20 InMemoryOrderModuleList : _LIST_ENTRY (32位偏移: 0x14 | 64位偏移: 0x20)
+0x30 InInitializationOrderModuleList : _LIST_ENTRY
}
class LDR_DATA_TABLE_ENTRY {
+0x00 InLoadOrderLinks : _LIST_ENTRY (链表节点1)
+0x08 InMemoryOrderLinks : _LIST_ENTRY (32位偏移: 0x08 | 64位偏移: 0x10)
+0x10 InInitializationOrderLinks : _LIST_ENTRY
+0x18 DllBase : Ptr64 Void
+0x20 BaseDllName : _UNICODE_STRING
}
class _LIST_ENTRY {
+0x00 Flink : Ptr64 _LIST_ENTRY
+0x08 Blink : Ptr64 _LIST_ENTRY
}
PEB --> PEB_LDR_DATA : Ldr
PEB_LDR_DATA --> _LIST_ENTRY : InMemoryOrderModuleList (头节点)
_LIST_ENTRY --> LDR_DATA_TABLE_ENTRY : Flink -> InMemoryOrderLinks (链表节点)1. 结构体层级关系
PEB- 包含
Ldr字段,指向PEB_LDR_DATA结构体。
- 包含
PEB_LDR_DATA- 关键成员:
InMemoryOrderModuleList(链表头节点)。 - 偏移量:
- 32位:
+0x14 - 64位:
+0x20
- 32位:
- 关键成员:
LDR_DATA_TABLE_ENTRY- 关键成员:
InMemoryOrderLinks(链表节点成员)。 - 偏移量:
- 32位:
+0x08 - 64位:
+0x10
- 32位:
- 关键成员:
_LIST_ENTRY- 双向链表的节点结构,包含
Flink和Blink指针。
- 双向链表的节点结构,包含



