2011. 6. 29. 16:22

♧ file 명령을 이용해서 파일 내용, 종류를 조사.

일반적으로 파일 종류를 알기 위해 확장자를 정해 두고 그 종류를 추측하는 방법을 사용하지만,

file 명령은 파일 내용을 읽어 특징적인 데이터(시그니처)를 찾아 그 종류를 결정.

   

[ 일반적인 file 명령 ]

$ file /usr/bin/file

/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs),

for GNU/Linux 2.6.15, stripped

[ -i옵션 : MIME 미디어 타입 문자열로 표시 ]

$ file -i /usr/bin/file

/usr/bin/file: application/x-executable; charset=binary

 

[ file명령이 파일 종류를 판별 하는 순서]

① 디바이스, 디렉토리, 심볼릭 링크 등의 스페셜 파일 체크
② 압축 파일 체크
③ tar 파일 체크
④ magic 데이터베이스 파일에 따른 체크
⑤ ASCII, Unicode 등의 텍스트 파일 종류 체크

위의 어떤 경우에도 해당하지 않으면 단순 바이너리 파일로 판단.

   

[ magic 데이터베이스에는 시그니처 정보가 기록 ]

♧ magic 파일 경로

⊙ /etc/magic
⊙ /usr/share/misc/file/magic (/usr/share/file/magic)

   

♧ magic 파일 내용 ( ※ 현재 집에 설치되어 있는 "Ubuntu 10.04.2 LTS"로 테스트)

   

♧ magic 파일의 엔트리는 4개의 필드로 구성

처음 혹은 이전 레벨로부터의 오프셋 값

데이터 종류

출력 문자열

 

⊙ 여기서 레벨은 오프셋 값의 앞에 적힌 '>'을 의미.

'>4'이라고 적혀 있으면, 다시 처음부터 4바이트 떨어진 위치를 읽고 비교.

⊙ 같은 수의 '>'가 나열되어 잇는 경우.

같은 방식으로 이전 레벨로부터의 오프셋 값에 해당 하는 내용을 보고 진행

⊙ '일치한 엔트리 앞에 '>'가 하나 더 많은('>>') 엔트리가 있으면 계속해서 그 엔트리에 대한 일치처리.

 

[ 앞서 살펴본 elf파일에 대한 file 명령 자신을 판별하는 순서. ]

0     string     \177ELF     ELF

파일의 처음부터 0바이트 떨어진 위치의 문자열이 "\177ELF"와 일치하는지 확인.

→ 일치하므로 "ELF"라고 표시

>4    byte       0           invalid calss

처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인.

→ 일치하지 않으므로 다음 행으로 이동.

>4    byte       1           32-bit

처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인.

→ 일치하므로 "32-bit"라고 표시

④ 이후 당분간 일치하지 않으므로 계속 진행.

>5    byte       1           LSB

처음에서부터 5바이트 떨어진 위치의 1바이트가 1임을 확인.

→ 일치하므로 "LSB"라고 표시.

⑥ 이 과정을 끝까지 반복.

 

[ 정리 ]

file 명령을 사용하면 파일 내용으로부터 파일 종류를 판별할 수 있다.
또한 새로운 파일 형식이 생겨나도 그 파일의 고유한 시그니처를 알면
magic 파일에 엔트리를 추가하여 그 파일을 인식할 수 있도록 되어 있다.

(※ 자세한 내용은 man magic 참조)

Posted by devanix