情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

初めてのNTFS代替データストリームとstreamsの出力について

Windows (248) Windows 7 (56) Windows Vista (6)

NTFSの代替データストリームを表示してくれるWindows Sysinternalsのツールstreams.exeが表示する数字がなんなのか気になって分かったのでメモ。ただ、改めて見てみれば明らかだったので、おまけに代替データストリームの表示方法とか、どんな目的で使われているかを書いておきます

代替データストリームとは

代替データストリーム(Alternate Data Streams)」は、Windowsで用いられるファイルシステムNTFSで使える、ファイルやフォルダに追加できる特別なメタデータのことを指します。代替データストリームには「名前」と「中身」があって、「ファイル名+コロン(:)+代替データストリーム名」でその「中身」にアクセスすることができます。普段は目に付かないものなのですが、今回紹介する方法で見たり書いたりすることができます。

このようなファイルシステムに実装されたメタデータの仕組みを一般的に「フォーク」と呼び、Macでは「リソースフォーク」と呼ばれるようです。

代替データストリームって何に使われているの?

何に使われているの?といえば、一番身近なのが「このファイルを実行しますか?」や、Word/Excelの「このファイルは、インターネット上の場所から取得されており、安全でない可能性があります。クリックすると詳細が表示されます。[編集を有効にする]」などのメッセージの表示です。

どうしてインターネットからダウンロードしたってわかるのさ??」と思ったことのある人も多いのではないかと思いますが、実はその「どこからそのファイルを入手したのか情報」はそのファイルの「代替データストリーム」として保存されているわけです。この後出てくる「Zone.Identifier」という代替データストリームがまさにその情報を保持しています。

Streams.exeでファイルの代替データストリームの一覧を見る

streams.exeをダウンロードしてきて、インターネットからダウンロードしてきたファイルに対して「streams.exe filename.pdf」のように使用すると、次のような出力を見ることができます。streams.exeは、対象にしたファイルが含む代替データストリームの一覧を表示してくれます(※最後のほうで、DIRコマンドで表示する方法も紹介しています)。

Streams v1.56 - Enumerate alternate NTFS data streams Copyright (C) 1999-2007 Mark Russinovich Sysinternals - www.sysinternals.com C:\Users\username\Downloads\filename.pdf: :Zone.Identifier:$DATA 26

「Zone.Identifier:$DATA」が代替データストリーム(Alternate Data Stream)の名前となっています。この横に26という数字が表示されますが、これは中身ではありません。じゃぁ何なのか、というのが本題なのですが、まず中身を見てみます。

代替データストリームの中身を表示する

代替データストリームの中身を表示するために一端ファイルにリダイレクトするだとか、「:」を使ってファイル名を指定してエディタで開くだとかそういう方法もありますが、moreを使うのが簡単です。

「>more < filename.txt:Zone.Identifier:$DATA」というコマンドを実行して上げると、filename.txtのZone.Identifier:$DATAという代替データストリームの中身がコマンドプロンプトに出力されます。定番の中身が次のものです。

[ZoneTransfer]
ZoneId=3

このZoneIdの番号(ここでは「3」)が意味としては重要で、この番号で、このファイルをどこから入手したのかが表されています

このZoneIdには、次のように定義されたSecurityZone列挙体が利用されており、今回の「3」は「Internet」を表していて、「Internetからダウンロードしてきたファイル」という意味を持ちます。

public enum SecurityZone
{
        NoZone = -1,
        MyComputer = 0,
        Intranet = 1,
        Trusted = 2,
        Internet = 3,
        Untrusted = 4,
} 引用元

この情報をもとに、「このファイルを実行しますか?」なんて聞いてくるわけです。ちなみに、それをユーザに尋ねる機能のことは「Attachment Execution Service」と呼ばれ、その代替データストリームはInternet Explorer(などのブラウザ)が書き加えています。

数字「26」の意味

Streams.exeの出力の意味についてちゃんとした文章は見当たらなかったのですが(一目瞭然だから?)、この26は、「代替データストリームのデータサイズ(バイト)」のようです。この26も、「[ZoneTransfer]ZoneId=3」の22バイトに改行コード分(2バイトx2)を加えて26バイト、という意味だと思われます。よくよく考えれば、表示順は違うものの、機能としてはDIRコマンドと似ているので、サイズ(byte)というのはしっくり来ます。

代替データストリームの削除方法

削除するには、streams.exeの「-d」オプションを使って「streams.exe -d filename.txt」のようにすると、そのファイルの代替データストリームが全消去されます。

代替データストリームの追加方法

同じくコマンドラインから追加するには、「echo test>filename.txt:teststream」のようにすればOKです。これで追加されます。この場合、testの4byteと改行による2byteで合計6byteになっていることが確認できます。ちなみに、「>」の直前にスペースが入れば、その分の空白も含まれて7byteになります。

ただし、エクスプローラのようなWindowsの標準的なソフトからは、代替データストリームのサイズが認識されないため、どれだけ大きなデータを代替データストリームに書き込んだとしても、表示されるファイルサイズは大きくなりません。

今更気が付いたこと

Windows Vistaから、DIRコマンドでも代替データストリームを一覧表示できるオプション(/R)が追加されたようです。例えば、Streamsフォルダで「DIR /R」と実行すると、

<DIR> .
<DIR> ..
7,005 Eula.txt
26 Eula.txt:Zone.Identifier:$DATA
87,424 streams.exe
26 streams.exe:Zone.Identifier:$DATA

のように、普段の出力に代替データストリームの情報が追加されます(日付と日時のカラム省略)。

ひとこと

「はじめての」なんて書いたけど使わないませんよね、はい。ただ、「インターネットから取得したファイルだ」という情報が「代替データストリーム」で管理されている、というのはいい豆知識だと思います。

代替データストリームを検索しようとか、一括操作しようとか思ったら、もっとリッチなツールがいろいろあるので探してみてください。

参考

コメント(0)

新しいコメントを投稿