2019-01-03
[ MTF * SP Cluster + 2048 = 6293504 ]
[ 짧은 제목과 내용 ]
[ 짧은 제목, 긴 제목, 내용 ]
MFT(Master File Table)
- MFT Entry들의 모음
- MFT의 시작위치는 BR에서 확인한다.
- MFT의 크기는 볼륨에 있는 파일과 디렉토리의 개수에 비례한다.
- 파일이나 디렉토리는 기본적으로 한개의 MFT Entry를 사용한다.
- 기록할 속성이 많아지면 MFT Entry를 더 사용하기도 한다.
- 예)볼륨에 파일과 디렉토리의 개수가 60000개일 때 MFT Entry개수는 대략 60000개 이상 차지한다.
- 60000 * 1KB = 60000 KB = 약 60 MB
- 파일 또는 디렉토리에 대한 정보를 담고 있다.파일명,크기,시간,파일내용,위치,권한,할당량 ...
- 기본적으로 파일이나 디렉토리는 하나의 Entry를 사용하며 기록할 내용이 많은 경우 Entry를 여러 개 사용할 수도 있다.
- 기본 크기는1KB이다.(BR 또는 MFT Entry Header에서 확인가능) 그러므로 MFT Entry는 섹터 2개(512Byte*2)를 차지한다.
- MFT Entry Header와 여러 개의 속성들(Attributes)로 구성된다.
- MFT Entry 마지막 속성의 뒷부분에 End Marker(0xFFFFFFFF)로 끝난다.
- MFT Entry는 번호가 0번부터 시작한다.
MFT Entry Header
- MFT Entry임을 나타내는 표시이다.
- 위치: 0~3번 바이트
- 크기: 4 Bytes
- 정상 Entry에는 FILE 이라는 문자열이 적혀있다.
- 문제가 발견된 Entry에는 BAAD라고 적혀있다.
- MFT Entry 시작 위치로부터 Fixup 배열까지의 거리
- 위치: 4~5번 바이트
- 크기: 2 Bytes
- 보통 0x30이라고 적혀있다.
(참고)Fixup Array
- 데이터가 저장된 섹터의 내용의 손상여부를 확인하기 위한 기법
- 섹터의 마지막 2바이트를 특정 Signature로 바꿔놓고 원래의 2바이트 값은 Fixup배열에 기록해 둔다.
- Signature값은 Fixup 배열의 맨앞에 기록한다.
- 섹터를 읽을 때 Signature값이 틀리면 손상된 섹터로 간주한다.
- 위치: 보통 MFT Entry Header가 끝나고 바로 이어진다. Offset to Fixup Array항목에서 확인
- 크기: Count of Fixup Values 항목에서 확인
- 이 기법이 사용되는 항목은 MFT Entry,Index Record, RCRD Record, RSTR Record 등이다.
- 파일 내용이 들어가는 클러스터의 섹터에는 적용하지 않는다.
- Fixup 배열(Array)의 크기(항목의 개수)
- MFT Entry는 기본적으로 3이다.
- MFT Entry가 1KB이므로 섹터 2개를 사용 + Signature가 1개 항목 사용
- 위치: 6~7번 바이트
- 크기: 2 바이트
- $LogFile Sequence Number(LSN)
- 설명은 뒤에서 다시 다룬다.
- 내용은 다양한 값을 가질 수 있다.
- 위치: 8~15번 바이트
- 크기: 8 바이트
- MFT Entry가 할당 또는 해제될 때 값이 증가한다.
- MFT Entry를 재할당하면 이값이 바뀌므로 내용이 바뀌었다는 것을 추측할 수 있다.
- 위치: 16~17번 바이트
- 크기: 2 바이트(16 bit)
[ 참고 ]
File Reference Address (64 bit)
- MFT Entry의 번호를 의미하는데 관리의 편의성 때문에 sequence Value를 합쳐서 사용한다.
- Seqence Value(16 bit) + MFT Entry Address(48 bit)
- 예) 1024번(0x0400) MFT Entry의 Sequence Value의 값이 0x0010 이라면 File Reference Address는
- 0x0010 과 0x000000000400 를 붙여서 0x0010000000000400 이 된다.
- 하드 링크의 개수
- 보통 1 이다. Base MFT Entry에서만 사용된다.
- Hard Link 개념을 윈도우에서도 사용할 수 있다. 하지만 실제 도구가 없어서 사용할수 없다. 그러나 MS에서 제공되는 도구가 있다.
- 위치: 18~19
- 크기: 2 Bytes
- Offset to First Attribute
- MFT Entry의 첫 번째 속성(Attribute)의 위치(Offset)
- 보통 56(D)=0x38 이지만 얼마든지 다른 값이 올 수 있다. 확인 필수
- 위치: 20~21
- 크기: 2 Bytes
- MFT Entry의 상태정보
- 내용이 0x1 이면 MFT Entry가 사용 중임을 나타낸다.
- 내용이 0x2 이면 MFT Entry가 디렉토리에 사용되고 있음을 나타낸다.
- 위치: 22~23번 바이트
- 크기: 2 바이트
- MFT Entry 전체크기(보통 1KB)중에서 사용중인 공간의 크기를 나타낸다. 정확하지는 않고 8의 배수로 기록된다.
- 내용: 다양한 값을 가질 수 있음.
- 위치: 24~27번 바이트
- 크기: 4 바이트
- Allocated Size of MFT Entry
- MFT Entry 전체크기를 나타낸다.
- 보통 1024 가 적혀있다. (MFT Entry는 1KB로 고정되어 있음)
- 위치: 28~31번 바이트
- 크기: 4 바이트
- File Reference to Base MFT Entry
- Non-Base MFT Entry의 Base MFT Entry의 위치를 나타낸다.
- File Reference Address로 기록되어 있다.
- Non-Base MFT Entry 에서만 기록된다.
- Base MFT Entry에서는 언제나 0 이다.
- 위치: 32~39번 바이트
- 크기: 8 바이트
(참고)
Base MFT Entry & Non base MFT Entry
- Non Base MFT Entry
- Base MFT Entry의 File Reference Address를 헤더에 기록해 둔다.
- Base MFT Entry
- 헤더에 File Reference Address를 기록하지 않는다.(0이 기록된다.)
- 현재 MFT Entry에 새로운 속성이 기록될 때 사용할 속성ID(고유한 값, 속성 TYPE ID와 다름)
- 위치: 40~41번 바이트
- 크기: 2 바이트
[ Example ]
Attribute(속성)
- 속성 헤더(Header) + 속성 내용(Content)
- Resident 형태의 속성은 내용이 MFT Entry내에 있다
- $FILE_NAME 과 $STANDARD_INFORMATION 속성은 언제나 Resident 형태로만 존재한다.
- Non Resident Flag 값이 0x00 이다.
[ NRF : 0이면 상주, 1이면 비상주, 10 00 00 00 ==> $STANDARD_INFORMATION ]
- Non-resident 형태의 속성의 내용은 클러스터에 들어있고 속성에는 위치만 기록됨.
- 속성의 내용이 MFT Entry에 담기에 너무 큰 경우에 사용된다.
- $DATA, $ATTRIBUTE_LIST와 같은 속성들은 Non-Resident속성을 가질 수 있다.
- Non Resident Flag 값이 0x01이다.
(참고)
Resident & Non-Resident
- Resident 속성
- 속성의 내용이 MFT Entry에 모두 들어가는 경우에 레지던트 속성으로 표시된다.
- Non-Resident 속성
- 속성의 내용이 MFT Entry에 들어가기에 너무 큰 경우에는 별도의 클러스터에 내용을 저장하게 되는데
- 이런 속성을 Non-Resident 속성이라고 한다.
$STANDARD_INFORMATION --> Attribute Type ID : 0x10
$ATTRIBUTE_LIST --> Attribute Type ID : 0x20
$FILE_NAME 속성 --> Attribute Type ID : 0x30
$VOLUME_VERSION --> Attribute Type ID : 0x40
$OBJECT_ID --> Attribute Type ID : 0x40
$SECURITY_DESCRIPTOR --> Attribute Type ID : 0x50
$VOLUME_NAME --> Attribute Type ID : 0x60
$VOLUME_INFORMATION --> Attribute Type ID : 0x70
$DATA --> Attribute Type ID : 0x80
$INDEX_ROOT --> Attribute Type ID : 0x90
$INDEX_ALLOCATION --> Attribute Type ID : 0xA0
$BITMAP --> Attribute Type ID : 0xB0
$SYMBOLIC_LINK --> Attribute Type ID : 0xC0
$REPARSE_POINT --> Attribute Type ID : 0xC0
$EA_INFORMATION --> Attribute Type ID : 0xD0
$EA --> Attribute Type ID : 0xE0
$LOGGED_UTILITY_STREAM --> Attribute Type ID : 0x100
- 파일과 디렉토리에 대한 시간정보/소유자/보안설정/파일종류/할당량 등의 정보를 담는다.
- 모든 파일과 디렉토리에 대한 Base MFT Entry에는 반드시 존재하는 속성
- 속성 타입 번호 : 16(D) = 0x10
- 크기: 보통 72(Byte), 다를 수 있음, 확인 필요
- $STANDARD_INFORMATION의 속성 내용 구조
[ 속성 구조 요약 ]
항목 이름 설명 위치 크기
Created Time 처음으로 파일이 생성된 시간 정보 0~7 8
Modified Time 마지막으로 파일 내용이 수정된 시간 8~15 8 MAC TIME
MFT Modified Time MFT Entry 내용이 마지막으로 수정된 시간 16~23 8
Accessed Time 마지막으로 파일 내용을 접근한 시간 24~31 8
Flags 파일의 특성 32~35 4
Maximum number of version 36~39 4
Version Number 40~43 4
Class ID 44~47 4
Owner ID 파일의 소유자의 ID 48~51 4
Security ID 52~55 4
Quota Charged 56~63 8
Update Sequence Number 64~71 8
Flags
0x0001 읽기전용
0x0002 숨김
0x0004 시스템
0x0020 기록문서(Archive)
0x0040 장치(Device)
0x0080 일반(Normal)
0x0100 임시(Temporary)
0x0200 Sparse
0x0400 Reparse Point
0x0800 압축됨
0x1000 오프라인
0x2000 인덱스에 포함되지 않음
0x4000 암호화됨
- 속성이 많아 여러 개의 MFT Entry에 나뉘어 저장되어 있는 경우에 각각의 속성이 저장되어 있는 MFT Entry의 번호를 기록해 놓은 목록
- Non base MFT Entry가 있는 경우에만 필요한 속성이다.
- 이 속성은 반드시 Base MFT Entry에 있어야 읽을 수 있다.
- 속성 타입 번호 : 32(D) = 0x20
- 저장 형태: Resident 또는 Non-Resident 형태 모두 가능함.
- 파일이나 디렉토리의 이름과 이름에 관련된 추가 정보가 저장되는 속성이다.
- 이 속성은 반드시 Base MFT Entry에 있어야 읽을 수 있다.
- 속성 타입 번호 : 48(D) = 0x30
- 저장 형태: 반드시 Resident 형태만 가능함
- $FILE_NAME의 Attribute Content 구조
위치 크기 설명
0~7 8 부모 디렉토리의 File Reference Address
8~15 8 Created Time
16~23 8 Modified Time
24~31 8 MFT Modified Time
32~39 8 Accessed Time
40~47 8 파일의 할당 크기
0x30~37 8 파일의 실제 크기
56~59 4 Flag
60~63 4 Reparse Value
0x40 1 이름의 길이
0x41 1 이름의 형식
0x42~?? 동적 이름
- 이 속성은 Index Entry에도 존재하며 Index Entry에 있는 $FILE_NAME속성을 우선적으로 갱신한다.
- Flag 항목은 $STANDARD_INFORMATION 속성의 flag와 동일한 구조이다.
- 이름의 형식(Name Space)
- POSIX --> NULL 문자와 "/"문자를 제외한 모든 문자를 사용할 수 있다. 최대 255글자
- Win32 --> NULL 문자와 /\:<>?*|" 를 제외한 모든 문자를 사용할 수 있다. 단 .이나 공백으로 끝날 수 없다.
- DOS --> 길이제한(8.3), 소문자 사용불가, 특수기호 사용불가
- 실제 파일이나 디렉토리의 내용이 저장되는 공간이다.
- 속성 타입 번호 : 128(D) = 0x80
- 저장 형태: 700 Byte를 기점으로 작으면 Resident 형태로 저장되고 크면 Non-Resident 형태로 저장된다.
- Alternate Data Stream
- 파일이나 디렉토리에 추가되는 $DATA 속성
**80000Byte내용으로 timesnews.txt
- Non-Resident 속성인 경우에는 속성 내용(Attribute Contents)은 클러스터에 저장하고 클러스터의 번호를 Cluster Runs 의 형태로 기록해 둔다.
[ 31=>1&3 = 1 : RunLength (14) & 3 : RunOffset (0BCA7E) ]
[ RunLength(얼만큼) RunOffset(어디서부터) ]
- Run List(Cluster Run List)
- 파일의 내용이 들어 있는 클러스터를 Cluster Run의 형태로 표시하는데 클러스터가 이어져 있지 않은 경우에는 Cluster Run이 여러 개를 사용하여 표시한다. 이를 Cluster Run List 라고 부른다.
(참고) offset : 얼만큼 떨어져있는지 --> Offset Runlist ; Runlist에서부터 얼마나 떨어져있는지
- Logical Cluster Number
- Virtual Cluster Number
- 파일의 내용을 담고 있는 첫번째 클러스터부터 계산한 번호