Windows平台内核级文件拜候[Windows安全]
本文“Windows平台内核级文件拜候[Windows安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
后台
在windows平台下,利用程序普通利用API函数来举行文件拜候,成立,翻开,读写文件.从kernel32的 CreateFile/ReadFile/WriteFile函数,到本地系统服务,再到FileSystem及其FilterDriver,阅历了很多 层次.在每个层次上,都存在着安全防护软件,病毒大概后门作监督大概过滤的机会.作为安全产品开辟者,我们需求比别人走得更远,因此我们需求一个底层的“windows平台内核级文件拜候”的办法来确保我们可以看到精确的干净的文件系统.
直接拜候FSD的内核级别文件拜候
FSD(FileSystemDriver)层是文件API函数经过本地系统服务层(native API)最后到达的驱动层次.假如我们可以模拟操作系统,在我们自己的驱动程序里直接向FSD发送IRP,便可以绕过那些native API 和win32 API了,也便可以绕过设置在这些层次上面的API钩子等监控办法.
文件的Create和Open
文件的Create和Open可以通过发送IRP_MJ_CREATE给FSD,大概调用IoCreateFile函数来完成.Create和Open的辨别实际上在于IoCreateFile/IRP_MJ_CREATE的一个参数Disposition的取值.
通过发送IRP_MJ_CREATE给FSD的办法与此近似,可以参考IFSDDK document的IRP_MJ_CREATE阐明.差别于上面办法的是需求自己成立一个FILE_OBJECT,好过上面办法的是这种办法不需求一个 HANDLE,HANDLE是线程依靠的,FileObject则是线程无关.
文件的Read和Write
我们通过给FSD发送IRP_MJ_READ来读取文件,给FSD发送IRP_MJ_WRITE来改写文件.
假如我们是通过一个HANDLE来履行(如利用IoCreateFile翻开的文件),就要先用ObReferenceObjectByHandle函数来得到这个Handle对应的FileObject.我们只能给FileObject发送IRP.
之后我们利用IoAllocateIrp分配一个IRP.按照FileObject->DeviceObject->Flags的值,我们判断目标文件系统利用什么样的IO方法.
对每种差别的IO方法利用差别的地址传送方法.随后我们填充IRP内的各个参数域,便可以发送IRP了.
接着要考虑假如IRP不能及时完成,会异步的返回的情形,我们安装一个CompletionRoutine,在CompletionRoutine里面设置一个事件为已激活,告诉我们的主线程读取大概写入操作已经完成.
目前可以发送IRP了.假如不采纳特别的办法的话,IRP发送目标是FileObject对应的DeviceObject.发送后,等候IRP的完成并且释放资源,返回.
文件的Delete
Delete实际上是通过向FSD发送IRP_MJ_SET_INFORMATION的IRP,并把 IrpSp->Parameters.SetFile.FileInformationClass设置为 FileDispositionInformation,用一个FILE_DISPOSITION_INFORMATION构造填充buffer来履行 的.
文件的Rename
近似于Delete,Rename是向FSD发送IRP_MJ_SET_INFORMATION的IRP,把 IrpSp->Parameters.SetFile.FileInformationClass设置为 FileRenameInformation,填充buffer为FILE_RENAME_INFORMATION构造.
综上,于是我们可以在驱动里面通过发送IRP来直接拜候文件系统了,绕过了native API 和win32 API层次.
绕过文件系统过滤驱动和钩子
有了以上的内容,我们目前可以直接给FSD发送恳求操作文件.但是这还不够,因为有很多的杀毒软件大概监督工具利用FSD Filter Driver大概FSD Hook的办法来监控文件操作
对付文件系统过滤驱动
文件系统过滤驱动Attach在正常的文件系统之上,监督和过滤我们的文件拜候.文件系统驱动栈就是由这一连串的Attach起来的过滤驱动组 成.我们可以用IoGetRelatedDeviceObject这个函数来得到一个FileObject对应的最底层的那个功效驱动对象(FDO).但 是这样固然绕过了那些过滤驱动,却同时也绕过了正常的FSD如Ntfs/Fastfat,因为正常的FSD也是作为一个过滤驱动存在的.磁盘文件对象的对 应的最底层的FDO是Ftdisk.sys,它已经因为过于底层而不能处理我们送达的IRP恳求.
其实正常的FSD信息存储在一个Vpb构造中,我们可以利用IoGetBaseFileSystemDeviceObject这个未公开的内核函数来得到它.它就是我们发送IRP的目标了.
对付替换DispatchRoutine的FSD Hook
这是一种常用的FSD Hook方法.我们需求得到本来的DispatchRoutine,向本来的DispatchRoutine发送我们的IRP.这里供应一个思绪:我们可 以读取本来FSD驱动的.INIT段大概.TEXT段,查找其DriverEntry函数,在它的DriverEntry函数中必定设置了自己的 DriverObject的各个DispatchRoutine.在这个函数中我们就可以找到我们想要的DispatchRoutine的地址.只需求利用 特点码搜索的办法便可以搜索到这个值.
对付Inline Hook DispatchRoutine函数本身的FSD Hook
这种Hook办法对比毒辣,但不是非常常见于安全产品中,普通利用在木马和rootkit上,比方我自己写的rootkit.它没有更改 DriverObject里面的DispatchRoutine的函数指针,而是向函数开首写入汇编指令的JMP来跳转函数.对付它的基本思绪就是读取存 在磁盘上的FSD的文件,加载到内存一份干净的备份,察看我们要调用的DispatchRoutine开首的几个字节和这个干净备份能否一致.假如不一 致,特别是存在JMP,RET,INT3一类的汇编指令的时刻,极大概就是存在了Inline Hook.(但要充分考虑重定位的情形.)假如存在Inline Hook,我们就把干净的函数开首拷贝过来覆盖掉被传染的函数头.然后在发送IRP,就不会被Inline Hook监督或篡改了.
怎么样?看完了后你有什么设法?对!就是用这种办法来冲破主动防备类软件,目前主动防备已经是将来杀软的一个发展趋向了,而想冲破主动防备,必必要有踏实的编程功底,今后的免杀(指主动防备)再也不是菜鸟所能制作的了,所以各位真的想玩免杀的话,今后编程就是必不可缺了!
以上是“Windows平台内核级文件拜候[Windows安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |