揭开NTFS下真正的隐藏文件--'流'的奥秘

本文介绍了NTFS下的特殊概念'流',它依附于文件,可存储多种数据,每个文件可有多个流,操作与文件类似但需单独打开。流具有隐蔽性,WINNT无工具发现其存在。还介绍了探测流的工具Stream.Exe及相关API,如NtQueryInformationFile。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

揭开NTFS下真正的隐藏文件--'流'的奥秘

[ 作者: 陆麟   添加时间: 2001-9-4 14:21:15 ]


作者:陆麟
来源:http://lu0.126.com

NTFS下,支持一个特殊概念,那就是'流'.怎么个流法呢?先看'流'的定义:
stream
A sequence of bits, bytes, or other small structurally uniform units.
BIT的序列,或者小的统一结构单元.当然,小的统一结构单元并不意味着一定要大小统一,格式统一.
流依附于文件而存在,你可以在流中存储2进制数据,文字或者其他一些东西.就象文件一样.文件存什么,流就能存什么.每个文件可以含有多个流.但是流又和文件有些不同.每个流的打开需要单独的一个CreatFile(...)操作,并不是打开文件就打开了流.
流的名字和文件名以':'分隔.例如:ABC:A.
ABC就是文件名,而流的名字为A.当我们操作流时,可以用如下简单方法:
ECHO STREAM1>ABC:STREAM1
ECHO STREAM2>ABC:STREAM2
现在,ABC就有了:STREAM1和:STREAM2共2个流.
而读出流可以用:
MORE <ABC:STREAM1
MORE <ABC:STREAM2
这样,内容就被读出了.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 <windef.h>
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元/份.付款信息件UTILITY页里的信息.
摘要:NTFS是Microsoft公司开发的一种有着良好安全性和稳定性的高性能文件系统,NTFS文件文件夹中附加多个额外的数据流,但是其访问一直没有很好的解决办法,本文使用VB2003实现NTFS文件附加数据流的读写类,提供.Net框架下NTFS文件附加数据流的完整解决方案。 关键词:VB.Net NTFS 数据流 类 在项目中选择添加引用->浏览->选择“JWBStreamOP.dll”文件->确定,即可成功引用。 4.1 类的声明: Dim myStreamOP As New ClassJWBStreamOP(“NTFS文件完整路径”) 4.2 属性: 该类共有3个只读属性 属性名 返回值类型 备注 FileName String 只读,在成功声明后使用 Ready Boolean 只读,该类可操作时为True Ver String 只读,类版本、版权信息 4.3 方法 该类共有6个方法: 4.3.1 OpenNTFSStream(ByVal sStreamName As String) As System.IO.FileStream 打开指定文件(声明时指定)的指定数据流,返回值为指定数据流的FileStream接口。 参数列表 类型 传递方式 参数说明 sStreamName String Byval 文件名 4.3.2 GetNTFSStreamSize(ByVal sStreamName As String) As Long 获取指定数据流的大小,返回实际大小,执行失败返回-1 参数列表 类型 传递方式 参数说明 sStreamName String Byval 文件名 4.3.3 AddNTFSStream(ByVal toHidName As String, ByRef percentDone As Double) As Boolean 添加附加数据流,返回执行结果。 参数列表 类型 传递方式 参数说明 toHidName String ByVal 待添加的文件路径 percentDone Double ByRef 传递一个完成百分比的参数 4.3.4 SaveNTFSStream(ByVal sStreamName As String, ByVal outFileName As String, ByRef percentDone As Double) As Boolean将指定的数据流保存为文件,返回执行结果。 参数列表 类型 传递方式 参数说明 sStreamName String ByVal 文件名 outFileName String ByVal 保存文件路径 percentDone Double ByRef 传递一个完成百分比的参数 4.3.5 ReadNTFSStreamsName() As String() 获取文件的所有附加数据流名称,返回名称数组。 4.3.6 DeleteNTFSStream(ByVal sStreamName As String) As Boolean 删除指定数据流,返回执行结果。 参数列表 类型 传递方式 参数说明 sStreamName String Byval 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值