2019-01-03
- NTFS 구조
[ MTF * SP Cluster + 2048 = 6293504 ]
[ 짧은 제목과 내용 ]
[ 짧은 제목, 긴 제목, 내용 ]
MFT(Master File Table)
- MFT란
- MFT Entry들의 모음
- MFT의 시작위치는 BR에서 확인한다.
- MFT의 크기는 볼륨에 있는 파일과 디렉토리의 개수에 비례한다.
- 파일이나 디렉토리는 기본적으로 한개의 MFT Entry를 사용한다.
- 기록할 속성이 많아지면 MFT Entry를 더 사용하기도 한다.
- 예)볼륨에 파일과 디렉토리의 개수가 60000개일 때 MFT Entry개수는 대략 60000개 이상 차지한다.
- 60000 * 1KB = 60000 KB = 약 60 MB
- MFT Entry
- 파일 또는 디렉토리에 대한 정보를 담고 있다.파일명,크기,시간,파일내용,위치,권한,할당량 ...
- 기본적으로 파일이나 디렉토리는 하나의 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
- 크기가 42 bytes
- Signature
- MFT Entry임을 나타내는 표시이다.
- 위치: 0~3번 바이트
- 크기: 4 Bytes
- 정상 Entry에는 FILE 이라는 문자열이 적혀있다.
- 문제가 발견된 Entry에는 BAAD라고 적혀있다.
- Offset of Fixup Array
- 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 등이다.
- 파일 내용이 들어가는 클러스터의 섹터에는 적용하지 않는다.
- Count of Fixup Values
- Fixup 배열(Array)의 크기(항목의 개수)
- MFT Entry는 기본적으로 3이다.
- MFT Entry가 1KB이므로 섹터 2개를 사용 + Signature가 1개 항목 사용
- 위치: 6~7번 바이트
- 크기: 2 바이트
- $LogFile Sequence Number(LSN)
- 설명은 뒤에서 다시 다룬다.
- 내용은 다양한 값을 가질 수 있다.
- 위치: 8~15번 바이트
- 크기: 8 바이트
- Sequence Value
- 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 이 된다.
- Hard Link Count
- 하드 링크의 개수
- 보통 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
- Flags
- MFT Entry의 상태정보
- 내용이 0x1 이면 MFT Entry가 사용 중임을 나타낸다.
- 내용이 0x2 이면 MFT Entry가 디렉토리에 사용되고 있음을 나타낸다.
- 위치: 22~23번 바이트
- 크기: 2 바이트
- Used Size of MFT Entry
- 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이 기록된다.)
- Next Attribute ID
- 현재 MFT Entry에 새로운 속성이 기록될 때 사용할 속성ID(고유한 값, 속성 TYPE ID와 다름)
- 위치: 40~41번 바이트
- 크기: 2 바이트
[ Example ]
Attribute(속성)
- 구성
- 속성 헤더(Header) + 속성 내용(Content)
- 속성 헤더 구조 (Resident)
- Resident 형태의 속성은 내용이 MFT Entry내에 있다
- $FILE_NAME 과 $STANDARD_INFORMATION 속성은 언제나 Resident 형태로만 존재한다.
- Non Resident Flag 값이 0x00 이다.
[ NRF : 0이면 상주, 1이면 비상주, 10 00 00 00 ==> $STANDARD_INFORMATION ]
- 속성 헤더 구조 (Non-Resident)
- 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 속성이라고 한다.
- 속성 종류(Attribute Type)
$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
- $STANDARD_INFORMATION
- 파일과 디렉토리에 대한 시간정보/소유자/보안설정/파일종류/할당량 등의 정보를 담는다.
- 모든 파일과 디렉토리에 대한 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 설정값
Flags 0x0001 읽기전용
0x0002 숨김
0x0004 시스템
0x0020 기록문서(Archive)
0x0040 장치(Device)
0x0080 일반(Normal)
0x0100 임시(Temporary)
0x0200 Sparse
0x0400 Reparse Point
0x0800 압축됨
0x1000 오프라인
0x2000 인덱스에 포함되지 않음
0x4000 암호화됨
- Sparse
- 파일 내용의 대부분이 0인 파일
- $ATTRIBUTE_LIST
- 속성이 많아 여러 개의 MFT Entry에 나뉘어 저장되어 있는 경우에 각각의 속성이 저장되어 있는 MFT Entry의 번호를 기록해 놓은 목록
- Non base MFT Entry가 있는 경우에만 필요한 속성이다.
- 이 속성은 반드시 Base MFT Entry에 있어야 읽을 수 있다.
- 속성 타입 번호 : 32(D) = 0x20
- 저장 형태: Resident 또는 Non-Resident 형태 모두 가능함.
- $FILE_NAME
- 파일이나 디렉토리의 이름과 이름에 관련된 추가 정보가 저장되는 속성이다.
- 이 속성은 반드시 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), 소문자 사용불가, 특수기호 사용불가
- $DATA
- 실제 파일이나 디렉토리의 내용이 저장되는 공간이다.
- 속성 타입 번호 : 128(D) = 0x80
- 저장 형태: 700 Byte를 기점으로 작으면 Resident 형태로 저장되고 크면 Non-Resident 형태로 저장된다.
- $DATA속성의 ADS 항목
- Alternate Data Stream
- 파일이나 디렉토리에 추가되는 $DATA 속성
**80000Byte내용으로 timesnews.txt
- Cluster Runs
- 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에서부터 얼마나 떨어져있는지
- LCN & VCN
- Logical Cluster Number
- 파티션의 첫번째 클러스터부터 계산한 번호
- Virtual Cluster Number
- 파일의 내용을 담고 있는 첫번째 클러스터부터 계산한 번호
No comments:
Post a Comment