NTFS文件系统底层挖掘

好文转载之

貌似关于 NTFS文件系统的底层实现细节,网上资料很少. 这几天突然来了兴趣,于是挖掘了一下.
结合nt4src,IDA+ntfs.sys,windbg+VMWare,在XP SP2下,深入理解了一些NTFS文件系统相关知识.比如逆向搞到了 VCB/FCB/LCB/SCB/BCB等结构体,文件打开/枚举/删除操作的流程, 缓存管理器/虚拟内存/IO管理器之间的交互.

KeyWord: VACB, XCB, NTFS, Cache

1.下面是我调试过程中总结的一张XCB之间的关系图 :

NTFS.sys在初始化时,填充分发例程:
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = (PDRIVER_DISPATCH)NtfsFsdFileSystemControl;
IoCreateDevice将创建的设备对象和全局变量NtfsData关联起来,在设备扩展中包含卷控制块(VCB).

(1) IopMountVolume中会挂接相应的卷,填充IRP,发给NTFS.sys:
irpSp->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL;
irpSp->MinorFunction = IRP_MN_MOUNT_VOLUME;

(2) NtfsFsdFileSystemControl --> NtfsCommonFileSystemControl --> NtfsMountVolume
主要在初始化该卷的VCB结构,通过NtfsOpenRootDirectory,创建了根目录的FCB,LCB,SCB.

2.[XP SP2] 在windbg中调试逆向得到XCB结构


4. 跟踪系统打开文件的流程(仅仅跟踪到文件系统层面,下方的卷设备/disk/atapi/PCHIINDEX 暂不讨论)

NtfsCommonCreate在经过复杂的操作到达NtfsOpenFile后,必定是要打开已经存在的文件.否则会调用 NtfsCreateNewFile创建新文件.可能没人引用过C:\WINDOWS\system32\mycomput.dll,那么系统的 FcbTable就没有该文件对应的FCB,这时就需要NtfsOpenFile函数去创建该文件对应的Fcb,建立LCB和父目录的SCB的联系,然后 加入到表中去:


5.嗯,原理了解了,来实践一下简单的NTFS文件系统底层文件劫持吧.
[xp sp2 下函数的执行流程如下]
NtfsCommonCreate-->NtfsCreateNewFile-->NtfsCreateFcb-->ExAllocatePoolWithTag  
NtfsCommonCreate-->NtfsOpenFile-->NtfsCreateFcb-->ExAllocatePoolWithTag  
[ 未导出]          [未导出]        [未导出]            [已导出]
系统会频繁查表,添加移除FCB.可瞬间挂勾此函数,栈回溯得到NtfsCreateFcb/ NtfsOpenFile /
NtfsCheckValidAttributeAccess 等函数的地址.卸掉钩子
Ntfs!NtfsCreateFcb:
f974da0f e87eb5fdff       call     Ntfs!NtfsAllocateEresource (f9728f92)
f974da14 894648           mov      dword ptr [ esi+48h], eax
f974da17 8945d8           mov      dword ptr [ ebp-28h], eax
f974da1a 684e744673       push     7346744Eh             // 重要标记"ntfs"
f974da1f 6a20             push     20h                   // 进行特征匹配
f974da21 6a10             push     10h
f974da23 ff1514ae73f9     call     dword ptr [Ntfs!_imp__ExAllocatePoolWithTag (f973ae14)]
// ExAllocatePoolWithTag((POOL_TYPE)16, 0x20u, 'sFtN');

我挂钩下面这个函数,保护c:\sudami.txt不被打开/写入/删除. 金山&360文件粉碎机/XueTr/IceSword均无法删除.

VOID fake_NtfsCheckValidAttributeAccess()
/*++
Author: sudami [sudami@163.com]
Time   : 2009/04/30 [30:4:2009 - 12:45]
Routine Description:
   [xp sp2]
   有种情况会调用NtfsCheckValidAttributeAccess 函数
     NtfsOpenFcbById    // 这种情况太少了...
     NtfsCommonCreate --> NtfsOpenExistingPrefixFcb // 若文件被打开过一次,就不走下面的函数,经过这里
     NtfsCommonCreate --> NtfsOpenFile       // 第一次打开这个文件
     NtfsCommonCreate --> NtfsCreateNewFile      // 创建新文件
--*/


仅一点儿调试心得,不对的地方敬请指正.
-----------------------------------------------------------------------
参考资料:
(1) 挂接缓存管理器CcMapData()实现文件XX
(2) NTFSI--the NT Cache Manager
(3) 基于IopXX的重定向文件 )
   (4)windbg, nt4src
HijackFile.rar (8.51 KB) 保护文件的驱动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解析NTFS底层结构 一、NTFS系统结构 NTFSWindows NT引入的新型文件系统,如果您是一位熟悉FAT磁盘格式的专业人士,您可能会觉得NTFS系统的思想蹩脚而晦涩,如果您对FAT格式一无所知,那么恭喜您,您会更快的了解这种更有效率的磁盘格式。 NTFS的结构复杂,内容繁多,笔者仅对NTFS卷上的底层结构做分析,并提供卷上数据删除的特征状态供大家参考。 现在,我们首先来建立了解NTFS需要的基本概念。 1.0基本结构及基本概念 在NTFS中,文件以簇的形式分配。最小的单位为扇区,N个扇区为一簇。其中,N的值可以通过BPB(引导扇区)读出(以下会详细介绍)。 1.0.1卷与簇 卷大小(分区大小) 每簇的扇区 缺省的簇大小 小于等于512MB 1 512字节 513MB~1024MB(1GB) 2 1024字节(1KB) 1025MB~2048MB(2GB) 4 2048字节(2KB) 大于等于2049MB 8 4KB 表1 卷与簇的关系 从上面可以看出,也就是说不管驱动器多大NTFS簇的大小不会超过4KB。 1.0.2 NTFS的基本数据结构 NTFS的数据大体上可分为4个部分 (1) Partition boot sector(引导扇区,又称BPB),此部分为所有磁盘格式都共有,占用一个扇区,但是具体的内容当然各不相同(见表3)。 (2) Master File Table(主文件列表,MFT),它是对卷上所有文件的记录,每一个文件对应一个记录项,理论上占用该卷12%的空间。 (3) System files(系统文件),NTFS系统一共有16个系统文件,和8个保留文件。 (4) File area(数据区),留给用户的空间。 Partition boot sector 引导扇区 Master File Table 主文件列表 System files 系统文件 File area 用户文件区(数据区) 表2 NTFS的磁盘分配情况

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值