미루고 미루던 PE 공부를 시작햇습니다
우선적으로 PE 헤더부분을 외우고 있는데 섹션헤더도 나중에 추가적으로 정리해 올리도록 하던지 하겟습니다
(주석을 안달아 놓은 파라메터들은 아직 찾아보지 않은 것들입니다. 추후 수정하도록 하겟습니다 )
PE
-CFF(Common Object File Format)
-PE32+,PE64+
-실행 계열 : EXE, SCR
-드라이버 계열: SYS,VXD
-라이브러리 계열:DLL, OCX,CPL,DRV
-오브젝트파일 :OBJ
~>오브젝트 파일을 제외한 모든것은 실행가능한 파일
PE 헤더~>파일을 실행하기 위해필요한 모든정보가 적혀 있다
~>구조체 형식
~>VA,RVA,Image Base
<Structure>
~>섹션헤더: 각 섹션에 대한 파일/메모리에서의 크기,위치,속성등이 정의되어 있음
~>파일/메모리에서 섹션의 시작 위치는 각 파일/메모리의 최소 기본단위의 배수에 해당하는 위치여야 하고, 빈공간은 NULL Padding
~>32bit(0x00000000~0xFFFFFFFF)
●IMAGE_DOS_HEADER(Size: 40)
~> DOS 파일에 대한 하위 호환성을 고려해 만든 구조체
Typedef struct _IMAGE_DOS_HEADER{
WORD e_magic;
//Dos Signature(4D5A => “MZ”)
WORD e_cblp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp
WORD e_csum;
WORD e_lp;
WORD e_cb;
WORD e_lfarlc;
WORD e_orno;
WORD e_res[4];
WORD e_oemid;
WORD e_res2[10];
WORD e_lfanew;
//offset to NT HEADER (파일에 따라 가변적)
//e_lfanew 값이 가리키는 위치에 NT Header(IMAGE_NT_HEADER) //구조체가 존재
}IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER
●MS-DOS Stub Program
~>존재 여부 : 옵션,크기 일정 x(없어도 파일의 실행에 문제 x)
~>코드와 데이터의 혼합으로 이루어짐
●IMAGE_NT_HEADER
~>Signature, IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER
typedef struct _IMAGE_NT_HEADERS{
DWORD signature ;;
//PE Signature 50 40 00 00 ( “PE”00 )
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}IMAGE_NT_HEADER32, *PIMAGE_NT_HEADER32;
//크기: F8(Decimal: 248 byte)
◎IMAGE_FILE_HEADER FileHeader
~>파일의 개략적인 속성을 나타내는 IMAGE_FILE_HEADER 구조체
Typedef struct _IMAGE_FILE_HEADER{
WORD Machine;
//CPU의 고유값 ex)intel x86 호환 칩은 14c
WORD NumberOfSections;
//코드, 데이터, 리소스 섹션등의 섹션개수
//반드시 0보다 커야하며, 정의된 섹션개수와 실제 섹션이 다르면
//실행 에러가 발생
DWORD TimeDateStamp;
//해당 파일의 빌드시간(실행에 영향을 미치지 않음,개발 도구마//다 다름
DWORD PointerToSymbolTable;
DOWRD NumberOfSymbol;
WORD SizeOfOptionalHeader;
//IMAGE_OPTION_HEADER32 구조체의 크기를 나타냄
WORD Characteristics;
//파일의 속성을 나타내는 값, 실행이 가능한 형태인지 혹은 DLL //파일인지 등의 정보들을 ‘bit OR’ 형식으로 나타냄
}IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER
~>IMAGE_OPTIONAL_HEADER32는 C언어의 구조체이기 때문에 크기가 이미 결정되어 있다
~>Windows의 PE로더는 IMAGE_FILE_HEADER의SizeOfOPTionalHeader32 값을 보고 IMAGE_OPTIONAL_HEADER32구조체 크기를 인식한다.
~>IMAGE_DOS_HEADER의 e_lfanew 멤버와 IMAGE_FILE_HEADER의 SizeOfOptionalHeader 멤버때문에 일반적인 PE 파일형식을 벗어나는 꽈배기 PE 파일(PE Patch)를 만들수 있다
+)어떻게?
◎IMAGE_OPTIONAL_HEADER
~>PE헤더 구조체 중에 가장 크기가 큰 IMAGE_OPTIONAL_HEADER32
typedef struct _IMAGE_DATA_DIRECTROY{
DWORD VirtualAddress;
DWORD Size;
}IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
typedef struct _IMAGE_OPTIONAL_HEADER{
WORD Magic; //IMAGE_OPTIONAL32~>10B(267), 20B(523)
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint; //EP의 RVA 저장(최초로 실행되는 코드의 시작주소)
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
//PE파일이 로딩되는 시작주소를 나타냄(EXE:0x00400000 DLL:0x10000000)
DWORD SectionAlignment;
//파일에서 섹션의 최소단위 :FileAlignment 메모리에서의 섹션 최소단위: SectionAlignment)
//하나의 파일에서 FileAlignment/SectionAlignment값은 같을수도, 다를수도 있다
// 파일/메모리의 섹션크기는 반드시 각 Alignment의 배수가 되어야 한다
DWORD FileAlignment;
WORD MajorOperatinSystemVersion;
WORD MinorOperatingSystemversion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubSystemVersion;
WORD MinorSubSystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
//PE 파일이 메모리에 로딩되었을때 가상 메모리에서 PE IMAGE가 차지하는 크기
//일반적으로 파일의 크기와 메모리에 로딩된 크기는 다르다
//각 섹션의 로딩 위치와 메모리 점유 크기는 섹션헤더에 정의되어 있음
DWORD SizeOfHeader;
//PE헤더의 전체크기( FileAlignment의 배수가 되어야 한다)
//파일 시작에서 SizeOFHeader옵셋 만큼 떨어진 위치에 첫번째 섹션이 위치한다
DWORD CheckSum;
WORD SubSystem;// .sys .exe .dll 구분가능 1:드라이버 2. GUI 3.CUI
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
//IMAGE_OPTIONAL_HEADER32 구조체의 마지막 멤버인 _DATA_DIRECTORY 배열의 개수를 나타
//냄
//※구조체 정의에는 분명 배열 개수가 정의되어있지만 PE로더는 이것을 보고 배열의 크기를 인
//식한다(즉 두값이 다를 수도 있다는 의미
IMAGE_DATA_DIRECTORY DataDirectory [IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
}IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTINAL_HEADER32;
♣IMAGE_DATA_DIRECTORY DataDirectory [IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
[Data Directory 구조체 배열]
~> Directory : “어떤 구조체의 배열”
Data Directory[0] =Export Directory
Data Directory[1] =Import Directory
Data Directory[2] = RESOURCE Directory
Data Directory[3] = EXCEPTION Directory
Data Directory[4] = SECURITY Directory
Data Directory[5] = BASERELOC Directory
Data Directory[6] = DEBUG Directory
Data Directory[7] = COPYRIGHT Directory
Data Directory[8] = GLOBALPTR Directory
Data Directory[9] = TLS Directory
Data Directory[A] = LOAD_CONFIG Directory
Data Directory[B] = BOUND_IMPORT Directory
Data Directory[C] = IAT Directory
Data Directory[D] = DELAY_IMPORT Directory
Data Directory[E] = COM_DESCRIPTOR Directory
Data Directory[F] = Reserved Directory