PE

카테고리 없음 2014. 10. 29. 14:38
반응형

미루고 미루던  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_HEADERSizeOfOPTionalHeader32 값을 보고 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

 

 

 

          

 

 

반응형
,