百度空间 | 百度首页 
 
查看文章
 
[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
HijackFile.rar (8.51 KB) 保护文件的驱动

类别:Note | 浏览() | 评论 (18)
 
最近读者:
 
网友评论:
1
2009年05月02日 星期六 23:53 | 回复
百度BLOG限制字数,只能截图了. 也可参见这里:
http://www.debugman.com/read.php?tid=3014&toread=1
 
2
2009年05月03日 星期日 14:50 | 回复
沙发?收藏研究
 
9
2009年05月05日 星期二 09:00 | 回复
你那个图用什么工具画出来的?
 
10
2009年05月05日 星期二 09:24 | 回复
回复匿名网友:
notepad.exe + HyperSnap.exe
 
11
2009年05月05日 星期二 13:30 | 回复
不错...
 
12
2009年05月06日 星期三 13:04 | 回复
强大的sudami,强大的mj,膜拜~~~mj的xcb大法是不是就是操作这些control block?~~另外,以前看过资料说,mft号是xp之后的ntfs才有的吧~~怎么nt4src里面也是用mft号~?
 
15
2009年05月06日 星期三 16:20 | 回复
回复BuZzTiGer:
1.仔细看文中提到的CleanUpCounts,然后再跟踪ZwClose,你就明白了.呵呵
2.NTFS系统微软好早就有了吧,那么nt4src里面当然就ntfs的资料. MFT号只是NTFS的一个极其普通的概念,不晓得你有什么不明白的....
 
16
2009年05月06日 星期三 16:21 | 回复
这个...我没说清楚吧~~ntfs是很早就有了,但是ntfs也有版本号啊,不同操作系统的ntfs文件系统还是有点小差异的,额,我只做过在xp下的ntfs文件系统的解析,当然mtf号(mtf头偏移0x2c)还是知道的,我的意思是 有的资料上(《磁盘数据安全技术与编程实例》)说mft号只在xp下使用,那就是说nt4系统下的ntfs中没有吧?~
 
17
2009年05月06日 星期三 16:37 | 回复
不清楚了~
 
18
2009年05月10日 星期日 19:36 | 回复
http://hi.baidu.com/buzztiger/blog/item/86ab378ed838a2f2503d92e3.html
如有错误请大米指教~~
 
19
2009年05月10日 星期日 19:40 | 回复
很佩服大米跟系统的功底~~~大米可以多跟跟其他系统版本的偏移,先来个系统版本判断,再赋予不同的偏移,通用性会好点~~
 
20
2009年05月10日 星期日 21:05 | 回复
哈哈,好久不看那份code,都忘记差不多了.
嗯,从你逆向的思路来看,差不多是那样的,不过某些地方不是很准确~~~

很强大啊,我写的那么烂,不值得你去逆向啊~~~
 
21
2009年05月10日 星期日 22:34 | 回复
呵呵~~大米能不能透漏点关于XCB来删除hardLink占坑文件的思路哈~~我没跟过,不晓得除了FCB的LCBQueue会变还有什么域会变噢~~再次膜拜下~~LCB的结构跟nt4源码差很大,能跟出来不容易啊~~~
 
23
2009年05月10日 星期日 22:47 | 回复
XCB大法是MJ同学首创的,你问他去吧. 我路过的~~~
 
24
2009年07月16日 星期四 14:54 | 回复
最后的那个动画是用什么做的?
挺不错,演示起来形象多了
 
32
2009年07月16日 星期四 15:34 | 回复
回复匿名网友:
这个问题回答无数次了.是一个叫"迷你GIF动画录制"的工具.下载链接:

http://forum.eviloctal.com/viewthread.php?tid=38104&extra=page%3D1&frombbs=1
 
33
2009年07月17日 星期五 06:52 | 回复
大米前辈 偶是逆向新手 请问怎样用IDA 找出被inline hook的函数 和hook 后的函数
 
34
2009年07月17日 星期五 14:31 | 回复
回复温柔一刀:
用windbg或者ARK工具看,和IDA没关系...
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu