[转载] 揭开NTFS下真正的隐藏文件--'流'的奥秘[二次转载]

[复制链接]
  • TA的每日心情
    奋斗
    2021-12-12 18:49
  • 签到天数: 1 天

    [LV.1]布衣百姓

    17

    主题

    183

    回帖

    1235

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1235
    发表于 2008-5-21 17:36:02 | 显示全部楼层 |阅读模式
    揭开NTFS下真正的隐藏文件--'流'的奥秘


    --------------------------------------------------------------------------------

      发表时间:2004-8-10
    作者:未知[获得此文档时候没有作者记录,深感抱歉,本文档全为转载]   


    揭开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的序列,或者小的统一结构单元.当然,小的统一结构单元并不意味着一定要大小统一,格式统一.
    流依附于文件而存在,你可以在流中[wiki]存储[/wiki]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页里的信息.



    注意:本文非原创,为二次转载,原网址已丢失,又是经本人再次转载,所以请读者不要对其中有关源代码购买20元/份的事来咨询我,因为我不是原作者,我也没有那些源程序.

    该用户从未签到

    0

    主题

    271

    回帖

    661

    积分

    [INTOHARD]连长

    Rank: 4

    积分
    661
    发表于 2008-8-7 02:06:52 | 显示全部楼层
    thanks..................
    转自中国[wiki]硬盘[/wiki]基地技术社区 http://bbs.intohard.com ,原文地址:http://bbs.intohard.com/viewthread.php?tid=41444

    该用户从未签到

    0

    主题

    19

    回帖

    39

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    39
    发表于 2009-6-27 14:06:42 | 显示全部楼层
    值得研究!!!!!!!!!!!!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表