好文转载之
貌似关于 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
貌似关于 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.
![](https://i-blog.csdnimg.cn/blog_migrate/2668242806ea15d868e942d68c888296.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/c6cd2abe26e2a4006aba12ad55696d37.jpeg)
2.[XP SP2] 在windbg中调试逆向得到XCB结构
![](https://i-blog.csdnimg.cn/blog_migrate/0d0382f25f247188eb421a123b7c5e47.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/ea7391c578c25326d971c4bf86700076.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/bfc58368e669b38df360ab667a5e104f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/285b034013bbb1de549766334af9094d.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/96feee81bfb66da880b2144b3dd01333.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/db8991ea298eb8b27ea0ae5721c30b89.jpeg)
4. 跟踪系统打开文件的流程(仅仅跟踪到文件系统层面,下方的卷设备/disk/atapi/PCHIINDEX 暂不讨论)
NtfsCommonCreate在经过复杂的操作到达NtfsOpenFile后,必定是要打开已经存在的文件.否则会调用 NtfsCreateNewFile创建新文件.可能没人引用过C:\WINDOWS\system32\mycomput.dll,那么系统的 FcbTable就没有该文件对应的FCB,这时就需要NtfsOpenFile函数去创建该文件对应的Fcb,建立LCB和父目录的SCB的联系,然后 加入到表中去:
![](https://i-blog.csdnimg.cn/blog_migrate/695375122b60996202a3df8b7e1a625d.jpeg)
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
![](http://forum.eviloctal.com/images/attachicons/rar.gif)