新
查找隐藏的DLL文件
,
:_??_O露,日口—雹旧:)栏目编辑)scket>蠢?瞄.-I—?l誓__???
有位哲人说过:人类在进步,社会在发
展.一切事物都不是原地踏步而是曲折发展 的.随着网络的发展,我们在网络中邀游的同 时,又不断的遭受着电脑病毒.尤其是近两 年,随着RK技术的流行越来越多的病毒,木 马大大小小都带着驱动,尤其是广为人知道的 机器狗.就带着一个强大的驱动,穿破N多还原 保护软件.随着安全软件厂商间的竞争激烈, 越来越多的功能强大,价格优惠的安全软件得 到了普及,尤其是HlPS(主动防御技术)的流 行,迫使病毒寻求更隐蔽的加载方式来获得生 存.目前的一个病毒发展趋势是往无进程方向 发展.其实,这种发展方向在很多年前就广为 流传,不过因为RK的发展,我们逐渐忽略了这 一
技术,不过.目前的无进程技术更是结合了 以往的DLL技术和RK技术.搜索隐藏中的DLL并 清除出去成为了我们保护网络安全,清除垃 圾,还原网络绿色环境的必走之路.
我们知道,查找DLL的一般方法除了调用系 有直接结束微点的方法了,可是我们讨论的这种 方法没有结束微点进程,不会引起用户注意,因 为只要知道使用ruk的人发现自己电脑上的微点
被结束的话,估计马儿的末日也差不多到了.上 文已经提到了,其它的监控设置函数和进程创建 监控设置函数的机理是一样的,要实现其他过滤 只要依葫芦画瓢就可以了,微点对几乎以上提到 的所有设置监视函数的函数进行了挂钩,获取真 统提供的APl,比如EnumPrOCessMOduIes,
EnumPrOCessMOduIesEX, MOduIe32FirSt,
Module32Next,
ZwQuerySystemlnformation等,还
有在进程的内存里搜索PE结构信息来查找DLL 或者是获取进程的PEB结构,然后根据PEB一> Ldr,>lnLoadOrderModuleList来枚举进程中的DLL. 上面的方法都是众所周知的,而我最近在 写,个ARK的工具作为平时练手.上述的方法 虽然被应用到了我的工具中但这些方法并不 能很有效的查出隐藏中的DLL.所以,为解决需 求.需要寻找一个新的方法.
大家都知道,加载DLL的时候,肯定要在进 程的用户空间内存申请内存,也就是说肯定会 有,个数据结构对内存的使用做了详细的记 录.那么.我们就以此为线索来查找这个数据 结构.经过自己的
和参考了一些
,加 上最近MJO011在韩国的一个黑客大会上以 VMWARE的内存文件来分析系统RK的报告里 面正好提到了本文要说的一个结构一一 实地址的方法大同小异.
本文的代码开发平台为wdk6000,VC6.0, 驱动在WindowsXPSP2,微点1.2.10581.1试
用版上测试成功,可以过滤掉微点的进程创建
日志功能.
(编辑提醒:本文涉及的代码,已收录入
本期光盘杂志相关栏目;也可以到黑防官方网
站下载)刀)
-一
—等啊
狙j,::一;………一
MM—
AVL—TABLLE.在进程结构EPROCES里有个
MM—
AVL—TABLEVadRoot成员,这个结构
了进程的用户空间内存使用情况.MM—AVL—
TABLE的结构如下
1~typedefstructMM—AVLTABLEI
IMADDRESS_NODEBalancedR0ot;l luLONG_PTRDepthOfTree:5;l IULONG—PTRUnused:3;f
I弹ifdefined(_WIN64)I
IU~NGPTRNumberGenericTableElements:56;l
J#elseJ
IULONG_PTRNumberGenericTableElements:24;II
#endif{fPVOIDNodeHint;PVOIDNodeFreeH;』『int:i}MM—AVLTABLE,*PMMAVL
—TABLE;l
——————————————————————————————————————————————一———————————1_一 这个结构记录了一些基本的内存使用信
息其中成员MMADDRESS—NODEBaIancedRoot 结构如下:
tyl:K:Ktefstruct,MMADDRESSNODE{I union{l
LONG—PTRBalance:2:l
struct—MMADDRESS—NODE*Parent;f lul;1
structMMADDRESS—NODE*LeftChild;I struct—MMADDRESSNODE*RightChild;J ULONGPTRStartingVpn;l ULONG—PTREndingVpn;{
}MMADDRESS.NODE,*PMMADDRESSNODE;
仔细看去,貌似到了这里,我们就山穷水
尽了,但上天总会留,线生机的.我们可以假
设下如果到了这里就没别的数据可以查看
了,那么windOWS又是怎么查看某进程中内存 的使用情况的呢?好在我们有WRK,这一
Windows送的源代码,在\base\ntos\mm\mi.h 文件里发现了MMVAD结构,这个结构如下: ll圜rw黑w客w.h防aek线er.e.o.0m.eL.. 之所以要介绍这个结构,是因为我看它第
一
眼就感觉这个结构比较特殊.我们可以发
现,这个结构的前半部分是与MMADDRESS —
NODE的结构类似的,至少从数据长度上来看
是相同的.前半部分不同的是左树和右树的结
构类型不同,但是仅仅是类型名字的不同,不
管怎么说,它们还是指针,因此我们大胆的猜
测下,如果MMADDREsS—NODE后面还有数据 呢?而且我们可以发现MMVAD结构中有个很
重要的结构CONTROL—AREA,这个结构记录了
很多重要的信息.我们打开wINDBG,进入本地
内核调试状态.
lkd>!process
PROCESS8928d030
1t弱4000ParentCid:0634
DirBase:7f380300
HandleCount:97.
Sessionld:0Cid:03O4Peb
hnage:windbg.exe
VadRoot893a4ba8Vads84Clofie0Private1005 Modified2l61.Locked1.
DeviceMape285aa10
Tokenel036540
注意VadRoot893a4ba8,在EPROCESS
结构中,是一MM—AVL—TABLE~构.我们再看下
里面的信息.
)栏目编辑)socket>
+0X004LeftChild:0x89406b90MMADDRESsNODE +0x008RightChild:0x893e2798
一
MMADDRESS—N0DE
+0x00cStarti~【gVpn:0xl0o0
+OxO10EndingVpn:OxlO95
lkd>dd0x893a4ba8
893a4ba88928d280894O6b90893e279800001000 893a4bb80000l095072000l889325a50elOe8b20 893a4bc8fffffffc580000000l086(J()o01087fff 893a4bd80000Oo00893a4bd8lal40oo820707249 893a4be8O094O0H06O0H000000OOoo()oo0000ooooO
893a4bf8893a4bf8893a4bf80000I)o0O00000000
893a4c08010l000l04000O0Oooa7e0b800000000 893a4cl8OOo()o0oo0000OOO00OOO0oOO00000ooO lkd>dtmmvad0x893a4ba8
nt!,MMVAD
+OxO00ul:——
unnamed
+0x004LeftChiid:0x89406b90一
MMVAD
+0xoo8RightCt*ild:Ox893e2798MMVAD +0x00cStartingVpn:0xl000
+0x0l0EndingVpn:0xl095
+0x014u:unnamed
+0x0l8Contro1Area:Ox89325a50CONTROL AREA
+0x01cFirstPrototypePte:0xel0e8b2oMMPTE {OxO2OLastContiguousPte:0xfffffffc—MMPTE
+0x024u2:…umlamed
lkd>dtcontrolarea0x89325a50 nt!CONTROLAREA
+OxO00Segment:0xel0e8ae0SEGMENT +0x004DereferenceList:L1STENTRY【OxO
OxOI
+0x00cNumberOfSectionRefeFences:l f0x010NumberOfPfnReferences:0x7a 0x0t4NumberOfMapI-~"<tViews:l 4-0x018NumberOfSystemCacheViews:0 +0x01cNumberOfUsorReferenccs:2 +0x020u:——unnamed
+0x024FilePointer:Ox8984lb40,FlLEOBJECT
+0xO28WaitingForDeletion:(nul1) +0x02cModifiedWriteCount:0 +0x02eFlushImProgres~Count:0 +0x030WritableUsetReferences:0 +0x034QuadwordPad:0
lkd>dt—fileobjectOx89841b40 nt!一FILEOBJECT
+0x000Type:5
+0x002Size:ll2
+0x01NDeviceOboct:0x89f90e00DEVICE_OBJECT
+0x008Vpb:0x89fadtc8VpB
+0x00cFsContext:OxetOel5b0 +OxO10FsContext2:0xe28a0c58 +Oxf)l4SectionObjectPointer:Ox893354cc
_SECTIONOBJEeT—POINTERS
~0x018PnvaCeCacheMap:(nun) +0x0lcFinalStatus:0
+Ox020RelatedFileObjeel:(nUii) +0x024LockOperation:0"
+OxO25DeletePending:0,
t0x026ReadACCeSS:0xl}
+0xO27WriteAc(脚:0"
+Ox028DeleteAccess:0"
+0x029SharedRead:0xl
+0x02aSharedWrite:0"
+0x02bSharedDelete:0xl
+0x02cFlags:0x44042
+0x030FileName:UNICODESTRINGii\Pro—
gramFiles\DebuggingToolsforWindows(x86)\windbg.
exe}f
可以看到"dd0x893a4ba8"后面还有数
据,和MMVAD结构对照下,正好可以对照到 cONTROL—
AREA的指针,那么我们就试着解析
MMVAD结构,可以看到我们找到了CONTROL— AREA结构继续解析CONTFIOL—AREA结构,一 直到FlLE—OBJECT结构.由后面的结果可以清晰 地看到,我们得到了当前进程的可执行文件的 文件名.
由上可以证明我的大体思路是正确的,那 么我们怎么确定一个FILE—OBJECT所指向的文件 是一个可执行文件呢7首先要废除掉的就是根 据文件后缀来判断是否是一个可执行文件,这 是一个非常NC的想法.还是从CONTROL—AREA 结构入手.
'
簧距200912黑客防线?瞳?_
?'.;'………一
其中有两个比较特殊的成员L0ngFIagS和 FIags.查看MMSECTION—FLAGS结构,可以发现 一
个成员为lmage.根据调试发现如果Image为 1,那么就是可执行文件.
在跟踪调试的时候,还发现CONTROL— AREA->Segment一>u2Imagelnfo&~录了一些执行
文件的信息,本来想当然的认为可以以此作为 判断一个文件是否为可执行文件的依据但在
实现后发现并不准确.所以就找到了上面提 到的CONTROL—AREA一>lJFlags成员.这个方法被 大家关注的少,还可以对付一些病毒和木马. 前置知识VB
关键词:编程,窗口攻击,HOOk
最后再简单说说代码实现.枚举DLL的关键 步骤之一就是获得足够的进程,之所以说是足 够的进程.是说尽最大能力找到隐藏中的进 程.获取进程的方法很多.比如解析
PspCidTabJe,枚举PsActiveProcessHead,HOOK
SwapContext,OPENPROCESSFROM0TO65554
等.我提供的代码里只用了一种方法,枚举 MmProcessLinkS.剩下的方法,黑防以前都做过 精彩的讲述,而且网络上也有很多相关的代 码.大家可以自己补充到工具里.总体来说, 代码比较简单,不过在解析AVL树的时候千万 不要用递归,否则会很郁闷的.
(编辑提醒:本文涉及的代码,已收录入
本期光盘杂志相关栏目;也可以到黑防官方网 站下载)
瓣凰摹
文/图胡文亮(Hovi.Delphic)[HooS RootkitS自诞生以来,为了逃脱被杀毒软件 和ARKS歼灭的命运,纷纷以各种方式保护自 己.什么加壳伪装之类的方法无法使用之后, RootkitS就纷纷开始反攻杀毒软件和ARKs.最直 接的反攻方法就是结束杀毒软件和ARKS进程, 但是在杀毒软件和ARKs进程保护日益增强和无 法加载驱动的情况下,直接结束进程的方法就
不太好用了.为了达到同样的目的,ROOtkitS开 始对杀毒软件和ARKS的窗体进行攻击.从古老 的窗口消息洪水攻击到去年才曝光的设置父 母卸载窗口",都是窗口攻击技术的典型代 表.尽管各大杀毒软件和ARKs在SSSDT上HOOK 了一大堆函数,但是由于函数太多,以及窗口 句柄的全局性,所以收效甚微.对于已经被用 滥的窗口消息洪水攻击,我还想提一下. —翻ll_ill.
WlN32APISendMessage对应的是NatiMeAPI NtUserMessageCal】,WIN32APIPostMessage对 应的是NativeAPlNtUserPostMessage,如果某 些ARK只是挂钩了其中一个函数,比如狙剑只 HOOK了NtUserMessageCalJ,天琊只HOOK了 NtUserPostMessage,那么就等于没有防范.而至 于SetParent,在参数过滤不严格的情况下还是可 以用的(1:L~13360,尽管我们不能把它的窗体设 置为自己的子窗体,但可以把我们的窗体设置 为它的子窗体).下面,介绍四种我总结出来 的窗El攻击方法.
窗口失效大法
在wIN32APl里,有个神奇的API叫
EnabIeWindow,它可以使窗口和控件等有效或