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
指针。
- 双向链表的节点结构,包含