Misc

REC-PE구조 간단하게 살펴보기

Ani Gil 2018. 12. 13. 23:38

Ani Gil

PE구조 살피기

 

 

 

 

IMAGE_DOS_HEADR

EXEDLLWin Hex, Hewin 등으로 열어서 봤을 때 가장 맨 처음 부분에 해당하는 버퍼이고 무수히 많은 멤버가 존재하고 파일의 맨 처음부분에 해당한다.

또한 첫 번째 필드인 e_magic 과 마지막 e_lfanew 만 여겨 보면 된다.

 

e_magic : 현재 파일이 PE파일인지 체크하는 용도이다.

MZ (5A4D)의 값을 가지고 있고 여기서 MZPE를 개발한 Mark Zbikowski의 약어다.

e_lfanew : IMAGE_NT_HEADER의 구조체 위치를 알아내는데 사용되는 값 이다. 실질적인 PE의 오프셋이 어딘지 이 필드를 통해 지정하게 됨.

PIMAGE_NT_HEADERS 사용을 위한 준비작업이다.

 

 

IMAGE_NT_HEADER

PE\0\0을 표시하는 4바이트 값(50 45 00 00)이 되고 PE파일임일 표시하는 용도이다. (사실상 무시해도 무관함)

 

 

IMAGE_FILE_HEADER

이 구조체는 파일을 실행하기 위한 가장 기본적인 데이터가 담겨있는 구조체라고 할 수 있다.

주요필드는 Machine, NuberOfSections, TimeDateStamp, SizeOfOptionalHeader, Characteristics 이다. [겁나 어려움]

 

Machine : 어떤 CPU에서 이 파일이 실행되는지 알려준다.

일반적인 컴퓨터/노트북 이면 넘어가도된다.

 

NumberOfSections : 섹션이 몇 개 있는지 알려준다. 이 필드의 섹션의 개수는 4이며, .text, .rdatz, .data, .rsrc 이다.

섹션? .text.data 같은 코드/데이터 섹션을 일컫는다.

 

TimeDateStamp : 이 파일을 빌드한 날짜를 알려준다.

 

SizeOFOptionalHeader : IMAGE_OPTIONAL_HEADER32의 구조체 크기를 알려준다. PE Lode에서는 이 값을 먼저 확인하고 위의 구조체

HEADER32을 처리한다.

 

Characteristics : 현재 파일이 어떤 형식인지 알려준다. 예를 들어서 EXE 파일, DLL파일 등 구분하는 용도로만 생각하면된다.

 

 

IMAGE_OPTIONAL_HEADER

PE 구조체중 중요한 값을 가장 많이 담긴 구조체에 대해서 알아보자.

 

Magic : 표식이다. 32bit0x10B, 64bit0x20B가 된다.

 

SizeOfCode : 코드 양의 전체 크기를 가리킨다.

 

MajorLinkerVersion, MinorLinkerVersion : 어떤 버전의 컴파일러로 빌드했는지 알려준다. DevVIsual Studio

 

ImageBase : 실제 가상 메모리에 올라가는 번지를 가르킨다.

대부분 0x400000 번지로 된다. DLL0x10000000 번지이다.

 

 

 

AddressOfEntryPoint : 엔트리 포인트를 말한다. Image Base와 더하면 시작지점의 값이 나온다.

 

BaseOfCode : 실제 코드가 실행되는 번지이다. Image Base와 더한 값부터 시작된다. 특별한 일이 없는 한 0x1000 으로 지정되어 있다.

 

SectionAlignment, FileAlignment : 각 섹션을 정렬하기 위한 저장 단위 이다. ) .text800byte 라면 SectionAlignment0x1000 이므로 1000-800 = 200byte0으로 채워지고 다음 섹션이 나온다.

 

SizeOfImage : EXE/DLL () 메모리에 로딩됐을 때의 전체 크기이다.

로더가 이 필드를 보고 메모리의 공간을 확보하게 된다. 이 값은 반드시 Sechin Algnment의 배수가 된다.

 

SizeOfHeaders : PE 헤더의 크기를 알려주는 필드이다.

 

SubSystem : 이 프로그램이 GUI인지 CUI인지 알려주는 역할을 한다.

0x1 : *.sys 같은 드라이버모듈, 0x2 : GUI, 0x3 : CUI

 

DataDirectory : IMAGE_DATA_DIRECOTORY의 구조체로서

VitualAddressSize라는 필드가 포함돼 있다. 익스포트 디렉터리나

임포트 디렉터리, 리소스디렉터리, IAT 각각의 가상 주소와 크기를

이 필드를 통해 알 수 있다. 또한

IMAGE_NUMBEROF_DIRECTORY_ENTRIES16으로 정의되어있다.

 

IMGE_SECTION_HEADER : 주로 각 섹션에 대한 이름을 비롯하여,

시작 주소와 사이즈 등의 정보를 관리하는 구조체 이다. 우리가 말하는

코드섹션, 데이터섹션 등을 구할 수 있다.