지금까지 NTFS에 대한 개념과 파일시스템 참조 모델을 기준으로 여러가지를 알아 보았는데 이 개념들과 정보들을 혼합해서 이해하려고 할때에는 조금 무리가 있다.
그래서 이 글에서는 지금까지 공부한 지식으로 NTFS에서 파일이 어떻게 할당되고 삭제 되는지에 대하여 이야기 해 볼것이다.
일단 파일 생성부터 살펴보자.
2. 파일 할당을 위하여 MFT 엔트리를 할당 해야 하는데 파일시스템은 이때 비 할당 엔트리를 찾기 위해 $MFT 파일의 $BITMAP 속성을 참조하여 해석을 시도한다. 해석이 끝나면 비 할당 엔트리를 찾게 되는데 찾은 엔트리를 새로운 파일에 할당하고 $MFT 파일의 해당 엔트리 비트맵을 1로 설정한다.
3. 파일에 할당 된 엔트리의 MFT 내부에서의 위치를 구한 후 파일에 할당한 엔트리가 예전에 다른 파일에 할당 되었던 엔트리 일지도 모르니 엔트리를 초기화 한다. 초기화 후 기본적인 속성들을 엔트리내에 생성하고 시간 값은 현재 시간으로 업데이트 한다.
4. 이번에는 파일에 클러스터를 할당 하기 위해 MFT 일곱 번째 엔트리($BITMAP)을 해석하여 클러스터를 할당한다.
해당 시나리오에서 할당하려는 파일의 크기가 클러스터보다 크므로 2개의 클러스터가 필요하다. 클러스터를 찾을 때 할당 알고리즘으로는 "자동 맞춤" 알고리즘을 사용하여 연속적인 2개의 클러스터를 찾아 $DATA 속성에 할당한다. 그 후 $BITMAP 파일에서 해당 클러스터의 비트맵 값을 1로 설정한다. 그리고 MFT 엔트리가 수정되어 파일 수정 시간이 업데이트 된다.
5. 파일 이름 엔트리를 디렉토리 인덱스에 추가 하기 위해 파일이 할당 될 디렉토리를 MFT 여섯 번째 엔트리(.)를 참조하여 찾는다. 그 후 파일 이름 엔트리를 디렉토리 인덱스에 추가하고 디렉토리에 접근하였으므로 마지막 접근 시간이 업데이트 된다.
6. 찾은 dir1의 엔트리인 MFT 엔트리 200에 새로운 인덱스 엔트리를 생성하여 File.txt에 할당한다. 이때 트리의 노드들은 재 정렬이 될수도 있다. 그 후 File.txt의 시간 값들이 업데이트 되고, 디렉토리의 타임스탬프들 또한 업데이트 된다.
* 참고 : 만약 NTFS 시스템에 디스크 할당이나, 저널링 기능이 활성화 되어 있다면 $Quota 파일이나 $UsrJrnl 파일 인덱스에 엔트리들이 생성되었을 것이다.
* 참고 : 위 이미지에는 표시되어 있지 않지만, dir1 디렉토리 $BITMAP 속성에 지워진 엔트리에 해당하는 비트가 1에서 0으로 변경된다.
5. $BITMAP 파일의 $DATA 속성에 File.txt에 해당하는 엔트리 비트를 1에서 0으로 설정하여 MFT 엔트리를 비 할당 상태로 변경한다.
6. 이제 마지막으로 File.txt 파일의 MFT 엔트리 $DATA 속성에 할당 된 클러스터를 할당 해제 하기 위하여 $BITMAP 파일의 해당 클러스터 비트를 1에서 0으로 변경한다.
* 참고 : 파일 이름이 지워지지 않은 것은 MFT 엔트리가 비 할당 상태일 뿐 속성 내용은 보존되어 있기 때문이다.
* 참고 : 위 이미지에는 화살표들이 지워져 포인터까지 삭제되어 있는 것 처럼 보이지만, 윈도우는 포인터를 삭제하지 않는다. 이미지는 할당 상태를 보여주기 위해 화살표를 지운 것 뿐이다.
그래서 이 글에서는 지금까지 공부한 지식으로 NTFS에서 파일이 어떻게 할당되고 삭제 되는지에 대하여 이야기 해 볼것이다.
일단 파일 생성부터 살펴보자.
[할당]
현재 설명할 NTFS의 기본 레이아웃은 파일이 할당 될 dir1 디렉토리가 이미 존재하며, 클러스터가 2048byte 크기이며, 할당할 파일(File.txt)의 크기는 4000byte이다.
1. 먼저 파일시스템이 첫 번째 섹터를 읽고 부트 섹터의 클러스터 크기, MFT 시작 주소, MFT 엔트리들의 크기를 정한다. 그 후 MFT 첫 번째 엔트리($MFT)를 참조하고 $MFT 파일의 $DATA 속성을 읽어 나머지 MFT 엔트리의 레이아웃을 결정한다.
[그림 1 - 1번 과정]
2. 파일 할당을 위하여 MFT 엔트리를 할당 해야 하는데 파일시스템은 이때 비 할당 엔트리를 찾기 위해 $MFT 파일의 $BITMAP 속성을 참조하여 해석을 시도한다. 해석이 끝나면 비 할당 엔트리를 찾게 되는데 찾은 엔트리를 새로운 파일에 할당하고 $MFT 파일의 해당 엔트리 비트맵을 1로 설정한다.
[그림 2 - 2번 과정]
3. 파일에 할당 된 엔트리의 MFT 내부에서의 위치를 구한 후 파일에 할당한 엔트리가 예전에 다른 파일에 할당 되었던 엔트리 일지도 모르니 엔트리를 초기화 한다. 초기화 후 기본적인 속성들을 엔트리내에 생성하고 시간 값은 현재 시간으로 업데이트 한다.
[그림 3 - 3번 과정]
4. 이번에는 파일에 클러스터를 할당 하기 위해 MFT 일곱 번째 엔트리($BITMAP)을 해석하여 클러스터를 할당한다.
해당 시나리오에서 할당하려는 파일의 크기가 클러스터보다 크므로 2개의 클러스터가 필요하다. 클러스터를 찾을 때 할당 알고리즘으로는 "자동 맞춤" 알고리즘을 사용하여 연속적인 2개의 클러스터를 찾아 $DATA 속성에 할당한다. 그 후 $BITMAP 파일에서 해당 클러스터의 비트맵 값을 1로 설정한다. 그리고 MFT 엔트리가 수정되어 파일 수정 시간이 업데이트 된다.
[그림 4 - 4번 과정]
5. 파일 이름 엔트리를 디렉토리 인덱스에 추가 하기 위해 파일이 할당 될 디렉토리를 MFT 여섯 번째 엔트리(.)를 참조하여 찾는다. 그 후 파일 이름 엔트리를 디렉토리 인덱스에 추가하고 디렉토리에 접근하였으므로 마지막 접근 시간이 업데이트 된다.
[그림 5 - 5번 과정]
6. 찾은 dir1의 엔트리인 MFT 엔트리 200에 새로운 인덱스 엔트리를 생성하여 File.txt에 할당한다. 이때 트리의 노드들은 재 정렬이 될수도 있다. 그 후 File.txt의 시간 값들이 업데이트 되고, 디렉토리의 타임스탬프들 또한 업데이트 된다.
[그림 6 - 6번 과정]
* 참고 : 만약 NTFS 시스템에 디스크 할당이나, 저널링 기능이 활성화 되어 있다면 $Quota 파일이나 $UsrJrnl 파일 인덱스에 엔트리들이 생성되었을 것이다.
[삭제]
삭제 시나리오의 NTFS 레이아웃은 위 생성 기본 레이아웃과 동일하며 비슷한 과정은 그림을 따로 첨부하지 않겠다.
1. 생성 과정에서 1번 과정과 동일하다.
2. dir1 디렉토리를 찾기 위해 MFT 여섯 번째 엔트리(.)를 참조하여 인덱스를 조사한다. 이때 dir 디렉토리의 마지막 접근시간이 업데이트 된다.
3. dir1 디렉토리를 찾은 후 dir1 디렉토리의 인덱스를 조사하여 File.txt를 찾는다.
4. dir1 디렉토리 인덱스에서 File.txt 엔트리를 제거한다. 이때 노드들은 정렬 될 수도 있으며, 디렉토리의 타임스탬프 값은 업데이트 된다.
[그림 7 - 4번 과정]
* 참고 : 위 이미지에는 표시되어 있지 않지만, dir1 디렉토리 $BITMAP 속성에 지워진 엔트리에 해당하는 비트가 1에서 0으로 변경된다.
5. $BITMAP 파일의 $DATA 속성에 File.txt에 해당하는 엔트리 비트를 1에서 0으로 설정하여 MFT 엔트리를 비 할당 상태로 변경한다.
[그림 8 - 5번 과정]
6. 이제 마지막으로 File.txt 파일의 MFT 엔트리 $DATA 속성에 할당 된 클러스터를 할당 해제 하기 위하여 $BITMAP 파일의 해당 클러스터 비트를 1에서 0으로 변경한다.
[그림 9 - 6번 과정]
* 참고 : 파일 이름이 지워지지 않은 것은 MFT 엔트리가 비 할당 상태일 뿐 속성 내용은 보존되어 있기 때문이다.
* 참고 : 위 이미지에는 화살표들이 지워져 포인터까지 삭제되어 있는 것 처럼 보이지만, 윈도우는 포인터를 삭제하지 않는다. 이미지는 할당 상태를 보여주기 위해 화살표를 지운 것 뿐이다.
'[+] Forensic' 카테고리의 다른 글
File System - NTFS (14) (0) | 2012.02.15 |
---|---|
File System - NTFS (13) (0) | 2012.02.15 |
File System - NTFS (11) (0) | 2012.02.13 |
File System - NTFS (10) (0) | 2012.02.13 |