UB의 포맷은 (의외로?) 대단히 단순하다.

사용자 삽입 이미지

fat_header는 단 2개의 32비트 정수로 이루어진 구조체다.
struct fat_header
   {
uint32_t magic;
uint32_t nfat_arch;
};
magic은 이름에서 짐작하듯이 매직 넘버다. Big Endian에서는 0xCAFEBABE, Little Endian에서는 0xBEBAFECA. 읽어들일 때는 ntohl 따위를 써 주는 편이 좋겠다. 내부에 포함된 Mach-O 포맷(Mac OSX의 진짜 실행파일 포맷)은 엔디안에 따라 저장되는 모양새가 다르지만, UB 헤더는 무조건 Big Endian으로 저장된다. 따라서 인텔 CPU처럼 리틀 엔디안을 쓴다면 ntohl 함수 등을 써서 원래 값으로 복구해 주는 편이 좋다.
nfat_arch는 해당 UB가 지원하는 아키텍처 갯수를 표시한다. 요즘 UB는 대개 2겠지(PowerPC, Intel). 이론적으로는 3 이상이 될 가능성도 얼마든지 있으니 조심.

그 다음으로 이어지는 것은 총 20바이트 크기인 fat_arch 구조체의 리스트다. 절대 2개 고정이 아니며 nfat_arch에 써있는 갯수만큼 나열된다.
struct fat_arch
{
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t offset;
uint32_t size;
uint32_t align;
};
뭐.. 설명이 굳이 필요하려나.
offset은 해당 코드가 시작되는 절대위치(파일 시작위치가 0이라고 봤을 때)이므로 주의.
align의 의미는

..잘 모르겠다.

이것은 원문
align

The power of 2 alignment for the offset of the object file for the architecture specified in cputype within the binary. This is required to ensure that, if this binary is changed, the contents it retains are correctly aligned for virtual memory paging and other uses.

아무튼 OSX의 진짜 코드는 executable 자리를 차지하고있는 Mach-O 파일포맷을 분석해야 얻을 수 있다. UB는 포장일 뿐이지. 음하하






크리에이티브 커먼즈 라이센스
Creative Commons License
2009/09/25 18:14 2009/09/25 18:14
Posted by 호빵
TAG

트랙백 주소
http://hoppang.net/tc/trackback/50

댓글을 달아 주세요

[로그인][오픈아이디란?]