原文发表于百度空间,2009-07-10
==========================================================================
基础篇里说的那些东西搞完以后,任何正常的位置都找不到我们的Driver了,此时相应的手段基本上只剩下暴搜PE镜像或暴搜DriverObject了。而且,基础篇讲的那些东西,因为都是M$定好的一些格式和位置,代码怎么写都差不多,固定的路子而已。而抹PE镜像或抹DriverObject,真的是看你怎么猥琐了~
四、抹PE镜像
SYS文件也是标准的PE文件,加载驱动时由MmLoadSystemImage将其载入内存,于是内存中就有了完整的PE镜像。ring3我们可以暴搜内存查找隐藏的DLL模块,ring0我们基于同样的道理可以暴搜高端内存查找隐藏的SYS~为了对抗这种暴力搜索,必须将PE镜像的特征抹掉。
基本抹法就是抹掉MZ,PE标志,或者DosHeader->elfanew清0使找不到PE标记等等,但这些都是不够的,可以参考两个帖子:
MJ0011的《检测GMAE:HideDriver的工具》
http://www.debugman.com/read.php?tid=1250
PS:想要隐藏驱动bin的也可以在这里找到,建议先看刀客的HideDrv是怎么写的(方法在基础篇里讲了一部分),再看看MJ的drvdet是如何猥琐地进行检测。
还有老V拿WinHex改了之后的bin(要bin的也可以来这里,都差不多):
http://www.debugman.com/read.php?tid=1993
看看老V是如何更猥琐地绕过drvdet,然后MJ更更猥琐地提出的搜索DataDirectory法...
所以要抹还是彻底一点,整个抹了PEHeader,此时你已经没有任何特征,just a pool of executable Code~~
具体点,PE结构中pOptinalHeader->SizeofHeaders取PE头大小,然后直接整个Zero掉就可以了,但是要注意时机,否则会蓝蓝。至于文件后面的pdb路径,可以直接用WinHex填零,然后重新计算校验和即可,加载后自然也不会出现在内存中~
如果你使用了线程,按《RKU的StealthCode检测》的方法处理下StartAddress,免得被人查到
五、抹DriverObject
这个可以参考前面写的《对抗内存搜索对象》
没有Device,DriverObject就没有存在的必要,所以这里你爱怎么抹怎么抹,因为我们完全不需要它
对象头可以整个填零,或者用Fake ObjectType填充一下ObjectHeader->Type
DriverObject->DriverSection所指向的LDR_DATA_TABLE_ENTRY结构也要抹一抹,主要是几个关键数据和路径信息,全都填零吧
使用以上五种方法之后,隐藏驱动已经差不多到位,可以轻松bypass目前许多ARK了。关于此时的驱动如何与ring3通信,再说~