windbg访问peb结构

对于peb来说,ldr结构体指向的PEB_LDR_DATA结构;

PEB_LDR_DATA包含InMemoryOrderModuleList

InMemoryOrderModuleList 是链表的头节点

#首先更新符号:
.reload /f ntdll.dll
#查看peb,可以区分是x86还是x64:
!peb

image.png image.png

image.png image.png

虽然是amd64架构,但程序是x86

(下文InMemoryOrderModuleListInMemoryOrderLinks不要搞混)

所以有PEB_LDR_DATA→InMemoryOrderModuleList

image.png image.png

InMemoryOrderModuleList→Flink,

Flink包含的指针指向LDR_DATA_TABLE_ENTRY

LDR_DATA_TABLE_ENTRY 中又有InMemoryOrderLinks (和InMemoryOrderModuleList完全不是一回事,其中InMemoryOrderModuleList 是头节点,而InMemoryOrderLinks 是链表的组成部分)

image.png image.png

**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. 结构体层级关系

  1. PEB
    • 包含 Ldr 字段,指向 PEB_LDR_DATA 结构体。
  2. PEB_LDR_DATA
    • 关键成员InMemoryOrderModuleList(链表头节点)。
    • 偏移量
      • 32位+0x14
      • 64位+0x20
  3. LDR_DATA_TABLE_ENTRY
    • 关键成员InMemoryOrderLinks(链表节点成员)。
    • 偏移量
      • 32位+0x08
      • 64位+0x10
  4. _LIST_ENTRY
    • 双向链表的节点结构,包含 Flink 和 Blink 指针。