'공부합시다/파일 포맷'에 해당되는 글 4건
- 2009.10.26 PE 파일 분석 3
- 2009.10.09 ID3v2 분석
- 2009.10.08 ID3v2 Frame ID List
- 2009.10.08 MP3 ID3 tag 분석
PE 파일 분석
PE 포맷을 분석하기에 앞서 먼저 PE 포맷이란게 무엇인지 알아볼 필요가 있다. PE 포맷을 위키에서 검색하면 다음과 같이 나온다.
PE 포맷(Portable Excutable)은 마이크로소프트의 윈도 3.1부터 지원되는 실행 파일의 형식을 말한다. 유닉스 COFF(영어: Common Object file format)를 기반으로 나왔으며, PE 포맷을 사용하는 파일의 확장자는 cpl, exe, dll, ocx, vxd, sys, scr, drv가 있다.
다양한 운영 체제에서의 이식성을 보여준다는 뜻에서 이식이 가능한 실행 형식(영어: Portable Excutable)이라는 이름이 붙었다.
PE 형식은 근본적으로 윈도 OS 로더가 감춰진 실행 코드를 다루는 데 있어서 필수적인 정보를 은닉해 주는 자료 구조이다. 이것은 링크와 API 내보내기/가져오기 테이블, 리소스 관리 데이터, 스레드 로컬 장치 데이터들을 포함하는 동적 라이브러리를 포함한다. 확장 펌웨어 인터페이스(EFI)는 EFI 환경에서의 표준 실행 PE 포맷이다.
... 뭐 충분한 설명이 되었다고 생각한다.
1. PE 파일 포맷의 전체 구조
(출처 : http://kkamagui.springnote.com/pages/401262)
붉은 색 부분은 헤더나 데이터가 위치하는 영역의 속성과 크기 등등을 나타내는 정보이고, 푸른 색 부분은 실제 데이터들이 위치하는 영역을 나타낸다.
- IMAGE_DOS_HEADER : PE 파일의 처음에 위치하며 뒷부분에 DOS에서 실행했을 때, 에러 메시지(This program cannot be run in DOS mode)를 표시하는 스텁(Stub) 코드를 포함하고 있음. MAGIC Number와 다음에 오는 IMAGE_NT_HEADER의 위치를 표시
- IMAGE_NT_HEADER : PE 파일 포맷에 대한 정보를 포함. 아래의 두 부분으로 구성
- IMAGE_FILE_HEADER : Section의 수 및 속성과 같은 정보 포함
- IMAGE_OPTIONAL_HEADER : PE 파일에 대한 속성 또는 이미지 베이스와 같은 정보 포함
- Data Directory : 어떤 영역의 Virtual Address와 Size 정보를 포함
- IMAGE_SECTION_HEADER : 섹션에 대한 실질적인 정보를 포함
- Section(섹션) : 실제 데이터가 위치하는 영역
각 영역에 대해 세부적으로 알아보자.
2. IMAGE_DOS_HEADER
이 구조체에서 중요한 부분은 실행파일인지 판단하기 위한 e_magic (MZ로 셋팅) 부분과 다음에 오는 IMAGE_NT_HEADER의 위치를 표시해 주는 e_lfanew 부분이다.
3. IMAGE_NT_HEADER
IMAGE_NT_HEADER는 실제 PE 파일 포맷에 대한 정보를 포함하는 헤더로써 IMAGE_FILE_HEADER와 IMAGE_OPTIONAL_HEADER로 구성된다. Signature는 IMAGE_NT_SIGNATURE 로 <PE00>의 값을 가진다.
4. IMAGE_FILE_HEADER
- Machine : CPU ID를 나타내는데, 간단히 보면 Intel 인지, MIPS 인지 등등의 정보가 들어있음
- NumberOfSections : PE 파일에 포함된 총 섹션의 수를 나타냄
- TimeDateStamp : 컴파일러 또는 링커가 파일을 생성한 시간. 1970년 1월 1일 GMT 기준으로 지나온 초
- PointerToSymbolTable : COFF 파일의 심볼 테이블의 오프셋을 나타냄. 없는 경우가 대부분
- NumberOfSymbols : 심볼의 개수를 나타냄
- SizeOfOptionalHeader : 뒤에 이어서 나오는 Optional Header의 크기를 나타낸다. 32Bit/64Bit에 따라서 그 크기가 다름
- Characteristics : 파일의 특성
Machine에 대한 define 값들은 WinNT.h에 정의 되어있다.
Characteristics에 대한 define 값 역시 WinNT.h에 정의 되어있다.
5. IMAGE_OPTIONAL_HEADER
Optional Header는 PE 파일의 전반적인 내용들에 대한 정보를 포함한다. 중요한 정보만 추리면 다음과 같다.
- Magic : Signature로 32Bit의 경우 0x10b를 가짐
- SizeOfCode : 섹션 중에 IMAGE_SCN_CNT_CODE 속성을 가진 섹션들 전체의 합
- SizeOfInitializedData : 섹션 중에 IMAGE_SCN_CNT_INITIALIZED_DATA 속성을 가진 섹션들 전체의 합
- SizeOfUninitializedData : 섹션 중에 IMAGE_SCN_CNT_UNINITIALIZED_DATA 속성을 가진 섹션들 전체의 합
- AddressOfEntryPoint : Entry Point의 주소. 실제 로더가 제일 먼저 실행할 코드의 시작점
- BaseOfCode : 코드가 시작되는 상대 주소(RVA)
- BaseOfData : 데이터가 시작되는 상대 주소(RVA)
- ImageBase : 이미지가 로딩되는 메모리의 Base 주소. 일반적으로 실행파일의 경우 0x400000(4Mbyte) 위치에 로딩
- SectionAlignment : 섹션이 정렬되는 크기. PE 파일 자체가 메모리 맵 파일이기 때문에 0x1000(4Kbyte) 보다 크거나 같아야 함
- SizeOfImage : 모든 섹션들의 합. 이미지 실행을 위해 메모리를 할당해야 하는 총 크기
- NumberOfRvaAndSizes : 뒤에 오는 DataDirectory의 개수. 무조건 16개
- Data Directory : 총 16개가 있으며 각 항목은 특정 데이터에 대한 정보를 가지고 있음. 뒤에서 설명
6. IMAGE_DATA_DIRECTORY
데이터 디렉토리는 위와 같은 구조로 이루어져있으며 IMAGE_OPTIONAL_HEADER에 총 16개가 있다. 각각에 Index에 대한 define 값은 WinNT.h에 아래와 같이 정의되어있다.
이미지 디렉토리 정보는 굉장히 중요하다. 경우에 따라서 섹션이 합쳐질 수 있기 때문에 통합된 섹션에서 원하는 정보를 찾는 방법은 이미지 디렉토리에 포함된 정보를 이용하는 방법 밖에는 없다. 여러모로 많이 쓰이는 인덱스는 아래와 같은 역할을 한다.
- IMAGE_DIRECTORY_ENTRY_EXPORT : Export 함수들에 대한 Export Table의 시작 위치와 크기를 나타냄
- IMAGE_DIRECTORY_ENTRY_IMPORT : Import 함수들에 대한 Import Table의 시작 위치와 크기를 나타냄
- IMAGE_DIRECTORY_ENTRY_RESOURCE : IMAGE_RESOURCE_DIRECTORY 구조체의 시작 위치를 나타냄
- IMAGE_DIRECTORY_ENTRY_TLS : Thread Local Storage에 대한 포인터
- IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG : IMAGE_LOAD_CONFIG_DIRECTORY 구조체애 대한 포인터
- IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT : IMAGE_BOUND_IMPORT_DESCRIPTOR 구조체의 배열을 가리키는 포인터
- IMAGE_DIRECTORY_ENTRY_IAT : Import Address Table의 시작 위치를 나타냄
7. IMAGE_SECTION_HEADER
PE 헤더의 뒷부분에 연속해서 IMAGE_SECTION_HEADER가 위치하게 된다. 섹션은 뒤에 올 코드나 데이터가 위치하는 영역에 대한 구체적인 정보를 포함하고 있으므로 굉장히 중요하다.
섹션의 개수는 앞서 IMAGE_FILE_HEADER에 포함된 NumberOfSections에서 얻을 수 있으며 해당 개수만큼 얻어오면 된다. IMAGE_SECTION_HEADER는 WinNT.h에 아래와 같이 정의되어있다.
중요한 항목에 대한 의미는 아래와 같다.
- VirtualSize : 실제 코드나 데이터 영역의 크기를 표시
- VirtualAddress : 메모리에 로드되었을 때 RVA를 표시
- SizeOfRawData : VirtualSize의 크기를 IMAGE_OPTIONAL_HEADER에 포함된 FileAlignment의 단위로 올림한 크기
- PointerToRawData : 실제 섹션 데이터가 파일 내에 존재하는 오프셋. Virtual Address와 같을 수도 있고 다를 수도 있음
- Characteristics : 섹션의 속성 표시. 자세한 것은 뒤를 참조
위의 VirtualSize와 SizeOfRawData는 영역의 크기를 나타낸다는 공통점이 있으나 라운드 업된 크기와 실제 크기를 나타낸다는 차이가 있다. 만약 섹션의 크기를 조작했다면 위의 두부분 모두 손을 봐야 한다.
Virtual Address와 Pointer To Raw Data의 값이 다를 수 있다고 했는데, 왜그럴까? 이것은 실행 파일의 크기를 줄이기 위해서이다. 만약 로드 되었을 때 크기가 0x2000 정도인 섹션이 있다고 하자. 그런데 이 섹션은 메모리의 값이 초기화 될 필요도 없고 값도 들어있지 않다면? 실행 시에 영역만 할당해주면 끝이라면? 이런 경우라면 굳이 이 섹션이 실행파일에서 영역을 가지고 있을 필요가 없다. 따라서 Virtual Address는 0이 아닌 값을 갖겠지만 파일 내에 위치를 의미하는 Pointer To Raw Data의 값은 0이 된다.
즉 실제 파일 내에는 존재하지 않는 영역이 생김으로써 Virtual Address와 Pointer To Raw Data의 값이 달라질 수 있으며, 기타 다른 이유로도 충분히 다를 수 있다. 따라서 실행파일을 조작하기위해서는 Pointer To Raw Data의 값을 위주로 작업을 해야 한다.
Characteristics는 해당 영역의 속성을 나타내는데, WinNT.h에 정의되어있고 아주 흥미로운 값을 가지고 있다.
// Section characteristics.
//
// IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
// IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
// IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
// IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
// IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
// IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
// 0x00002000 // Reserved.
// IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section.
#define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP
#define IMAGE_SCN_MEM_FARDATA 0x00008000
// IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
#define IMAGE_SCN_MEM_16BIT 0x00020000
#define IMAGE_SCN_MEM_LOCKED 0x00040000
#define IMAGE_SCN_MEM_PRELOAD 0x00080000
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 //
#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 //
#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 //
#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 //
#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 //
#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 //
#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 //
// Unused 0x00F00000
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
중요한 플래그 별로 의미를 보면 아래와 같다.
- IMAGE_SCN_CNT_CODE : 섹션에 코드가 포함되어있음. IMAGE_SCN_MEM_EXECUTE와 보통 같이 지정됨
- IMAGE_SCN_CNT_INITIALIZED_DATA : 섹션이 초기화된 데이터를 포함하고 있음
- IMAGE_SCN_CNT_UNINITIALIZED_DATA : 섹션이 초기화 되지 않은 데이터를 포함하고 있음
- IMAGE_SCN_MEM_DISCARDABLE : 섹션이 버려질 수 있음. 한번 사용되고 필요없는 섹션들(relocation 데이터 같은 경우)이 이 속성을 가짐
- IMAGE_SCN_MEM_SHARED : 섹션이 이 모듈을 사용하는 모든 프로세스에 의해서 공유될 수 있음을 의미
- IMAGE_SCN_MEM_EXECUTE : 섹션이 실행 가능함
- IMAGE_SCN_MEM_READ : 섹션이 읽기 가능함
- IMAGE_SCN_MEM_WRITE : 섹션이 쓰기 가능함
위 의 값을 보면 섹션에 대한 속성이 미리 정의되어있다는 것을 알 수 있다. 즉 데이터 섹션 같은 경우 IMAGE_SCN_MEM_READ/WRITE 속성을 가지고 있으리라 유추할 수 있고, 코드가 포함된 섹션의 경우 IMAGE_SCN_MEM_EXECUTE 속성을 가지고 있다고 유추할 수 있다.
섹션의 경우 섹션 이름을 가지고 있는데, VC로 실행파일을 만들면 .text, .data, .idata와 같은 이름의 섹션들이 생긴다. 이름 그대로 코드, 데이터와 같은 정보가 포함된 섹션이라는 것을 알 수 있는데, 여기서 속지 말아야 할 것은 섹션 이름은 권장값이므로 섹션 이름으로 섹션이 포함하는 내용을 판단하면 안된다는 것이다. 특히 파일의 크기를 줄이는 릴리즈 옵션 같은 경우는 섹션들이 합쳐져서 하나의 섹션으로 존재하는 경우도 있기 때문에 섹션 이름을 이용해서 찾아서는 안되며 IMAGE_NT_HEADER에 있는 Data Directory의 값을 참조해서 찾도록 해야 한다.
=======================================================================================================
출처 : kkamagui의 프로그래밍 작업실 http://kkamagui.springnote.com/pages/401262
......처음에는 정리하면서 배끼다가 결국 뒤에는 ctrl+c, ctrl+v -ㅅ-;;
'공부합시다 > 파일 포맷' 카테고리의 다른 글
ID3v2 분석 (0) | 2009.10.09 |
---|---|
ID3v2 Frame ID List (0) | 2009.10.08 |
MP3 ID3 tag 분석 (0) | 2009.10.08 |
ID3v2 분석
ID3v2는 중복해서 들어갈 수 있기 때문에 하나만 있을 수도 있고 여러개가 있을 수도 있다. ID3v1은 파일의 끝에 붙는다. 오늘은 ID3v2에 대해 더 자세히 알아보도록 하겠다.
=======================================================================================================
ID3v2 의 구조
ID3v2는 아래와 같은 형식으로 이루어져 있다.
헤더는 ID3v2에 대한 전체적인 정보를 가지고 있고, 각 프레임은 가수, 제목, 앨범, 앨범자켓 이미지등의 정보가 각각의 프레임으로 구성되어 있다.
실제 mp3을 헥스뷰어로 열어봐서 각 바이트별로 분석해보겠다.
=======================================================================================================
ID3v2 헤더(10 bytes)
==========================================================
Byte(Length) Content
==========================================================
0-2(3) Tag Identifier (ID3가 적힌다)
3-4 (2) Tag Version.
5(1) Flags
6-9(4) Size of Tag (Tag의 사이즈)
==========================================================
0x00 ~ 0x02 : ID3라고 되있으므로 이 부분부터는 ID3v2라는 것을 의미한다.
0x03 ~ 0x04 : 4와 0으로 되있으므로 버전이 ID3v2.4.0 임을 의미한다.
0x05 : flag 인데 대부분 0 으로 되있다.
0x06 ~ 0x09 :
tag의 크기인데 중요한것은 이 값이 mp3안에 있는 모든 tag의 크기가 아니라 자신의 크기만이란 것이다. 이 뒤에 ID3으로 시작하는 부분이 또 있을 수 있다. 즉, 위에서 말했듯이 중복해서 들어갈 수 있기 때문에 tag의 총 크기를 구하려면 크기를 누적해서 구해야한다.
또 중요한 것이 있는데 저기 적힌 값은 Encoding 된 값이다. 4바이트 중에 각 바이트의 최상위 비트를 제거하고 붙여주어야 원래 크기가 된다.
실제로 값을 구해보면 00 00 05 13 을 2진수로 표현하면, 0000 0000 , 0000 0000, 0000 0101, 0001 0011 이 된다. 여기서 각 바이트의 최상위 비트를 제거하면 000 0000, 000 0000, 000 0101, 001 0011 이 되고, 이를 한줄로 합치면
0000 0000 0000 0000 0010 1001 0011 = 0x293 가 된다.
그런데 이 값은 헤더의 길이는 포함하지 않은 길이이기 때문에 실제 ID3v2 tag의 길이는 헤더 길이 10바이트를 더해준 0x293 + 10 = 0x29D 가 된다.
=======================================================================================================
ID3v2 프레임(가변 길이)
프레임은 헤더와 내용으로 이루어져있다. 빨간색으로 표시한 부분이 헤더이고, 파란색으로 표시한 부분이 데이터이다.
=============================
- Header
Byte Content
0-3 Frame identifier
4-7 Size
8-9 Flags
=============================
0x0A ~ 0x0D : 프레임의 ID 이다. 이에 대한 자세한 정보는 이전 포스팅에서 다루었다.
TIT2는 Title/songname/content description 즉, 노래 제목이다.
0x0E ~ 0x11 : 프레임의 크기이다. 00 00 00 38 이므로 십진수로 56이다. 이것은 헤더를 제외한 프레임 크기이다.
따라서 헤더를 포함한 프레임의 크기는 헤더 10바이트를 더한 66바이트 이다.
0x12 ~ 0x13 : 플래그인데 보통 0으로 세팅되어 있다.
헤더 뒤부터는 데이터인데 프레임의 크기가 56이므로 되어있었으므로 56바이트의 크기로 TIT2 즉, 노래 제목이 저장되어 있다.
표시된 부분 다음에 보면 다시 TPE1이라고 되있는데 이것을 이전 포스팅에서 찾아보면 가수이름이라고 되있다. 이런식으로 프레임들이 이어져 붙어 있다.
'공부합시다 > 파일 포맷' 카테고리의 다른 글
PE 파일 분석 (3) | 2009.10.26 |
---|---|
ID3v2 Frame ID List (0) | 2009.10.08 |
MP3 ID3 tag 분석 (0) | 2009.10.08 |
ID3v2 Frame ID List
=======================================================================================================
List of Simple Frames
IPLS : Involved people list
MCDI : Music CD identifier
PCNT : Play counter
TALB : Album/Movie/Show title
TBPM : BPM (beats per minute)
TCOM : Composer
TCON : Content type
TCOP : Copyright message
TDAT : Date
TDLY : Playlist delay
TENC : Encoded by
TEXT : Lyricist/Text writer
TFLT : File type
TIME : Time
TIT1 : Content group description
TIT2 : Title/songname/content description
TIT3 : Subtitle/Description refinement
TKEY : Initial key
TLAN : Language(s)
TLEN : Length
TMED : Media type
TOAL : Original album/movie/show title
TOFN : Original filename
TOLY : Original lyricist(s)/text writer(s)
TOPE : Original artist(s)/performer(s)
TORY : Original release year
TOWN : File owner/licensee
TPE1 : Lead performer(s)/Soloist(s)
TPE2 : Band/orchestra/accompaniment
TPE3 : Conductor/performer refinement
TPE4 : Interpreted, remixed, or otherwise modified by
TPOS : Part of a set
TPUB : Publisher
TRCK : Track number/Position in set
TRDA : Recording dates
TRSN : Internet radio station name
TRSO : Internet radio station owner
TSIZ : Size
TSRC : ISRC (international standard recording code)
TSSE : Software/Hardware and settings used for encoding
TYER : Year
WCOM : Commercial information
WCOP : Copyright/Legal information
WOAF : Official audio file webpage
WOAR : Official artist/performer webpage
WOAS : Official audio source webpage
WORS : Official internet radio station homepage
WPAY : Payment
WPUB : Publishers official webpage
=======================================================================================================
List of Complex Frames
AENC : Audio encryption
Keys: URL, Preview start, Preview length
APIC : Attached picture
Keys: MIME type, Picture Type, Description, _Data
COMM : Comments
Keys: Language, short, Text
COMR : Commercial frame
Keys: Price, Valid until, URL, Received as, Name of Seller, Description, MIME type, _Logo
ENCR : Encryption method registration
Keys: Owner ID, Method symbol, _Data
GEOB : General encapsulated object
Keys: MIME type, Filename, Description, _Data
GRID : Group identification registration
Keys: Owner, Symbol, _Data
LINK : Linked information
Keys: _ID, URL, Text
OWNE : Ownership frame
Keys: Price payed, Date of purchase, Text
POPM : Popularimeter
Keys: URL, Rating, _Data
PRIV : Private frame
Keys: Text, _Data
RBUF : Recommended buffer size
Keys: Buffer size, Embedded info flag, Offset to next tag
RVRB : Reverb
Keys: Reverb left (ms), Reverb right (ms), Reverb bounces (left), Reverb bounces (right), Reverb feedback (left to left), Reverb feedback (left to right), Reverb feedback (right to right), Reverb feedback (right to left), Premix left to right, Premix right to left
SYTC : Synchronized tempo codes
Keys: Time Stamp Format, _Data
TXXX : User defined text information frame
Keys: Description, Text
UFID : Unique file identifier
Keys: Text, _Data
USER : Terms of use
Keys: Language, Text
USLT : Unsychronized lyric/text transcription
Keys: Language, Description, Text
WXXX : User defined URL link frame
Keys: Description, URL
=======================================================================================================
List of Other Frames
EQUA : Equalization
ETCO : Event timing codes
MLLT : MPEG location lookup table
POSS : Position synchronisation frame
RVAD : Relative volume adjustment
SYLT : Synchronized lyric/text
... 아 ㅅㅂ 졸라 많어...ㅠ
'공부합시다 > 파일 포맷' 카테고리의 다른 글
PE 파일 분석 (3) | 2009.10.26 |
---|---|
ID3v2 분석 (0) | 2009.10.09 |
MP3 ID3 tag 분석 (0) | 2009.10.08 |
MP3 ID3 tag 분석
ID3는 MP3 파일에서 사용하는 메타 데이터 포맷으로, 음악의 제목, 음악가 이름 등의 음악 파일에 관련된
정보를 담는다. ID3에는 ID3v1과 ID3v2 두 가지의 버전이 있으며, 이들은 서로 호환성이 없으며 하나의 파일
안에 동시에 존재할 수도 있다.
=======================================================================================================
ID3v1
ID3v1은 파일 끝에 128 바이트를 덧붙이는데, 'TAG'라는 문자열로 시작되므로 미디어 플레이어가 쉽게 인식할
수 있다. 초기의 MP3 재생기는 때때로 MPEG 스트림 사이에 삽입된 데이터에 적절히 대응하지 못하고, 재생을
멈추거나 잡음이 튀는 등의 문제가 있었고, 심지어 재생을 못하기도 했다(태그가 파일의 첫 부분에 있는 경우),
이 같은 문제 때문에 태그는 보통 파일의 첫 부분보다는 끝에 삽입됐다.
ID3v1 포맷
오프셋 |
길이 |
설명 |
0 |
3 |
'TAG' 인식문자열 |
3 |
30 |
음악 제목 문자열 |
33 |
30 |
가수(음악가) 문자열 |
63 |
30 |
음반 문자열 |
93 |
4 |
음반 출시년도 문자열 |
97 |
30 |
비고 문자열 |
127 |
1 |
장르 바이트 |
ID3v1.1 포맷
오프셋 |
길이 |
설명 |
0 |
3 |
'TAG' 인식 문자열 |
3 |
30 |
음악 제목 문자열 |
33 |
30 |
가수(음악가) 문자열 |
63 |
30 |
음반 문자열 |
93 |
4 |
음반 출시년도 문자열 |
97 |
28 |
비고 문자열 |
125 |
1 |
바이트 분리자 (항상 0) |
126 |
1 |
곡 번호 바이트 |
127 |
1 |
장르 바이트 |
=======================================================================================================
ID3v2
ID3v1은 그 크기가 128바이트로 정해졌기 때문에, 추가적인 정보를 넣는 것이 거의 불가능했다. 이 문제를
해결하기 위해 Lyric3과 같은 다른 포맷이 제안되기도 하였으며, 마틴 닐슨(Martin Nilsson)이 제안한 ID3v2 태그
포맷도 이런 문제를 극복하였다. ID3v2 태그 포맷은 다음과 같은 특징을 가지고 있다.
* 프로그램이 파일의 끝까지 읽어 들이기 전에 태그 정보를 얻을 수 있기 때문에 스트리밍 파일을 재생할 때 이득이 된다.
* 태그의 길이가 변경될 경우 전체 파일이 재작성되어야 하기 때문에 태그를 쓸 때 효율성 면에서 불리할 수 있다. 이런 이유 때문에 ID3v2 태그 뒤에 적당한 공백을 넣어서, 태그의 길이가 어느 이상 커지지 않으면 전체 파일을 재작성하지 않는 방법을 사용하는 경우도 있다.
* 몇 개의 고정된 필드를 제공했던 ID3v1과는 달리, ID3v2 태그는 포맷이 정형화된 태그 프레임들로 이루어져 있기 때문에 확장하기 용이하다.
* 작사자, 지휘자, 매체 종류, BPM, 가사, 이미지, 볼륨, 잔향 설정, 암호화된 정보 등과 같은 다양한 정보를 넣을 수 있다.
* 태그에 가짜 동기 신호가 삽입되는 것을 방지하기 위한 비동기화(unsynchronisation) 옵션을 제공하기 때문에, ID3v2 태그가 삽입된 MP3 파일은 ID3v2를 지원하지 않는 프로그램에서도 안전하게 재생할 수 있다.
* 태그 전체의 크기는 256MB까지 허용되며 프레임 하나의 크기는 16MB까지 허용된다.
* 유니코드를 지원하므로 국제화된 태그를 이용할 수 있다. 기본적으로 UTF-16 인코딩을 지원하며, 또한 ID3v2.4부터는 UTF-8을 지원한다.
ID3v2에는 다음과 같은 세 가지 버전이 있다. 각 버전들은 구조가 비슷하지만 서로 호환성은 없다.
*ID3v2.3 (1999년): 태그 프레임의 속성을 나타내는 필드가 추가되었으며 확장된 헤더를 제공한다.
*ID3v2.4 (2000년): 확장된 헤더의 구조가 바뀌었고, 푸터를 지원하므로 파일의 끝에도 삽입할 수 있다. 또한 UTF-8 인코딩을 지원한다.
ID3v2는 너무 많은 정보를 하나의 메타 데이터 포맷에 담기 때문에 구현이 힘들다는 단점을 갖고 있다. 예를 들어,
오디오의 길이를 저장하는 TLEN 프레임과 오디오의 인코딩 방법을 저장하는 AENC 프레임 등은 메타 데이터가
담긴 파일을 분석해도 알아 낼 수 있는 정보이며(다만 경우에 따라서 오디오의 길이를 쉽게 알 수 없는 경우는
있다), ID3v2.4에 있는 84개의 프레임이 각각 서로 다른 내부 구조를 갖고 있으며 버전마다 구조가 다른 경우도
있기 때문에 일괄적인 처리가 힘들어진다. APEv2와 같이 나중에 만들어진 메타 데이터 포맷은 내부 구조를
통일하여 이런 문제를 해결한다.
'공부합시다 > 파일 포맷' 카테고리의 다른 글
PE 파일 분석 (3) | 2009.10.26 |
---|---|
ID3v2 분석 (0) | 2009.10.09 |
ID3v2 Frame ID List (0) | 2009.10.08 |