热门关键字: excel200 蓝光笔记 pps有图像 excel winrar使 添加水印 輸入法 actionsc
当前位置 : IT 知识库 > 网络安全 > 编程技术 > 正文

Windows平台内核级文件访问

作者:Wxbsoft时间:08-06-07

1.背景 
    在windows平台下,应用程序通常使用API函数来进行文件访问,创建,打开,读写文件。从kernel32的CreateFile/ReadFile/WriteFile函数,到本地系统服务,再到FileSystem及其FilterDriver,经历了很多层次。在每个层次上,都存在着安全防护软件,病毒或者后门作监视或者过滤的机会。作为安全产品开发者,我们需要比别人走得更远,因此我们需要一个底层的“windows平台内核级文件访问”的方法来确保我们能够看到正确的干净的文件系统。

2.用途 
    直接的内核级别文件访问,在信息安全领域内有广泛的用途。用于入侵者的方面,可以让他绕过杀毒软件,IDS等安全保护系统的监视。用于检测者的方面,可以看到一个干净的系统,以此来查杀隐藏的后门或者rootkit。用于监控者的方面,则可以了解最新的绕过监控的技术,可以根据来设计更新的监控方案。

3.直接访问FSD的内核级别文件访问 
    FSD(FileSystemDriver)层是文件API函数经过本地系统服务层(native API)最后到达的驱动层次。如果我们可以模仿操作系统,在我们自己的驱动程序里直接向FSD发送IRP,就可以绕过那些native API 和win32 API了,也就可以绕过设置在这些层次上面的API钩子等监控措施。

3.1文件的Create和Open 
    文件的Create和Open可以通过发送IRP_MJ_CREATE给FSD,或者调用IoCreateFile函数来完成。Create和Open的区别实际上在于IoCreateFile/IRP_MJ_CREATE的一个参数Disposition的取值。使用IoCreateFile函数的样例代码:

HANDLE openfile(WCHAR* name,ACCESS_MASK access,ULONG share) 
{
    //return 0 for error.
    HANDLE hfile;
    IO_STATUS_BLOCK iosb;
    int stat;
    OBJECT_ATTRIBUTES oba;
    UNICODE_STRING nameus;
    ///
    if(KeGetCurrentIrql()>PASSIVE_LEVEL){return 0;}
    RtlInitUnicodeString(&nameus,name);
    InitializeObjectAttributes(&oba,&nameus,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,0,0);
    stat=IoCreateFile(&hfile,access,&oba,&iosb,0,FILE_ATTRIBUTE_NORMAL,share,FILE_OPEN,0,0,0,0,0,0);
    if(!NT_SUCCESS(stat)){return 0;}
    return hfile;
}

HANDLE createnewfile(WCHAR* name,ACCESS_MASK access,ULONG share) 
{
    //return 0 for error.
    HANDLE hfile;
    IO_STATUS_BLOCK iosb;
    int stat;
    OBJECT_ATTRIBUTES oba;
    UNICODE_STRING nameus;
    ///
    if(KeGetCurrentIrql()>PASSIVE_LEVEL){return 0;}
    RtlInitUnicodeString(&nameus,name);
    InitializeObjectAttributes(&oba,&nameus,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,0,0);
    stat=IoCreateFile(&hfile,access,&oba,&iosb,0,//AllocationSize this set to 0 that when file opened it was zeroed.
        FILE_ATTRIBUTE_NORMAL,share,FILE_OVERWRITE_IF,0,0,0,0,0,0);
    if(!NT_SUCCESS(stat)){return 0;}
    return hfile;
}

    通过发送IRP_MJ_CREATE给FSD的方法与此类似,可以参考IFSDDK document的IRP_MJ_CREATE说明。不同于上面方法的是需要自己创建一个FILE_OBJECT,好于上面方法的是这种方法不需要一个HANDLE,HANDLE是线程依赖的,FileObject则是线程无关。

最新文章
内核级HOOK的几种实现与应用
实现内核级HOOK对于拦截、分析、跟踪系统内核起着致关重要的作用。实现的方法不...
Windows平台内核级文件访问
1.背景 在windows平台下,应用程序通常使用API函数来进行文件访问,创建,打开,...
相关文章
Windows驱动编程基础教程(连载11)
Windows驱动编程基础教程(6.3) 6.3 使用事件通知 一些读者可能熟悉事件驱...
Windows驱动编程基础教程(连载10)
Windows驱动编程基础教程(6.1-6.2) 6.1 使用线程 有时候需要使用线程来完...