模块隐藏三种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要(转自网络):
一、从PEB的Ldr链中消失
引用内容
lkd> dt _PEB 7ffdc000 //当前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)
这里看到有三个链表,其实三个链表的内容是一样的,但是链表的顺序不一样,分别按加载顺序、内存顺序、初始化顺序排列。
每一个DLL由一个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
"C:\WINDOWS\system32\xpsp2res.dll"
+0x02c BaseDllName : _UNICODE_STRING
"xpsp2res.dll"
......//省略部分内容
随便取一个链表进行遍历,根据DllBase找到自己的DLL之后,从三个链中RemoveEntryList就可以了,这样所有使用PEB->Ldr结构来枚举DLL链表的就
无法找到了。
由于大部分ARK对隐藏DLL的查找并不是很重视(比如
RKU,Gmer,XueTr,Atool,NIAP),因此该方法就可以bypass很多ARK了,还是有一定市场的~
但对IceSword是个例外
二、从VAD树中消失
IceSword 在枚举进程模块时使用的是ZwQueryVirtualMemory,查询的InfoClass是MemorySectionName(或者叫 MemoryMappedFilenameInformation,值为2)。NtQueryVirtualMemory首先判断 Vad->ControlArea->FilePointer是否有效,若有效则调用ObQueryNameString查询此文件对象的名称,最终由文件系统完成此次查询工作。
关于VAD的详细知识,可以参考《JIURL玩玩Win2k内存篇 VAD》,这里不作为重点,知道是平衡二叉树就可以了,树的根结点在EPROCESS中。
引用内容
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
要对目标DLL实施隐藏时,先获取该DLL基址,然后遍历VAD树,根据MMVAD->StartingVpn做匹配(StartingVpn实际上是内存地址的高20位,比如0x7c800000在这里将只显示为0x7c800)找到目标DLL的VAD结构(这里以kernel32.dll为例,其加载地址正为0x7c800000):
引用内容
lkd> dt _MMVAD 84174a18
nt!_MMVAD
+0x000 StartingVpn : 0x7c800
+0x004 EndingVpn : 0x7c91b