New Technology File System Twitter : @pr0neer Blog : f Email : proneer@gmail.com Kim Jinkook
Outline 1. NTFS Introduction Internals Features Example
NTFS Introduction Security is a people problem
NTFS Introduction NTFS Version 기존 FAT (File Allocation Table) 파일시스템은개인용운영체제 ( 윈도우 3.1/95/98) 를위해사용 윈도우 NT (New Technology) 의등장으로서버용운영체제에서사용하기위한새로운기능을추가한파일시스템필요 윈도우 NT 이후 ~ 윈도우 7 까지사용 버전 운영체제 1.0 Windows NT 3.1 1.1 Windows NT 3.5 1.2 Windows NT 3.51 3.0 Windows 2000 3.1 5.1 Windows XP 5.2 Windows Server 2003 6.0 Windows Vista, Windows Server 2008, Windows 7
NTFS Introduction NTFS Cluster Size 클러스터크기가 4 KB 가넘을경우파일압축을지원하지못함 볼륨크기 Windows NT 3.51 Windows NT 4.0 Windows 2000, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 7MB 512 MB 512 bytes 4 KB 4 KB 512 MB 1 GB 1 KB 4 KB 4 KB 1 GB 2 GB 2 KB 4 KB 4 KB 2 GB 2 TB 4 KB 4 KB 4 KB 2 TB 16 TB Not Supported* Not Supported* 4 KB 16 TB 32 TB Not Supported* Not Supported* 8 KB 32 TB 64 TB Not Supported* Not Supported* 16 KB 64 TB 128 TB Not Supported* Not Supported* 32 KB 128 TB 256 TB Not Supported* Not Supported* 64 KB > 256 TB Not Supported Not Supported Not Supported * MBR 의제한으로지원하지못하는것을의미한다. http://support.microsoft.com/kb/140365
NTFS Introduction NTFS Size Limit 제한항목 설명 최대파일크기 구조상최대값 실제구현된최대값 16 exabytes 1KB (2 64 bytes 1KB) 16 terabytes 64 KB (2 44 bytes 64 KB) 최대볼륨크기 구조상최대값 2 64 clusters 1 실제구현된최대값 256 terabytes 64 KB (2 32 clusters 1) 볼륨당파일수 4,294,967,295 (2 32 1) http://technet.microsoft.com/en us/library/cc781134%28ws.10%29.aspx
NTFS Introduction Features 특징 USN 저널 ADS (Alternate Data Stream) 파일의변경내용을기록한후시스템오류발생으로재부팅될경우완료되지않은처리작업을롤백 (Rollback) 다중데이터스트림지원 설명 Sparse 파일 파일데이터가대부분 0 일경우실제데이터기록없이정보만기록 파일압축 LZ77 의변형된알고리즘을사용하여파일데이터압축지원 VSS (Volume Shadow Copy) Service EFS (Encrypting File System) 윈도우 2003 부터지원된기능으로새롭게덮어써진파일및디렉터리의백업본을유지하여복구지원 FEK (File Encryption Key) 를이용한대칭키방식의파일데이터암호화지원 Quotas 사용자별디스크사용량제한 유니코드지원다국어지원 ( 파일, 디렉터리, 볼륨이름모두유니코드사용 ) 동적배드클러스터할당 배드섹터가발생한클러스터를자동으로재할당 대용량지원 2TB 가넘는대용량볼륨지원
Security is a people problem
NTFS Architecture POST Ntldr.dll(XP)/Bootmgr(Vista,7) : CPU 를보호모드로전환, 시작옵션및초기메뉴설정 (C:\/C:\Windows\Boot\) Master Boot Record Boot Sector in VBR NTFS.sys : 시스템파일드라이버 (C:\Windows\System32\drivers\) Ntldr/Bootmgr NTFS.sys Ntoskrnl.exe Ntoskrnl.exe : 시스템장치드라이버로드정보획득 (C:\Windows\System32\) Operating System Kernel Mode Application User Mode
Layout $Boot, $AttrDef, $MFT $MFTMirr, $LogFile, $Root $Bitmap, $Upcase, $Secure ~ NTFS 3.0 $Boot $LogFile, $AttrDef $MFT, $Secure $MFTMirr, $Root $Bitmap, $Secure NTFS 3.1 ~
Structure Volume Boot Record Master File Table Data Area 모든데이터는파일형태로관리 ( 관리데이터, 디렉터리등 ) VBR (Volume Boot Record) 은고정된위치 MFT 는일반적으로 VBR 이후에존재하지만데이터영역어느곳에와도무관
VBR (Volume Boot Record) Volume Boot Record Master File Table Data Area NTFS 로포맷된파티션의가장앞부분에위치하는영역 부트섹터, NTLDR 위치정보, 추가적인부트코드저장 VBR 의크기는클러스터크기와동일 클러스터크기 VBR 크기 ( 섹터 ) 512 bytes 1 1 KB 2 2 KB 4 4 KB 8
VBR (Volume Boot Record) Volume Boot Record Master File Table Data Area Boot Sector NTLDR Information & Boot Strap Cluster Size 0 번섹터 : 부트섹터 나머지섹터 : NTLDR 위치및추가적인부트코드정보
VBR (Volume Boot Record) Volume Boot Record Master File Table Data Area Boot Sector NTLDR Information & Boot Strap Cluster Size MBR + MBR Slack (Reserved Area) VBR 클러스터크기가 4 K 인경우
VBR (Volume Boot Record) Volume Boot Record Master File Table Data Area Jump Instruction OEM ID BPB Boot Sector NTLDR Information & Boot Strap Cluster Size 범위 (10 진수 ) 길이설명 0 2 3 bytes Jump Instruction 3 10 8 bytes OEM ID 11 35 25 bytes BPB 36 83 48 bytes Extended BPB 84 509 426 bytes Bootstrap code 510 511 2 bytes End of sector marker (Signature)
VBR (Volume Boot Record) Jump Instruction OEM ID BIOS Parameter Block Bootstrap code End of sector marker (Signature)
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused Jump Boot Code : 부트코드로점프하기위한명령어 (0xEB5290) EB58 : jmp 00000054 90 : nop
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused OEM ID : 제조사식별값 NTFS : NTFS
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused Bytes Per Sector : 섹터당바이트수 Sectors Per Cluster : 클러스터당섹터수 Bytes Per Sector X Sectors Per Cluster = 클러스터크기 Reserved Sectors : NTFS 는항상파티션맨앞에부트섹터가존재하므로 0x00
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused Media Descriptor 0xF8 : 고정식디스크 나머지값은플로피디스크구분 ( 현재플로피사용 X)
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused Total Sectors : 해당볼륨이가지는총섹터수 Start Cluster for $MFT : $MFT 의 LBA 주소 Start Cluster for $MFTMirr : $MFTMirr 의 LBA 주소
VBR (Volume Boot Record) BIOS Parameter Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Jump Boot Code OEM ID Bytes Per Sector Sec Per clus Reserved Sectors 0x10 Unused Media Unused 0x20 Unused Total Sectors 0x30 Start Cluster for $MFT Start Cluster for $MFTMirr 0x40 Clus per Entry Unused Clus Per Index Unused Volume Serial Number 0x50 Unused Clusters Per MFT Entry(Record) : MFT Entry 크기 Clusters Per Index Buffer : 디렉터리공간을할당하기위해사용되는인덱스버퍼의크기 Volume Serial Number : 볼륨시리얼번호
VBR (Volume Boot Record) Volume Boot Record Master File Table Data Area Boot Sector NTLDR Information & Boot Strap Cluster Size NTFS 부트로더의위치정보 윈도우 NT, 2000, XP : NTLDR (NT Loader) C:\ 윈도우 Vista, 7 : BOOTMGR (Boot Manager) C:\Windows\Boot\
MFT (Master File Table) Volume Boot Record Master File Table Data Area Volume Boot Record Master File Table Data Area Master File Table Data Area NTFS 는파일, 디렉터리, 메타정보를모두파일형태로관리 각파일의위치, 속성, 시간정보, 이름, 크기등의메타정보는 MFT Entry 라는특별한구조로저장 MFT(Master File Table) 는 NTFS 상에존재하는모든파일의 MFT Entry 의모음 MFT 영역은파일시스템상의파일수에따라동적으로할당 일반적으로볼륨의 12.5% 정도가 MFT 영역으로할당 MFT Entry 0 ~ 15 번은파일시스템생성시함께생성되는예약된 ( 특별한용도 ) 영역
MFT (Master File Table) VBR Entry 번호 Entry 이름 설명 MFT Entry 0 0 $MFT NTFS 상의모든파일들의 MFT Entry 정보 MFT Entry 1 1 $MFTMirr $MFT 파일의일부백업본 MFT Entry 2 2 $LogFile 메타데이터의트랜잭션저널정보 : 메타데이터파일 3 $Volume 볼륨의레이블, 식별자, 버전등의정보 : 4 $AttrDef 속성의식별자, 이름, 크기등의정보 5. 볼륨의루트디렉터리 MFT Entry 15 6 $Bitmap 볼륨의클러스터할당정보 MFT Entry 16 7 $Boot 볼륨이부팅가능할경우부트섹터정보 : 8 $BadClus 배드섹터를가지는클러스터정보 : 9 $Secure 파일의보안, 접근제어와관련된정보 10 $Upcase 모든유니코드문자의대문자 11 $Extend $ObjID, $Quota, $Reparse points, $UsnJrnl 등의추가적인파일의정보를기록하기위해사용 Dt Data Area 12 15 미래를위해예약 16 포맷후생성되는파일의정보를위해사용 $ObjId 파일고유의 ID 정보 ( Windows 2000 - ) $Quota 사용량정보 ( Windows 2000 - ) $Reparse Reparse Point 에대한정보 ( Windows 2000 - ) $UsnJrnl 파일, 디렉터리의변경정보 ( Windows 2000 - )
MFT (Master File Table) VBR Entry 번호 Entry 이름 설명 MFT Entry 0 0 $MFT MFT에대한 MFT Entry MFT Entry 1 1 $MFTMirr $MFT 파일의일부백업본 MFT Entry 2 2 $LogFile 메타데이터 (MFT) 의트랜잭션저널정보 : 메타데이터파일 3 $Volume 볼륨의레이블, 식별자, 버전등의정보 : 4 $AttrDef 속성의식별자, 이름, 크기등의정보 5. 볼륨의루트디렉터리 MFT Entry 15 6 $Bitmap 볼륨의클러스터할당정보 MFT Entry 16 7 $Boot 볼륨이부팅가능할경우부트섹터정보 : 8 $BadClus 배드섹터를가지는클러스터정보 : 9 $Secure 파일의보안, 접근제어와관련된정보 10 $Upcase 모든유니코드문자의대문자 11 $Extend $ObjID, $Quota, $Reparse points, $UsnJrnl 등의추가적인파일의정보를기록하기위해사용 Dt Data Area 12 15 미래를위해예약 16 포맷후생성되는파일의정보를위해사용 $ObjId 파일고유의 ID 정보 ( Windows 2000 - ) $Quota 사용량정보 ( Windows 2000 - ) $Reparse Reparse Point 에대한정보 ( Windows 2000 - ) $UsnJrnl 파일, 디렉터리의변경정보 ( Windows 2000 - )
MFT (Master File Table) Boot Sector Volume Boot Record $MFT Cluster 25-27, 80-82 Cluster 25 Cluster 26 Cluster 27 Cluster 80 Cluster 81 Cluster 82
MFT Entry MFT Entry Header Fixup Array Attributes End Marker Unused Space MFT Entry
MFT Entry MFT Entry Header MFT Entry Header Fixup Array Attributes End Marker Unused Space MFT Entry MFT Entry 의메타정보를담고있는 48 바이트크기의영역
MFT Entry MFT Entry Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Signature Offset to Fixup array Entries in Fixup array $LogFile Sequence Number (LSN) 0x10 Sequence Number Hard Link count Offset to File attribute Flags Real size of MFT Entry Allocated size of MFT Entry 0x20 File Reference to Base Entry Next attribute ID Align to 4B boundary Number of this MFT Entry
MFT Entry MFT Entry Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Signature Offset to Fixup array Entries in Fixup array $LogFile Sequence Number (LSN) 0x10 Sequence Number Hard Link count Offset to File attribute Flags Real size of MFT Entry Allocated size of MFT Entry 0x20 File Reference to Base Entry Next attribute ID Align to 4B boundary Number of this MFT Entry Signature :MFT Entry 시그니처 ( FILE ) Offset to Fixup array : Fixup 배열의시작위치 Number of entries in Fixup array : Fixup 배열이포함하는항목수 $LogFile Sequence Number (LSN) : $LogFile 에존재하는해당파일의트랜잭션위치값 MFT Entry 가변경될때마다갱신
MFT Entry MFT Entry Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Signature Offset to Fixup array Entries in Fixup array $LogFile Sequence Number (LSN) 0x10 Sequence Number Hard Link count Offset to File attribute Flags Real size of MFT Entry Allocated size of MFT Entry 0x20 File Reference to Base Entry Next attribute ID Align to 4B boundary Number of this MFT Entry Sequence Number : 순서번호로 MFT Entry 생성후할당 / 해제시마다 1 씩증가 Link count : 해당 MFT Entry 에연결된하드링크 Offset to File attribute : 해당 Entry 의첫번째속성의위치값 Flags : MFT Entry 상태정보 Flags 값이 0x00 일경우는? 0x03 일경우는? Flags 값 0x01 0x02 설명 사용중 디렉터리 004 0x04 분석안됨 0x08 분석안됨
MFT Entry MFT Entry Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Signature Offset to Fixup array Entries in Fixup array $LogFile Sequence Number (LSN) 0x10 Sequence Number Hard Link count Offset to File attribute Flags Real size of MFT Entry Allocated size of MFT Entry 0x20 File Reference to Base Entry Next attribute ID Align to 4B boundary Number of this MFT Entry Real size of MFT Entry : 실제사용중인크기 Allocated size of MFT Entry : MFT Entry 에할당된크기 (1,024 바이트 ) File Reference to Base Entry : 해당 Entry 의 non-base 일경우자신의 base Entry 의주소값 Next attribute ID : 다음속성 ID (Entry 내에서만유효한값 ) Align to 4B boundary (XP) Number of this MFT Entry (XP)
Base & Non base MFT Entry MFT Entry 32 MFT Entry 35 MFT Entry 36 MFT Entry 37 base MFT Entry 35 non base MFT Entry 32, 36 base MFT Entry 35 base MFT Entry non base MFT Entry 파일속성내용이클경우하나이상의 MFT Entry 사용 Base MFT Entry : 해당파일의첫 MFT Entry Non-base MFT Entry : 해당파일의나머지 MFT Entry
File Reference Address 47 63 0 Sequence Value MFT Entry Address Seq Num 1102(0x044E) 044E) 0x00120012 1103(0x044F) 0x0010 1104(0x0450) 0x0001 1105(0x0451) 0451) 0x0023 1106(0x0452) 0x0044 MFT Entries 0012 0000 0000 044E 0010 0000 0000 044F 0001 0000 0000 0450 0023 0000 0000 0451 0044 0000 0000 0452 File Reference Address MFT Entry 는 48 비트의고유한주소값을가짐 MFT Entry Address (MFT Entry Number) NTFS 는특정 MFT Entry 접근시 48 비트주소를확장한파일참조주소 (File Reference Address) 사용 File Reference Address = Sequence Number + MFT Entry Address 파일참조주소를사용하는이유는?
MFT Entry Fixup Array MFT Entry Header Fixup Array Attributes End Marker Unused Space MFT Entry Fixup : 수리하다, 고치다 MFT Entry 데이터무결성판단 MFT Entry 는 1,024 바이트이므로 2 개의섹터사용 각섹터의마지막 2 바이트를이용해 Fixup Array 구현 MFT Entry 구조외에도다양한구조에서 Fixup Arrary 사용 ( 클러스터크기에따라 2 개이상의섹터사용 ) FILE Records(MFT Entries) in the $MFT INDX Records in directories i and other indexes RCRD Records in the $LogFile RSTR Records in the $LogFile
MFT Entry Fixup Array 위치데이터설명 0x0000 ( 48 Byte ) MFT Entry Header 0x0030 CD AB 00 00 00 00 00 00 FixupArray 0x01F8 11 12 13 14 15 16 17 18 End of Sector 1 0x03F8 21 22 23 24 25 26 27 28 End of Sector 2 원본데이터 위치 데이터 설명 0x0000 ( 82 Byte ) MFT Entry Header 0x0030 CD AB 17 18 27 28 00 00 FixupArray 0x01F8 11 12 13 14 15 16 CD AB End of Sector 1 0x03F8 21 22 23 24 25 26 CD AB End of Sector 2 Fixup이적용된데이터
MFT Entry Fixup Array Signature : 0x00000000 Array : 0x0000, 0x0000 0x8565 0x2D0B Sector 0 Sector 1 Signature : 0xABCD Array : 0x8565, 0x2D0B 0xABCD 0xABCD Sector 0 Sector 1
MFT Entry Attributes MFT Entry Header Fixup Array Attributes End Marker Unused Space MFT Entry
MFT Entry Attributes 속성식별값속성이름설명 16 0x10 $STANDARD_INFORMATION 파일의생성. 접근. 수정시간, 소유자등의일반적인정보 32 0x20 $ATTRIBUTE_LIST 추가적인속성들의리스트 48 0x30 $FILE_NAME 파일이름 ( 유니코드 ), 파일의생성. 접근. 수정시간 64 0x40 $VOLUME_VERSION 볼륨정보 (Windows NT 1.2 버전에만존재 ) 64 0x40 $OBJECT_ID 16 바이트의파일, 디렉터리의고유값, 3.0 이상에서만존재 80 0x50 $SECURITY_DESCRIPTOR 파일의접근제어와보안속성 96 0x60 $VOLUME_NAME 볼륨이름 112 0x70 $VOLUME_INFORMATION 파일시스템의버전과다양한플래그 128 0x80 $DATA 파일내용 144 090 0x90 $INDEX_ROOT 인덱스트리의루트노드 160 0xA0 $INDEX_ALLOCATION 인덱스트리의루트와연결된노드 176 0xB0 $BITMAP $MFT 와인덱스의할당정보관리 192 0C0 0xC0 $SYMBOLIC_LINKLINK 심볼릭링크정보 (Windows 2000+) 192 0xC0 $REPARSE_POINT 심볼릭링크에서사용하는 reparse point 정보 (Windows 2000+) 208 0xD0 $EA_INFORMATION OS/2 응용프로그램과호환성을위해사용 (HPFS) 224 0E0 0xE0 $EA OS/2 응용프로그램과호환성을위해사용 (HPFS) 256 0x100 $LOGGED_UTILITY_STREAM 암호화된속성의정보와키값 (Windows 2000+)
MFT Entry Attributes 속성식별값속성이름설명 16 0x10 $STANDARD_INFORMATION 파일의생성. 접근. 수정시간, 소유자등의일반적인정보 32 0x20 $ATTRIBUTE_LIST 추가적인속성들의리스트 48 0x30 $FILE_NAME 파일이름 ( 유니코드 ), 파일의생성. 접근. 수정시간 64 0x40 $VOLUME_VERSION 볼륨정보 (Windows NT 1.2 버전에만존재 ) 64 0x40 $OBJECT_ID 16 바이트의파일, 디렉터리의고유값, 3.0 이상에서만존재 80 0x50 $SECURITY_DESCRIPTOR 파일의접근제어와보안속성 96 0x60 $VOLUME_NAME 볼륨이름 112 0x70 $VOLUME_INFORMATION 파일시스템의버전과다양한플래그 128 0x80 $DATA 파일내용 144 090 0x90 $INDEX_ROOT 인덱스트리의루트노드 160 0xA0 $INDEX_ALLOCATION 인덱스트리의루트와연결된노드 176 0xB0 $BITMAP $MFT 와인덱스의할당정보관리 192 0C0 0xC0 $SYMBOLIC_LINKLINK 심볼릭링크정보 (Windows 2000+) 192 0xC0 $REPARSE_POINT 심볼릭링크에서사용하는 reparse point 정보 (Windows 2000+) 208 0xD0 $EA_INFORMATION OS/2 응용프로그램과호환성을위해사용 (HPFS) 224 0E0 0xE0 $EA OS/2 응용프로그램과호환성을위해사용 (HPFS) 256 0x100 $LOGGED_UTILITY_STREAM 암호화된속성의정보와키값 (Windows 2000+)
MFT Entry Attributes MFT Entry Fixup Attr Attr Attr Attr Attr Attr End Unused Header Array Header Content Header Content Header Content Marker Space 각파일의메타정보 ( 이름, 시간정보, 속성, 내용등 ) 는속성이라는구조를통해표현 각속성은속성헤더와속성내용을가짐 파일특성에따라다양한속성을가짐 속성은크기에따라 Resident 와 Non-resident 속성으로나뉨
MFT Entry Attributes Resident & Non resident Attribute MFT Entry Fixup Attr Attr Attr Attr Attr Header Array Header Content Header Content Header Cluster 360 End Marker Unused Space Attr Content Cluster 360 Resident 속성 : 속성헤더뒤에바로속성내용이저장 (MFT Entry 내부 ) $STANDARD_INFORMATION, $FILE_NAME Non-resident 속성 : 속성내용이너무많이별도의클러스터에저장 (MFT Entry 외부 ) $ATTRIBUTE_LIST, $DATA $DATA 속성의경우 파일크기 < 700 바이트 : Resident 속성 파일크기 > 700 바이트 : Non-resident 속성
MFT Entry Attribute Header MFT Entry Fixup Attr Attr Attr Attr Attr Attr End Unused Header Array Header Content Header Content Header Content Marker Space 각속성은속성의메타정보표현을위해속성헤더를가짐 속성형식에관계없는공통된 16 바이트헤더 + 속성형식 (Resident/Non-resident) 에따라추가적인헤더
MFT Entry Common Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Attribute type ID Length of attribute Nreg Len Offset to Flag Nam name Flags Attribute ID
MFT Entry Common Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Attribute type ID Length of attribute Nreg Len Offset to Flag Nam name Flags Attribute ID Attribute type identifier : 속성타입식별값 Length of attribute : 속성헤더를포함한속성전체길이 Non-resident flag : Non-resident 속성인지여부 (0x01 값을가진다면 Non-resident 속성 ) Length of name : 자신의속성이름길이 Offset to name : 속성이름이저장된곳의시작위치 Flags : 속성의상태표현 0x0001 : 압축된속성 0x4000 : 암호화된속성 0x8000 : Sparse 속성 Attribute identifier : 속성의고유한식별자로 MFT Entry 에같은속성이여러개일경우구별하기위해사용
MFT Entry Resident Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Common Attribute Header 0x10 Size of content Offset to content Idx Flag Un used Attribute Name (if exist, )
MFT Entry Resident Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Common Attribute Header 0x10 Size of content Offset to content Idx Flag Un used Attribute Name (if exist, ) Size of content : 헤더뒤에오는속성내용의크기 Offset to content : 속성내용이시작하는곳의위치 Indexed flag : 1 값을가진다면인덱스된속성 ($FILE_NAME 속성은 1 로설정 ) Attribute name : 속성이름이있는경우속성이름, 없는경우바로속성내용
MFT Entry Non resident Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Common Attribute Header 0x10 Start Virtual Cluster Number (VCN) of the runlist End VCN of the runlist 0x20 Offset to runlist Comp unit size Unused Allocated size of attribute content 0x30 Real size of attribute content Initialized size of attribute content 0x40 Attribute name (if exist, )
MFT Entry Non resident Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Common Attribute Header 0x10 Start Virtual Cluster Number (VCN) of the runlist End VCN of the runlist 0x20 Offset to runlist Comp unit size Unused Allocated size of attribute content 0x30 Real size of attribute content Initialized size of attribute content 0x40 Attribute name (if exist, ) Start VCN of the runlist : 속성내용이담긴런리스트 (runlist) 의시작 VCN End VCN of the runlist : 속성내용이담긴런리스트 (runlist) 의끝 VCN Offset to runlist : 속성내부의런리스트시작위치 Compression unit size : 압축속성일경우압축단위
MFT Entry Non resident Attribute Header 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Common Attribute Header 0x10 Start Virtual Cluster Number (VCN) of the runlist End VCN of the runlist 0x20 Offset to runlist Comp unit size Unused Allocated size of attribute content 0x30 Real size of attribute content Initialized size of attribute content 0x40 Attribute name (if exist, ) Allocated size of attribute content : 속성내용에할당된클러스터크기 ( 클러스터배수 ) Real size of attribute content : 속성내용의실제크기 Initialized size of attribute content : 속성내용의초기화된크기 Attribute name : 속성이름이있는경우속성이름, 없는경우바로속성내용
MFT Entry Cluster Runs MFT Entry Fixup Attr Attr Attr Attr Attr Header Array Header Content Header Content Header Cluster Runs End Marker Unused Space Start Cluster Length 1 1220 3 2 3072 4 Non-resident 속성의경우할당받는클러스터는파일에따라수천~ 수만 비연속적으로할당된클러스터를효과적으로관리하기위해클러스터런 (Cluster Runs) 사용 클러스터런은런리스트 (Runlist) 형태로관리 0010 0001 Run Length Run Offset Byte 1 Byte 2 Byte 3 Byte 4
MFT Entry Logical Cluster Number (LCN) & Virtual Cluster Number (VCN) MFT Entry Fixup Attr Attr Attr Attr Attr Header Array Header Content Header Content Header Cluster Runs End Marker Unused Space Start Cluster Length 1 1220 3 2 3072 4 Attribute Content Attribute Content LCN 1220 1221 1222 3072 3073 3074 3075 VCN 0 1 2 3 4 5 6 LCN : 볼륨의첫번째클러스터부터순차적인번호 (LBA?) VCN : 파일의첫번째클러스터부터순차적인번호
MFT Entry Attribute Content MFT Entry Fixup Attr Attr Attr Attr Attr Attr End Unused Header Array Header Content Header Content Header Content Marker Space $STANDARD_INFORMATION $FILE_NAME $DATA Type ID : 16 Type ID : 48 Type ID : 128 일반적인파일은 3 가지속성을가짐 $STANDARD_INFORMATION : 파일의생성 접근 수정시간, 소유자등의정보 $FILE_NAME : 파일이름 ( 유니코드 ), 파일의생성 접근 수정시간 $DATA : 파일내용 $ 이후대문자가온다면속성이름 $ 이후첫글자만대문자라면메타데이터파일 ($MFT 제외 )
MFT Entry Attributes $STANDARD_INFORMATION 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Created Time Modified Time 0x10 MFT Modified Time Last Accessed Time 0x20 Flags Maximum number of versions Version number Class ID 0x30 Owner ID Security ID Quota Charged 0x40 Update Sequence Number (UCN) 모든파일에존재하는기본속성으로속성식별값 16 (0x10) 속성중식별값이가장낮기때문에속성구조에서가장처음에위치 윈도우 NT 에서는 48 바이트크기, 2000 이상에서는 72 바이트
MFT Entry Attributes $STANDARD_INFORMATION 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Created Time Modified Time 0x10 MFT Modified Time Last Accessed Time 0x20 Flags Maximum number of versions Version number Class ID 0x30 Owner ID Security ID Quota Charged 0x40 Update Sequence Number (UCN) Windows 64-Bit Timestamp Created Time Modified Time MFT Modified Time Last Accessed Time
MFT Entry Attributes $STANDARD_INFORMATION 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Created Time Modified Time 0x10 MFT Modified Time Last Accessed Time 0x20 Flags Maximum number of versions Version number Class ID 0x30 Owner ID Security ID Quota Charged 0x40 Update Sequence Number (UCN) Flags 값 설명 0x0080 일반 (Normal) Flags 0x0100 임시 (Temporary) Flags 값 설명 0x0200 Sparse 파일 0x0001 읽기전용 (Read Only) 0x0400 Reparse Point 0x0002 숨긴파일 (Hidden) 0x0800 압축 (Compressed) 0x0004 시스템 (System) 0x1000 오프라인 (Offline) 0x0020 아카이브 (Archive) 0x2000 인덱스되지않음 0x0040 장치 (Device) 0x4000 암호화 (Encrypted)
MFT Entry Attributes $STANDARD_INFORMATION 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Created Time Modified Time 0x10 MFT Modified Time Last Accessed Time 0x20 Flags Maximum number of versions Version number Class ID 0x30 Owner ID Security ID Quota Charged 0x40 Update Sequence Number (UCN) Maximum number of version : 파일의최대버전값 Version number : 파일의버전 Class ID : 인덱스된클래스 ID Owner ID : 파일소유자의 ID 값으로 $Quota 파일에서인덱스로사용
MFT Entry Attributes $STANDARD_INFORMATION 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Created Time Modified Time 0x10 MFT Modified Time Last Accessed Time 0x20 Flags Maximum number of versions Version number Class ID 0x30 Owner ID Security ID Quota Charged 0x40 Update Sequence Number (UCN) Security ID : $Secure 파일의인덱스로사용되고 ACL 적용시사용 Quota Charged : 사용자할당량중해당파일이할당된크기 ( 보통파일크기과동일 ) USN : 파일의 USN 값으로 $UsnJrnl 에서인덱스로사용
MFT Entry Attributes $ATTRIBUTE_LIST MFT Entry Header Fixup Array $STANDARD _INFORMATION Attr Header ATTR_LIST ATTR_LIST ATTR_LIST 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Attribute type Length of entry Len Nam Off Nam Start VCN of attribute 0x10 File Reference Address Attribute ID 속성식별값 32 (0x20) 으로필수적인속성은아님 특정파일의속성이 1,024 바이트를초과하는경우속성의단편화 속성의빠른접근을위해사용하는구조 여러개의속성리스트엔트리사용
MFT Entry Attributes $ATTRIBUTE_LIST 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Attribute type Length of entry Len Nam Off Nam Start VCN of attribute 0x10 File Reference Address Attribute ID Attribute name (if exist, ) Attribute type : 속성타입 Length of entry : 엔트리길이 Length of Name : 이름길이 Offset to Name : 이름시작위치 Start VCN of attribute : 속성시작 VCN File Reference Address : 속성위치의파일참조주소 Attribute ID : 속성 ID Attribute name : 속성이름이존재할경우속성이름
MFT Entry Attributes $ATTRIBUTE_LIST (example) $Secure 메타데이터파일의 $ATTRIBUTE_LIST 속성
MFT Entry Attributes $ATTRIBUTE_LIST (example) $Secure 메타데이터파일의 $ATTRIBUTE_LIST 속성 속성타입 엔트리길이 이름길이 이름위치 시작 VCN 속성파일참조주소 속성 ID 속성이름 0x10 ($STD_INFO) 0x0020 0x00 0x1A 0x~00 0x00090000 00000009 0x0000 0x30 ($FILE_NAME) 0x0020 0x00 0x1A 0x~00 0x00090000 00000009 0x0007 0x80 ($DATA) 0x0028 0x04 0x1A 0x~00 0x00820000 00021F61 0x0000 $SDS 0x90 ($INDEX_ROOT) 0x0028 0x04 0x1A 0x~00 0x00090000 00000009 0x0001 $SDH 0x90 ($INDEX_ROOT) 0x0028 0x04 0x1A 0x~00 0x00090000 00000009 0x0011 $SII 0xA0 ($INDEX_ALLOC) 0x0028 0x04 0x1A 0x~00 0x00010000 00000AF4 0x0002 $SDH 0xA0 ($INDEX_ALLOC) 0x0028 0x04 0x1A 0x~00 0x00010000 00000AF4 0x0003 $SII 0xB0 ($BITMAP) 0x0028 0x04 0x1A 0x~00 0x00010000 00000AF4 0x0004 $SDH 0xB0 ($BITMAP) 0x0028 0x04 0x1A 0x~00 0x00010000 00000AF4 0x0005 $SII
MFT Entry Attributes $ATTRIBUTE_LIST (example) MFT Entry MFT $INDEX_ROOT $INDEX_ROOT $STD_INFO $ATTRIBUTE_LIST $FILE_NAME #9 Header ($SDH) ($SII) Unused 속성타입 시작 VCN MFT 엔트리번호 0x10 ($STD_INFO) 0 0x09 (9) 0x30 ($FILE_NAME) 0 0x09 (9) 0x80 ($DATA) 0 0x021F61 (139105) 0x90 ($INDEX_ROOT) 0 0x09 (9) 0x90 ($INDEX_ROOT) 0 0x09 (9) 0xA0 ($INDEX_ALLOC) 0 0x0AF4 (2804) 0xA0 ($INDEX_ALLOC) 0 0x0AF4 (2804) 0xB0 ($BITMAP) 0 0x0AF4 (2804) 0xB0 ($BITMAP) 0 0x0AF4 (2804) MFT Entry #2804 MFT Header $INDEX_ALLOC ($SDH) $INDEX_ALLOC ($SII) $BITMAP ($SDH) $BITMAP ($SII) Unused MFT Entry #139105 MFT Header $DATA Unused
MFT Entry Attributes $FILE_NAME 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 File Reference Addr of parent directory Created Time 0x10 Modified Time MFT Modified Time 0x20 Last Accessed Time Allocated size of file 0x30 Real size of file Flags Reparse value Len Nam Nam spac File Name (as length) 속성식별값 48 (0x30) 을가지는속성으로파일의이름표현 유니코드 (UTF-16) 으로인코딩되어저장 $FILE_NAME 속성은 MFT Entry 외에 $I30 인덱스 ( 탐색을위한구조 ) 에도저장 일반적으로파일이름변경을제외하고는 $I30 인덱스의 $FILE_NAME 속성만갱신
MFT Entry Attributes $FILE_NAME 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 File Reference Addr of parent directory Created Time 0x10 Modified Time MFT Modified Time 0x20 Last Accessed Time Allocated size of file 0x30 Real size of file Flags Reparse value Len Nam Nam spac File Name (as length) File Reference Address of parent directory : 부모디렉터리의파일참조주소 Windows 64-Bit Timestamp Created Time Modified Time MFT Modified Time Last Accessed Time
MFT Entry Attributes $FILE_NAME 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 File Reference Addr of parent directory Created Time 0x10 Modified Time MFT Modified Time 0x20 Last Accessed Time Allocated size of file 0x30 Real size of file Flags Reparse value Len Nam Nam spac File Name (as length) Allocated size of file : 해당파일이할당된크기 ( 클러스터배수 ) Real size of file : 해당파일의실제크기 Flags : $STANDARD_INFORMATION 속성플래그와동일 Reparse value : 해당속성의 Reparse Point ( 해당파일의마운트, 심볼릭링크정보등을저장 ) Length of Name : 이름길이
MFT Entry Attributes $FILE_NAME 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 File Reference Addr of parent directory Created Time 0x10 Modified Time MFT Modified Time 0x20 Last Accessed Time Allocated size of file 0x30 Real size of file Flags Reparse value Len Nam Nam spac File Name (as length) Namespace : 이름의표현형식 POSIX, Win32, DOS, Win32&Dos http://msdn.microsoft.com/en-us/library/aa365247%28vs.85%29.aspx File Name : 유니코드 (UTF-16) 으로인코딩된파일이름
MFT Entry Attributes $BITMAP 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 Allocation Bitmap 속성식별값 176 (0xB0) 을가지는속성으로할당정보표현 할당정보를관리하는데이터 $MFT, $INDEX_ALLOCATION 05 00 00 00 00 00 00 00 0000 0101 0000 0000 0000 0000 0000 0000 0000 00000 1 번째와 3 번째 MFT Entry 가사용중임을나타냄
MFT Entry Attributes $DATA 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x~~ Attribute Header 0x00 File Data (as size, ) 속성식별값 180 (0x80) 을가지는속성으로파일데이터저장 속성헤더이후에바로속성내용인파일데이터스트림위치 데이터의크기에따라 Resident 혹은 Non-resident 로존재 대체데이터스트림 (Alternate Data Stream) 을통해 2 개이상의데이터스트림표현
MFT Entry Alternate Data Stream (ADS) MFT Entry Header Fixup Array $STANDARD_INFO $FILE_NAME $DATA $DATA End Unused Main Stream Alternate Stream Marker Space $DATA 속성을 2 개이상의속성스트림지원 ( 윈도우 NT 3.1 버전부터지원 ) NT(NTFS) 서버에서 Mac OS(HFS) 클라이언트를지원하기위해추가 추가적인속성스트림 (ADS) 은속성이름을통해접근 결국, ADS 는반드시속성이름을가지고있어야함 기본스트림은없어도무관 ADS 속성은파일크기에포함되지않음 ADS 용도 파일의요약정보저장 영역식별자 (Zone Identifier)
MFT Entry Alternate Data Stream (ADS) ADS 생성 ~\> notepad proneer.txt:ads.txt ~\> echo This is contained ADS > proneer.txt:ads2.txt ~\> type c:\windows\system.ini > proneer.txt:ads3.ini ~\> echo This is attached to directory list > :ads4.txt ADS 확인 별도의도구를이용 ~\> more < proneer.txt:ads3.ini ADS 삭제 ADS 가존재하는파일삭제, 기본스트림복사후삭제 ADS 를지원하지않는파일시스템으로복사 별도의도구를이용하거나무의미한데이터로대체 ~\> echo > proneer.txt:ads3.ini
MFT Entry Indexes Binary Tree ( 이진트리 ) 한노드가최대 2 개의자식노드를갖는트리 노드의왼쪽서브트리의모든노드값은키값보다작음 노드의오른쪽서브트리의모든노드값은키값보다큼 715 57 22 3 11
MFT Entry Indexes B-Tree (B 트리 ) 차수가 m 인 m- 원탐색트리 루트와단말노드를제외한각노드는최소 m/2 의서브트리를가짐 ( 절반이상이채워져야함 ) 루트는최소 2 개의서브트리를가짐 모든단말노드는같은레벨 10 18 30 3 8 9 15 20 21 35 50
MFT Entry Indexes 인덱스구조 : 빠르게검색이필요한데이터는인덱스구조로관리 ( 디렉터리등 ) 인덱스이름인덱싱하는데이터위치 $I30 $FILE_NAME 속성디렉터리의 MFT Entry $SDH SecurityDescriptors $Secure 메타데이터파일 $SII Security ID $Secure 메타데이터파일 $O Object ID $ObjId 메타데이터파일 $O Owner ID $Quota 메타데이터파일 $Q Quota $Quota 메타데이터파일
MFT Entry Indexes B-Tree($I30) : B 트리의노드값은파일이름 ($FILE_NAME 속성 ) A eee.txt lll.txt ttt.txt Root Index Node B aaa.txt bbb.txt D ooo.txt rrr.txt E vvv.txt zzz.txt C fff.txt ggg.txt iii.txt
MFT Entry Indexes B-Tree($I30) : jjj.txt 파일삽입 (1) eee.txt lll.txt ttt.txt Root Index Node aaa.txt bbb.txt ooo.txt rrr.txt vvv.txt zzz.txt fff.txt ggg.txt iii.txt jjj.txt
MFT Entry Indexes B-Tree($I30) : jjj.txt 파일삽입 (2) eee.txt ggg.txt lll.txt ttt.txt Root Index Node aaa.txt bbb.txt ooo.txt rrr.txt vvv.txt zzz.txt fff.txt iii.txt jjj.txt
MFT Entry Indexes B-Tree($I30) : jjj.txt 파일삽입 (3) ggg.txt Root Index Node eee.txt lll.txt ttt.txt aaa.txt bbb.txt fff.txt ooo.txt rrr.txt vvv.txt zzz.txt iii.txt jjj.txt
MFT Entry Indexes B-Tree($I30) : fff.txt 와 zzz.txt 파일삭제 (1) ggg.txt Root Index Node eee.txt lll.txt ttt.txt aaa.txt bbb.txt fff.txt ooo.txt rrr.txt vvv.txt zzz.txt iii.txt jjj.txt
MFT Entry Indexes B-Tree($I30) : fff.txt 와 zzz.txt 파일삭제 (2) ggg.txt Root Index Node bbb.txt lll.txt ttt.txt aaa.txt eee.txt ooo.txt rrr.txt vvv.txt iii.txt jjj.txt
MFT Entry Indexes B-Tree($I30) : 가상의디렉터리 $I30 인덱스 $INDEX_ROOT Header $INDEX_ROOT Attribute Index Record Header [eee.txt] [lll.txt] [ttt.txt] txt] End of MFT 20 MFT 55 MFT 87 Node $INDEX_ALLOCATION Attribute [aaa.txt] MFT 30 [bbb] DIR MFT 40 End of Node [ooo.txt] MFT 120 [rrr] DIR MFT 90 End of Node [vvv] DIR MFT 65 [zzz.txt] MFT 34 End of Node [fff.txt] MFT 72 [ggg.txt] MFT 73 [iii.txt] MFT 22 End of Node Index Node Index Node Header Index Entry 1 Index Entry 2 Index Entry 3 End of Node Unused Space $FILE_NAME Attribute
MFT Entry Indexes $INDEX_ROOT 는항상 Resident 속성 인덱스항목이많아지면 $INDEX_ALLOCATION 속성을이용해 Non-resident 로구성 MFT Entry $STANDARD_I NFORMATION $FILE_NAME $INDEX_ROOT (resident) $INDEX_ALLOCATION (non resident) Index Record 0 1 2 Index Entry
MFT Entry Indexes A ) $INDEX_ROOT 1 2 3 X B ) X $INDEX_ROOT $INDEX_ALLOCATION 1 2 3 4 14 15 X Index Record 1 C ) 14 X $INDEX_ROOT $INDEX_ALLOCATION 1 2 3 4 12 13 X Index Record 1 15 16 17 18 24 25 X Index Record 2
MFT Entry Attributes $INDEX_ROOT Previous Attribute Index Root Index Node Attributes t Header Header Header Index Entry1 Index Entry2 End of Node Unused Space Next Attributes t
MFT Entry Attributes $INDEX_ROOT Previous Attribute Index Root Index Node Attributes t Header Header Header Index Entry1 Index Entry2 End of Node Unused Space Next Attributes t 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Type of attribute in index Collation sorting rule Size of each index record in bytes Size In Clus Unused Type of attribute in index : 인덱스엔트리가담고있는속성식별값 ( 디렉터리의경우 0x30, $FILE_NAME) Collation sorting rule : 인덱스엔트리가담고있는형식 ( 형식에맞게정렬됨 ) Size of each index record in bytes : $INDEX_ALLOCATION O 속성이가지는인덱스레코드의바이트크기 Size of each index record in Clusters : $INDEX_ALLOCATION 속성이가지는인덱스레코드의클러스터크기
MFT Entry Attributes $INDEX_ROOT Previous Attribute Index Root Index Node Attributes t Header Header Header Index Entry1 Index Entry2 End of Node Unused Space Next Attributes t 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Offset to Start of index entry list Offset to End of used portion of index entry list Offset to end of Allocated index entry list buffer Flags Offset to Start of index entry list : 인덱스엔트리목록의시작위치 Offset to End of used portion of index entry list : 인덱스엔트리의실제크기 ( 인덱스노드헤더포함 ) Offset to end of Allocated index entry list buffer : 인덱스엔트리의할당크기 ( 인덱스노드헤더포함 ) Flags 0x00 : 인덱스노드의자식노드가없음 0x01 : 인덱스노드의자식노드가있음
MFT Entry Attributes $INDEX_ROOT Previous Attribute Index Root Index Node Attributes t Header Header Header Index Entry1 Index Entry2 End of Node Unused Space Next Attributes t 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 File Reference Address for filename Length of this entry Length of content Flags $FILE _ NAME Attribute VCN of child node in $INDEX_ALLOCATION File Reference Address for filename : 해당파일및디렉터리의파일참조주소 Length of this entry : 해당인덱스엔트리의총크기 Length of content : 해당인덱스엔트리가담고있는 $FINE_NAME 속성의크기 Flags 0x01 : 자식노드가존재 0x02 : 노드의마지막엔트리
MFT Entry Attributes $INDEX_ROOT Previous Attribute Index Root Index Node Attributes t Header Header Header Index Entry1 Index Entry2 End of Node Unused Space Next Attributes t 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 File Reference Address for filename Length of this entry Length of content Flags $FILE _ NAME Attribute VCN of child node in $INDEX_ALLOCATION VCN of child node in $INDEX_ALLOCATION : 해당인덱스엔트리가자식노드를가지는경우 $INDEX_ALLOCATION 속성에위치한자식인덱스노드의위치
MFT Entry Attributes $INDEX_ALLOCATION Index Record 0 Index Record 0 Index Record Header Index Node Header Index Entry1 Index Entry2 End of Entry Index Record Header Index Node Header Index Entry1 Index Entry2 End of Entry 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0x00 Signature ( INDX ) Offset to Fixup array Num of entries in Fa $LogFile Sequence Number (LSN) 0x10 The VCN of this record in the full index stream Signature : $INDEX_ALLOCATION 의시그니처 ( INDX ) Offset to Fixup array : Fixup array 의위치 Number of entries in Fixup array : Fixup array 에저장된항목의수 $LogFile Sequence Number (LSN) : $LogFile 에존재하는해당파일의트랜잭션위치값 The VCN of this record in the full index stream : $INDEX_ALLOCATION 속성에서해당인덱스레코드가저장된위치
MFT Entry Attributes Index Structure $INDEX_ROOT $INDEX_ALLOCATION $BITMAP MFT Entry CCC.TXT MFT Entry : 57 Child VCN : 0 End of Node Child VCN : 4 Start LCN 1045 Start VCN 0 Len 8 03 00 00 Cluster 1045 VCN : 4 AAA.TXT MFT Entry : 39 Child VCN : X BBB.TXT MFT Entry : 99 Child VCN : X End of Node DDD.TXT MFT Entry : 103 Child VCN : X EEEEEEEEEEEE.TXT MFT Entry : 321 Child VCN : X EEEEEE~1.TXT MFT Entry : 321 Child VCN : X End of Node Index Record Header
NTFS Features Security is a people problem
NTFS Features Sparse File (applied only $DATA, Non resident) cont. MFT Entry Fixup Attr Attr Attr Attr Attr Header Array Header Content Header Content Header Cluster Runs End Marker Unused Space Start LCN Length 1 35 4 2 90 3 3 102 4 LCN 35 36 37 38 90 91 92 102 103 104 105 VCN 0 1 2 3 4 5 6 7 8 9 10 의미있는데이터 0 으로만이루어진데이터
NTFS Features Sparse File (applied only $DATA, Non resident) MFT Entry Fixup Attr Attr Attr Attr Attr Header Array Header Content Header Content Header Cluster Runs End Marker Unused Space Start LCN Length 1 35 4 2 3 3 102 4 X LCN 35 36 37 38 102 103 104 105 VCN 0 1 2 3 7 8 9 10 의미있는데이터 0 으로만이루어진데이터
NTFS Features Compression (applied only $DATA, Non resident) Original Content Compression Units Compression Results Sparse Sparse Ondisk Layout Start LCN Length 1 100 16 2 16 3 150 10 4 6 5 160 16
NTFS Features Decompression (applied only $DATA, Non resident) Start LCN Length 1 100 20 2 150 16 3 200 4 4 10 5 380 6 6 12 Merged Runs Sparse Sparse Compression Units Original Content
NTFS Features DESX Win 2000 Encryption (applied only $DATA) 취약점 : EFS0.TMP Triple DES AES Win XP Win XP SP1, 2003 File Content User1 s Public Key Encrypt User1 s Encrypted FEK $LOGGED_UTILITY_STREAM Attribute Encrypt Random Key (FEK) Encrypt Encrypted File Content User2 s Public Key User2 s Encrypted FEK $DATA Attribute
NTFS Features Decryption (applied only $DATA) $DATA Attribute Encrypted File Content $LOGGED_UTILITY_STREAM Attribute User1 s Encrypted FEK Decrypt Random Key (FEK) Decrypt User1 s Password Decrypt User1 s Private Key File Content Registry Value User1 s Encrypted Private Key
NTFS Features Change Journal ($UsnJrnl) MFT Entry Header Fixup Array $STANDARD_INFO $FILE _ NAME $DATA $DATA End Unused $UsnJrnl $Max $J Marker Space 1 X 4557 2 210 10 Journal Entry Sparse Area File A 11:02 Created File B 11:03 Modified
NTFS Features Logging File System Journaling ($LogFile) MFT Entry 2 $LogFile MFT Entry Non-resident $DATA Attribute Restart Area Logging Area LSN ( Logical Sequence Number ) MFT Entry Header include LSN Field
NTFS Features Logging File System Journaling ($LogFile) MFT Entry 2 Transaction 2 Update Records Transaction 1 Update Records Transaction 1 Commit Record Restart Area Logging Area Checkpoint Record Update Record Commit Record
NTFS Example Security is a people problem
NTFS Example File Allocation (c:\dir1\file1.dat) $LogFile Journal Volume Boot Record MFT Entry $BITMAP Attribute 0 $MFT 1 / Index 2 5 6 $LogFile \ $Bitmap Cluster Bitmap 11 dir 1 200 Quota Index $Quota Change Journal $UsnJrnl dir1 Index 200 dir1 file1.dat 304 file1.dat $DATA attribute 304 file1.dat Cluster Cluster 692 693
NTFS Example File Allocation (c:\dir1\file1.dat) $LogFile Journal Volume Boot Record MFT Entry $BITMAP Attribute 0 $MFT 0 / Index 2 5 6 $LogFile \ $Bitmap Cluster Bitmap 00 dir 1 200 Quota Index $Quota Change Journal 200 $UsnJrnl dir1 dir1 Index file1.dat $DATA attribute 304 file1.dat Cluster Cluster 692 693
NTFS Example File Searching (c:\dir1\file1.dat) / Index 0 $MFT $INDEX_ROOT 2 dir 1 200 $INDEX_ALLOCATION $LogFile 5 6 \ $Bitmap dir1 Index file1.dat $Quota $MFT 200 304 $UsnJrnl dir1 file1.dat file1.dat MFT Entry $ST _ IN $FI _ NA $DATA file1.dat Non resident Cluster 692 Cluster 693
Quiz! Security is a people problem
Quiz! NTFS FAT32 NTFS 로변화하면서추가된기능은? NTFS 의 VBR 에서부트섹터의역할은? NTFS 의 VBR 에서 2 번째섹터의역할은? $MFT 메타데이터파일은무엇인가? MFT Entry 에서 Fixup Array 를사용하는이유는? 파일참조주소 (File Reference Address) 에 MFT Entry 순서번호 (Sequence Number) 가포함되는이유는? 클러스터크기가 4KB 인경우 VBR 의크기는?
Quiz! NTFS MFT Entry 의크기는? 파일및디렉터리의시간정보위치는? $Bitmap 메타데이터파일과 $BITMAP 속성의차이는? $BadClus 메타데이터파일이저장하는내용은? $MFT 크기가가변적인이유는? Resident 속성과 Non-resident 속성의차이는? 기본적인파일이가지는 3 가지속성은?
Quiz! NTFS $STANDARD_INFORMATION, $FILE_NAME 속성의시간정보차이는? 파일을빠르게탐색하기위한구조는? Cluster Runs 은무엇인가? 숨긴파일을찾는방법은? 암호화된파일을찾는방법은? Alternate Data Stream (ADS) 의용도는? ADS 속성을가지는파일확인법은?
Quiz! NTFS NTFS 비할당클러스터판별법은? 삭제된파일판별법은? 덮어써진파일판별법은? NTFS 의낭비되는영역은? 연속적인클러스터에할당된파일이삭제된경우복구방법은? 비연속적인클러스터에할당된파일이삭제된경우복구방법은?
Question & Answer