查看文章 |
[note]NTFS文件系统底层挖掘
2009年04月28日 星期二 23:29
貌似关于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
|
最近读者:









不清楚了~