c语言断链隐藏dll,关于隐藏进程DLL的方式(待实现)

本帖最后由 ffashi 于 2020-1-14 08:05 编辑

从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

+0x008        Parent                                                                                                :        0x841223a0        _MMVAD

+0x00c        LeftChild                                                                        :        0x84120470        _MMVAD

+0x010        RightChild                                                                :        0x841a4790        _MMVAD

+0x014        u                                                                                                                                        :        __unnamed

+0x018        ControlArea                                                        :        0x876d0b88        _CONTROL_AREA        //关键域

+0x01c        FirstPrototypePte        :        0xe177d6f0        _MMPTE

+0x020        LastContiguousPte        :        0xfffffffc        _MMPTE

+0x024        u2                                                                                                                                :        __unnamed

lkd>        dt        _CONTROL_AREA        0x876d0b88

nt!_CONTROL_AREA                                        ...

+0x024        FilePointer                                                        :        0x876d0b10        _FILE_OBJECT外//目标在这里

好        了,看到FILE_OBJECT了,这时你应该会想到系统是从这里取到的文件名吧,没错,这儿就是我们要动手脚的地方。

根据小伟、Sysnap等人的测        试,只要把ControlArea->FilePointer->FileName.Buffer填0就可以实现该DLL的隐藏

(根据字符串        的特性,实际上只需要把第一个字符填0就可以了),此时ZwQueryVirtualMemory将返回0xC0000039错误,

即“指定的路径无        效”,自然也就枚举不到了。而且对于那些共享的dll,如系统的ntdll.dll,kernel32.dll或在不同进程中被加载2次或以上的dll,

虽然是在不同进程中,但是使用的是同一个共享的ControlArea结构,因此只需要改一个,那么在所有进程中都将实现隐藏,

这对于隐藏全局钩子类型的        dll显然是非常方便的。         IS是在ZwQueryVirtualMemory查完全无法枚举到DLL时才采用枚举PEB的方法,

因此结合前面的Ldr断链法,足以搞定N多ARK了。         我所说的“从VAD树中消失”只是使该VAD的信息从IS的查询结果中消失,而并不是真的摘掉该VAD~~

值得一说的是,Sysnap的Yas        Kit在检测隐藏DLL方面也是比较强的,但是对于动了VAD的,似乎也无能为力~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值