Linux/Linux_technic

File - 파일종류 확인

sosal 2009. 10. 22. 18:09
/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


file 명령어를 이용하면 임의의 파일이 무엇인지 조사할 수 있습니다.
윈도우에선 파일 확장자를 정해 두고 파일명을 통해 그 종류를 추측하는 방법을 사용합니다.
하지만 리눅스에서는 확장자가 존재하지 않기 때문에, 임의의 파일의 종류를 알기 위해선
이 명령어가 필요하게 됩니다.

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

-i 옵션을 주면 MIME 미디어 타입 문자열로 표시됩니다. ( 사람에게 더 읽기 쉬운 string 타입)

file 명령은 다음 순서에 따라서 파일 종류를 판별합니다.
  • 디바이스, 디렉토리, 심볼릭 링크 등의 스페셜 파일
  • 압축 파일 체크
  • tar 파일 테크
  • magic 데이터베이스 파일에 따른 체크
  • ASCII, Unicode 등의 텍스트 파일 종류 체크

위의 어떤 경우에도 해당하지 않으면 단순 바이너리 파일로 판단합니다.
magic 데이터베이스에는 시그니처(데이터) 정보가 기록되어 있습니다.
file 명령어는 파일 내용을 읽어 magic 데이터베이스 안에 있는
정보들을 이용하여 파일의 종류를 구분합니다.
/etc/magic 또는 usr/share/file/magic, usr/share/misc/magic 등의 파일에 저장됩니다.
이후에 나타나는 새로운 파일magic 데이터베이스를 추가만 해주면
그에 해당하는 file 정보를 추가로 나타낼 수 있습니다.

 // 다양한 옵션과 서식들은 man file 을 참조하세요.


위 그림은 magic 데이터베이스 안에 저장되어진 elf 파일에 대한 내용입니다.
elf 파일 포멧에 대한 내용은 포함하지 않겠습니다.

magic 파일의 엔트리는 4개의 필드로 구성되어있습니다.

  • 레벨의 offset 값.
  • 데이터 종류
  • 출력 문자열

레벨은 offset 값 앞에 적힌 '>' 를 의미합니다.
'>10' 이라고 적혀있다면, 처음부터 10바이트 떨어진 위치를 읽고 비교합니다.

elf 파일에 대하여 file 명령 자신을 판별하는 예를 들어보겠습니다.

0  string   \177ELF   ELF
파일의 처음부터 0바이트 떨어진 위치의 문자열이 \177ELF 와 일치하는지 확인
-> 일치하므로 ELF 표시

>4  byte  0  invalid class
파일의 처음부터 4바이트 떨어진 위치의 1바이트가 0임을 확인
-> 일치하지 않음으로 다음 행으로 이동

>4  byte  1  32-bit
처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인
->일치하므로 32-bit 라고 표시

이런식으로 elf 파일에 대한 정보를 확인하여 봅니다.
이 글의 맨위의 그림을 다시 한번 볼까요?
elf 파일에 대한 file명령어입니다.

magic 데이터베이스 elf 테이블의 맨 처음 0 string \177ELF 를 만족하였기 때문에 ELF를 출력했군요
그 뒤로 32-bit...~~ excutable 까지 elf 테이블의 모든 내용을 출력하고 콤마로 닫습니다.
그 뒤로는 시스템에 대한 파일의 정보인데, 이 역시 magic 테이블에서 가져오게 됩니다.


정리

file 명령을 사용하면 파일 내용으로부터 파일 종류를 판별할 수 있습니다.
또한 새로운 파일 형식이 생겨나도 magic 데이터베이스에 원하는 내용을 추가해준다면
그 파일을 인식할 수 있도록 사용자가 수정 가능합니다.

'Linux > Linux_technic' 카테고리의 다른 글

Object file - ELF 파일  (0) 2009.10.23
od - 바이너리 파일 덤프  (0) 2009.10.23
커널 분석기 Vi + ctags + cscope  (4) 2009.10.01
Boot loader - LILO와 GRUB  (0) 2009.09.27
01. Linux 기본 명령어, 권한  (1) 2009.09.26