【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]