Nootropic.me

NTFSについて調べてみた(未完成)

注)本記事は2013/8/25現在未完成です。内容も調査不足のものが含まれている事をご了承下さい。

今回はNTFSについて管理人が勉強してみたかったので調べてみました。

1.NTFSについて
NTFSは現在のWindowsで使われているファイルシステムです。
Windowsでは、ファイルの保存や削除をする際のデータの管理方法が決められており、それをファイルシステムと言います。
NTFSは1993年7月発売のWindows NT 3.1より使われ始めました。

NTFSには以下の特徴があります。
大容量
FAT16では2GB(WindowsNT/2000/XPでは4GB)分までしかドライブを作成できないのに対してNTFSは2TBまでドライブを作成できます。
これはFAT32の最大ドライブ容量と同じですがNTFSではFAT32と違いファイル容量に制限がありません。
最大ファイル名
FAT16では11文字(ファイル名8バイト+拡張子3バイト)までしか使用できないのに対し、NTFSでは255文字まで使用可能です。
ちなみにFAT32も255文字まで使用可能です。
セキュリティ
ACLによってファイルやディレクトリごとにアクセス権を設定できます。またファイルアクセスの監視も可能です。
暗号化のサポートもしていますが証明書を失うと永久にファイルにアクセス出来なくなります。
アクセス速度
NTFSはファイル管理にB+木を使用しており高速なファイルアクセスを実現しています。

2.NTFS Volume
NTFSのフォーマットは以下のようになっています。
Partion Boot Sector Master File Table System Files Master File Table Copy
ここでこれらの領域の中身がどうなっているか詳しく見ていくことにしましょう。(内容はOSによって異なる場合があります。)

Partion Boot Sector
フィールド名 フィールドサイズ(byte) オフセット
Jump Instruction 3 0x00
OEM ID 8 0x03
BPB 25 0x0B
EBPB 48 0x24
Bootstrap Code 426 0x54
End of Sector Marker 2 0x1FE
「Jump Instruction」にはジャンプ命令が格納されます。ジャンプ先には「Bootstrap Code」が指定されます。
「Bootstrap Code」は先頭から0x54バイト目に存在するので「Jump Instruction」には「EB 52 90」が格納されます。
「EB 52」はjmp 0x54、「90」はNOPを意味します。jmpはその名の通りジャンプ命令で、NOPは実質何もしない(XCHG EAX,EAX)命令です。
「OEM ID」にはNTFSという文字列が格納されます。
その次にある「BPB」は「BIOS Parameter Block」の略で、1セクタのバイト数や1クラスタのセクタ数など、ディスクの物理的な属性が格納されています。

BPB(BIOS Parameter Block)
フィールド名 フィールドサイズ(byte) オフセット
Byte per sector 2 0x0B
Sector per cluster 1 0x0D
Reserved sectors 2 0x0E
Reserved 3 0x10
not used by NTFS 2 0x13
Media Descriptor 1 0x15
not used by NTFS 2 0x16
Sector per track 2 0x18
Number of heads 2 0x1A
Hidden sector 4 0x1C
not used by NTFS 4 0x20

「BPB」の下には「EBPB」が存在します。これは「Extend BIOS Parameter Block」の略でMFT(後述)についての情報やチェックサムなどが格納されています。
EBPB(Extend BIOS Parameter Block)
フィールド名 フィールドサイズ(byte) オフセット
not used by NTFS 4 0x24
Total number of sectors 8 0x28
MFT logical cluster num 8 0x30
MFT mirror logical cluster num 8 0x38
Cluster per MFT record 4 0x40
Cluster per Index record 4 0x44
Volume serial number 8 0x48
Checksum 8 0x50

その次にある「Bootstrap Code」はNTLDRファイルを探し、メモリにロードします。
最後の「End of Sector Marker」はその名の通り「Partion Boot Sector」の終わりを示し、「55 AA」の値が入ります。
「BPB」と「EBPB」のフィールドのデータは、起動時にMFTを見つけるためにNTLDRを有効にします。
NTLDRはコンピュータの起動直後にOSをディスクから読み込んで起動するプログラムの事でブートローダなんて呼ばれています。

Master File Table
MFT(Master File Table)は、NTFSに格納されているファイルの場所を示す住所録のようなものです。
MFTには、1KBの容量が割り当てられます。
MFTは以下のようになっています。
フィールド名 フィールドサイズ(byte) オフセット
Signature 4 0x00
Offset to fixup array 2 0x04
Number of entries in fixup array 2 0x06
$LogFile Sequence number 8 0x08
Sequence number 2 0x10
Link count 2 0x12
Offset to first attribute 2 0x14
Flags 2 0x16
Used size of MFT entry 4 0x18
Allocated size of MFT entry 4 0x1C
File reference to base record 8 0x20
Next attribute ID 2 0x28
Align to 4B bounary 2 0x2A
MFT Record Number 4 0x2C
Attributes and fixup value 976 0x30
「Signature」には「FILE」か「BAAD」のいずれかの文字が入ります。
「Offset to first Attribute」には最初のAttributeの位置が入ります。
またこの位置に入る値によって属性が決まります。
入る値と属性の対応表は以下になります。
Type Name
0x10 $STANDARD_INFORMATION
0x20 $ATTRIBUTE_LIST
0x30 $FILE_NAME
0x40(NT) $VOLUME_VERSION
0x40(2K) $OBJECT_ID
0x50 $SECURITY_DESCRIPTOR
0x60 $VOLUME_NAME
0x70 $VOLUME_INFORMATION
0x80 $DATA
0x90 $INDEX_ROOT
0xA0 $INDEX_ALLOCATION
0xB0 $BITMAP
0xC0(NT) $SYMBOLIC_LINK
0xC0(2K) $REPARSE_POINT
0xD0 $EA_INFORMATION
0xE0 $EA
0xF0(NT) $PROPERTY_SET
0xF0(2K) $LOGGED_UTILITY_STREAM
この事を覚えておけばバイナリエディタ等でNTFSのファイルを開いた時すぐにどの属性か判別出来るわけですね。
「Flags」は4種類ありそれぞれ
0x00 ファイル削除
0x01 ファイル割り当て
0x02 ディレクトリ削除
0x03 ディレクトリ割り当て
という意味です。 ファイルを削除した際には0x00のフラグが立てられるのですがこれを0x01に書き換えることでファイルを復元出来ます。(要出典)

STANDARD_INFORMATION FILE_NAME SECURITY_DESCRIPTOR DATA

Author:ラロ