龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

揭开NTFS下流的奥秘

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
NTFS下,支持一个非凡概念,那就是'流'.怎么个流法呢?先看'流'的定义: stream A sequence of bits, bytes, or other small strUCturally uniform units. B99v的序列,或者小的统一结构单元.当然,小的统一结构单元

  NTFS下,支持一个非凡概念,那就是'流'.怎么个流法呢?先看'流'的定义:

  

stream

  

A sequence of bits, bytes, or other small strUCturally uniform units.

  

B99v的序列,或者小的统一结构单元.当然,小的统一结构单元并不意味着一定要大小统一,格式统一.

  

流依附于文件而存在,你可以在流中存储2进制数据,文字或者其他一些东西.就象文件一样.文件存什么,流就能存什么.每个文件可以含有多个流.但是流又和文件有些不同.每个流的打开需要单独的一个CreatFile(...)操作,并不是打开文件就打开了流.

  

流的名字和文件名以':'分隔.例如:ABC:A.

  

ABC就是文件名,而流的名字为A.当我们操作流时,可以用如下简单方法:

  

ECHO STREAM1>ABC:STREAM1

  

ECHO STREAM2>ABC:STREAM2

  

现在,ABC就有了:STREAM1和:STREAM2共2个流.

  

而读出流可以用:

  

MORE

  

MORE

  

这样,内容就被读出了.CreateFile("ABC:STREAM1",...);

  

假如用编程的方法.操作就和文件操作一样.

  

那么为什么要用流呢?流的好处就是隐蔽.WINNT没有任何一个工具用来发现流的存在.我们看

  

C:>ECHO "Hi Reader" > XX.TXT:MyStream

  

C:>DIR XX.TXT

  

Volume in drive C is Wizard

  

Volume Serial Number is 40E5-92D4

  

  

Directory of C:

  

03/18/98 08:36a 0 XX.TXT

  

1 File(s) 0 bytes

  

0 Dir(s) 3,399,192,576 bytes free

  

这就是好处.所以,在绿色兵团里有一篇文章专门介绍了流.说是一种隐藏很深的文件存取格式.

  

的确深,但是NT只不过没有提供工具而已.而我们仍然有探测到流的存在.那就是,Inside Programming为大家提供的Stream.Exe.该工具可以看到含有流的文件以及所有的流的名字.

  

当然,NT提供一个API,BackupRead(...)用于流名的读出.既然是Inside Programming,介绍这个API显然不能提供更多帮助,接下来介绍的是一个NATIVE API:NtQueryInformationFile(...)

  

下面给出该API涉及流的部分:

  

/*+++

  

Streaminfo.h

  

author: lulin

  

date: 2000.8.25

  

Abstract:

  

interface to NtQueryInformationFile

  

stream portion.

  

  

---*/

  

#ifndef __STREAMINFO_H__

  

#define __STREAMINFO_H__

  

#include

  

extern "C"{

  

typedef LONG NTSTATUS;

  

  

typedef struct {

  

union {

  

NTSTATUS Status;

  

PVOID Pointer;

  

};

  

  

ULONG *Information;

  

} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

  

  

typedef struct { //infoclass 22

  

  

ULONG NextEntryOffset;

  

ULONG StreamNameLength;

  

LARGE_INTEGER EndOfStream;

  

LARGE_INTEGER AlloCationSize;

  

WCHAR StreamName[1];

  

}FILE_STREAM_INFORMATION,*PFILE_STREAM_INFORMATION;

  

  

__declspec(dllimport) NTSTATUS __stdcall NtQueryInformationFile(

  

HANDLE handle,

  

PIO_STATUS_BLOCK io_status_block,

  

PVOID FileInFormation,

  

ULONG FileInformationLength,

  

int FileInfomationClass

  

);

  

}

  

  

#endif //__STREAMINFO_H__

  

NTFS真正存储流名时,名字里会加上:$DATA,例如:ABC:STREAM1在存储时,流名被存为了:STREAM1:$DATA,所以在查询结果中需要去除:$DATA.在这里,我不具体讨论STREAM.EXE如何运作,需要源程序的朋有同样可以购买.20元/份.付款信息件UTIL99vY页里的信息.

  

精彩图集

赞助商链接