1. LFN 분석


LFN( Long File Name )은 SFN과 달리 파일의 이름을 255자까지 사용할 수 있다.

LFN 파일을 만들기 전에 우선 LFN의 구조부터 알아보자.


Seq Num : Sequence Number로 순서가 있으며, 이 순서대로 파일의 이름을 적용한다. 시작 번호는 0x01이고 마지막 번호에는 0x40이 OR된 값이 오며, 이 값을 보고 마지막 LFN임을 판단한다.

Name 1 : 1~5 번째 문자열을 기록한다. 유니코드로 기록하며 한 문자에 2바이트를 차지한다.

Attribute : 이 값은 항상 0x0F로 고정되어 있다.

Type : 항상 0x00으로 채워져 있다.

CheckSum : 해당 LFN과 대응되는 SFN의 체크섬이 저장된다.

Name 2 : 6 ~ 11 번째 문자열을 기록한다.

First Cluster Low : 반드시 0이 들어간다.

Name 3 : 12 ~ 13번째 문자열을 기록한다.


실제로 파일명이 긴 파일을 하나 생성해 보면 Directory Entry는 다음과 같다.

* 파일은 'HelloMyFriendImp3rio.txt'로 한다.

제일 아래를 보면 SFN이 있고 그 위로 LFN이 오는 것을 볼 수 있다.

그리고 LFN은 위로 가면서 Seq Num이 증가하며 마지막 LFN은 0x42임을 알 수 있다.


우선 이를 분석해 보도록 하자.

SFN을 보면 파일 명이 'HELLOM~1' 임을 알 수 있다. 파일명의 길이가 8자 이상일 경우 파일명의 앞 6자리 + '~1'이 붙는다.

LFN을 보면 처음에 Seq Num이 오고, 2바이트씩 파일명이 온다. 속성 값은 0x0F, Type 값은 0x00 체크섬은 0x8B로 되어 있다.

LFN에서 이 세 값과 First Cluster 값이 다르거나 이상하면 인식되지 않는다.


LFN에서 CheckSum은 SFN을 이용하며 그 방법은 아래와 같다.

① 'HELLOM~1TXT'의 각 문자를 2진수로 표현한다.

② 'H' 문자의 2진수 값을 오른쪽으로 Shift한다.

③ 다음 문자인 'E'의 2진수 값과 더한다.

④ 결과 값을 오른쪽으로 Shift한다.

⑤ ③과 ④를 마지막 문자까지 반복한다.

⑥ 결과 값을 16진수로 표현한다.


* LFN CheckSum을 구하는 프로그램

LFN_CheckSum.py

> 해당 파일은 python 2.7 버전으로 만든 것이다. 실행하면 다음과 같이 결과를 확인할 수 있다.


2. LFN 실습


분석을 한 결과를 응용해서 HxD 에디터로 LFN 파일을 생성해보자.

파일은 'goodbymyfriendImp3rio.txt' 로 한다.

파일을 만들기 위해 수정해야 하는 부분을 살펴보면 다음과 같다.

- FSINFO에서 남은 클러스터 수와 다음에 사용할 클러스터를 수정한다. ( Option )

- FAT #1 수정한다.

- Root Directory Entry에서 SFN과 LFN을 추가한다.

- 실제 데이터가 들어있어야 하는 섹터로 이동해 데이터를 넣는다.

* FSINFO를 수정하는 것은 선택사항이기 때문에 본 실습에서는 하지 않는다.


위의 과정을 수행하면 파일이 생성이 되고 파일을 읽을 수 있다.

하지만 어느 하나 잘못 입력하거나 값이 다르면 LFN으로 인식되지 않는다.


그럼 실습을 해보자.

> FAT #1 을 수정한다.

* FAT #1의 위치는 다음과 같이 찾을 수 있다.

RS( Reserved Sector ) F6 19( Little Endian ) ==> 6,646

Hidden 80 00 00 00( Little Endian ) ==> 128

RS + Hidden = 6,774


> Root Directory를 수정한다.

* LFN에서 CheckSum을 구하기 위해 위 파이썬 파일을 이용한다.

구한 CheckSum 값을 이용해 다음과 같이 수정한다.

* 파일명을 다 입력한 뒤 남은 Name 부분은 'FF'로 채워준다.


데이터를 넣기 위해서 만든 파일의 시작 위치를 구한다.

0E 00 ==> 14

(14-2) * 4( SP ) = 48

8320 + 48 = 8368

8368섹터를 위와 같이 수정한다.


그리고 vhd를 마운트 시켜서 탐색기로 보게 되면 다음과 같이 파일이 존재하는 것을 확인할 수 있고

파일 또한 제대로 열리는 것을 확인할 수 있다.



Posted by Imp3rio