-
摘要(转自网络):
一、从
< br>PEB
的
Ldr
链中消失
引用内容
lkd> dt _PEB 7ffdc000 //
当前
p>
PEB
的地址
nt!_PEB
...
+0x00c Ldr
:
0x001a1e90
_PEB_LDR_DATA
//
这里指向
Ldr
结构
lkd> dt _PEB_LDR_DATA
0x001a1e90 //
这个结构里有三个链表的表头
nt!_PEB_LDR_DATA
+0x000 Length
: 0x28
+0x004 Initialized
: 0x1 ''
+0x008 SsHandle
: (null)
+0x00c
InLoadOrderModuleList
:
_LIST_ENTRY
[
0x1a1ec0
-
0x1a34f8
]
+0x014 InMemoryOrderModuleList :
_LIST_ENTRY [ 0x1a1ec8 -
0x1a3500 ]
+0x01c
InInitializationOrderModuleList
:
_LIST_ENTRY
[
0x1a1f28
- 0x1a3508 ]
+0x024 EntryInProgress
: (null)
这里看到有三
个链表,其实三个链表的内容是一样的,但是链表的顺序不一样,
分别按加载顺序、内存
顺序、初始化顺序排列。
每一个
DL
L
由一个
LDR_DATA_TABLE_ENTRY
结构描述,但是第一个结构被链入了
三个链表。取一个来看看:
引用内容
lkd>
dt _LDR_DATA_TABLE_ENTRY 0x1a34f8
nt!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY [
0x1a1e9c - 0x1a3450 ]
+0x008
InMemoryOrderLinks : _LIST_ENTRY [ 0x1a1ea4 -
0x1a3458 ]
+0x010
InInitializationOrderLinks : _LIST_ENTRY [
0x1a1eac -
0x1a3460 ]
+0x018 DllBase
:
0x20000000
+0x01c EntryPoint
:
(null)
+0x020 SizeOfImage
: 0x549000
+0x024 FullDllName
: _UNICODE_STRING
+0x02c BaseDllName
: _UNICODE_STRING
......//
省略部分内容
<
/p>
随便取一个链表进行遍历,根据
DllBase
< br>找到自己的
DLL
之后,从三个链中
RemoveEntryList
就可以了,这样所有使用
PEB->Ldr
结构来枚举
DLL
链
表的就
无法找到了。
由于大部分
p>
ARK
对隐藏
DLL
的查找并不是很重视
(
比如
RKU,
Gmer,XueTr,Atool,NIAP)
,因此该方法就可以
< br>bypass
很多
ARK
了,还
是有
一定市场的
~
但对
IceSword
是个例外
二、从
VAD
树中消失
IceSword
在枚
举进程模块时使用的是
ZwQueryVirtualMemory
,查询的
InfoClass
是
M
emorySectionName(
或者叫
MemoryM
appedFilenameInformation
,
值为<
/p>
2)
。
NtQueryVirtualM
emory
首先判断
Vad->ControlArea->
FilePointer
是
否有效,若有效则调用
ObQueryNameString
查询此文件对象的名
< br>
称,最终由文
件系统完成此次查询工作。
关于
VAD
的详细知识,
可以参考《
JIURL
玩玩
Win2k
内存篇
VAD
》,这里不作为
重点,知道是平衡二叉树就可以了,树的根结点在
EPROCESS<
/p>
中。
引用内容
lkd> dt _EPROCESS 83f915b8
nt!_EPROCESS
...
+0x11c VadRoot
:
0x84079c08
该成员是一个
MMVAD
类型的结构,而成员
LeftChild
和
RightChild
分别是该结
点的左子结点和右子结点。
引用内容
lkd> dt
_MMVAD 0x84079c08
nt!_MMVAD
+0x000 StartingVpn
: 0x8e0
+0x004
EndingVpn
: 0x8e0
+0x008 Parent
:
(null)
+0x00c LeftChild
:
0x843b1128 _MMVAD //
左孩子
+0x010 RightChild
: 0x840bf4a0
_MMVAD //
右孩子
+0x014 u
: __unnamed
//
标志位
+0x018 ControlArea
: (null)
+0x01c
FirstPrototypePte : (null)
+0x020 LastContiguousPte : (null)
+0x024 u2
: __unnamed
要
对目标
D
LL
实施隐藏时,先获取该
DLL
基址
,然后遍历
VAD
树,根据
MMVAD
->StartingVpn
做匹配
(StartingVpn
实际上
是内存地址的高
20
位,比如
0x7c800000
在这里将只显示为
0x7c800)
找到目标
DLL
的
VAD
结构<
/p>
(
这里以
为例,
其
加载地址正为
0x7c800000):
引用内容
lkd> dt
_MMVAD 84174a18
nt!_MMVAD
+0x000 StartingVpn
: 0x7c800
+0x004
EndingVpn
: 0x7c91b
-
-
-
-
-
-
-
-
-
上一篇:爱维达UPS使用说明书
下一篇:120KVA,UPS操作说明中英文对照