【windows】通过断链隐藏模块(DLL)
概述:主要通过 TEB + PEB 实现
1. 三环断链(EPB断链)
作用:3环断链通常用于在用户层隐藏dll
1.1. 步骤说明
获取dll模块的步骤:
- 获取TEB
- 获取PEB
- 获取ldr
- dll模块
详细步骤:
-
TEB 的获取方法为:
-
通过 TEB 结构体发现, PPEB(PEB指针,只想PEB结构体首地址),位于 TEB 偏移 0x30 处,因此
-
通过 PEB 结构体发现, ldr 位于 PEB 偏移 0xc 处,因此
-
通过 ldr 指向的结构体
_PEN_LDR_DATA结构体找到3个双向循环链表_LIST_ENTRY结构体。 -
_LIST_ENTRY结构体中有两个成员,指向前驱模块节点的_LIST_ENTRY、指向后继模块节点的_LIST_ENTRY。 -
节点指针指向的是
_LIST_ENTRY结构体,该结构体存储了模块在链表中的位置信息 -
通过
_LDR_DATA_TATBLE_ENTRY结构体中偏移 0x18 的DllBase确定要隐藏的dll,并通过该结构体中的_LIST_ENTRY结构体删除该节点在链表中的位置信息(双向循环链表删除节点),即可达到3环下的dll隐藏。_LDR_DATA_TABLE_ENTRY与_PEB_LDR_DATA的关系:_LDR_DATA_TABLE_ENTRY与_PEB_LDR_DATA的关系是,_LDR_DATA_TABLE_ENTRY是_PEB_LDR_DATA结构的一部分,用于存储模块加载相关信息。具体来说,
_PEB_LDR_DATA结构包含三个链表排序方式,分别是模块加载顺序、模块内存顺序、模块初始化顺序。这些链表结构是通过_LDR_DATA_TABLE_ENTRY来存储的,每个_LDR_DATA_TABLE_ENTRY都包含了模块的相关信息,如模块名称、模块大小、模块地址等。在调试信息中,可以通过断点和查看寄存器等方式来查看
_LDR_DATA_TABLE_ENTRY和_PEB_LDR_DATA的内容,进而分析模块的加载和运行情况。
1.2. 相关结构体
1.2.1. TEB
1 | |
1.2.2. PEB
1 | |
1.2.3. ldr的结构体:_PEB_LDR_DATA
1 | |
1.2.4. _LIST_ENTRY 的结构体:
后文结构体强转就是因为 Blink 直接返回的是 _LDR_DATA_TABLE_ENTRY 的首地址。
1 | |
1.2.5. 补充:_LDR_DATA_TABLE_ENTRY 结构体
存储dll模块的信息
1 | |
1.3. Demo
1 | |
2. 0环断链(EPROCESS断链)
作用:0环断链通常用于在内核层隐藏进程
2.1. 1 步骤说明
获取进程模块的步骤为:
- 获取
_KPCR- 获取
_KPRCB- 获取
_KTHREAD- 获取
_KAPC_STATE- 获取
_KPROCESS- 获取
_EPROCESS
详细步骤说明: [todo]