模块隐藏三种方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档