PE File Structure

2018. 4. 10. 00:19악성코드 분석




EXE나 DLL파일 실행시 개발자가 만든 코드가 실행되기 전에 PE의 정보부터 읽어와서 바이너리를 메모리에 올리기 위한 각종 데이터를 설정하는 작업을 한다.

PE는 파일이 실행되기 위한 정보가 기록된 것


PE 구조 ( 32bit 환경 )

[ IMAGE_DOS_HEADER ]

e_magic - 현재 파일이 PE파일인지 체크한다 ( * MZ헤더를 통해 MS-DOS의 시작을 알린다 )

e_lfanew - IMAGE_NT_HEADER 구조체의 위치를 가리킨다


[ IMAGE_NT_HEADER ]

SIGNATURE    ( 변수 ) - PE\0\0

IMAGE_FILE_HEADER    ( 구조체 )

IMAGE_OPTIONAL_HEADER    ( 구조체 )


[ IMAGE_FILE_HEDAER ]

* Machine (2byte) :  어떤 CPU에서 이 파일이 실행될 수 있는지를 알려준다 ( 데스크톱이나 노트북은 별로 눈여겨볼 필요 없다 )

* NumberOfSection (2byte) : 보통 .text , .rdata, .data, .rsrc 4개의 섹션의 개수를 가리키지만 패킹이나 프로텍팅에 의해서 증가할 수 있다.

* TimeDateStamp (4byte) : obj파일이 컴파일러를 통해 exe파일로 생성한 시간 ( 델파이 => 항상 1992년 )

* SizeOfOptionalHeader (2byte) : IMAGE_OPTIONAL_HEADER 구조체 크기

* Characteristics (2byte) : 현재 파일이 DLL인지 EXE인지 구분하는 용도


[ IMAGE_OPTIONAL_HEADER ]

* Magic (2byte) : 32bit => 0x10B , 64bit => 0x20B

* Major&Minor LinkerVersion : 1byte씩 어떤 버전으로 컴파일 되어졌는지

* SizeOfCode (4byte) : 코드 양의 전체 크기, 코드 섹션의 무결성 검사수행시 사용

* AddressOfEntryPoint (4byte) : 메모리에서 실제 파일이 실행되는 시작 지점

* BaseOfCode (4byte) : 실제 코드가 실행되는 번지라고 할 수 있다. 

ImageBase + BaseOfCode = 코드영역이 시작되는 베이스 주소

* ImageBase (4byte)

- 해당 파일이실행될 경우, 실제 가상메모리에 올라가는 번지, 보통 exe파일의 경우 0x40000000이 된다.

- PE파일이 실제 메모리의 번지에 매핑되는 번지주소


ImageBase + AddressOfEntryPoint = OllyDBG 등 디버거를 통해 파일을 실행했을 때 위치가 첫 실행지점이 된다

ImageBase + BaseOfCode = 코드 영역이 시작되는 베이스 주소



* Section&File Alignment (각 4byte) : 섹션 정렬에 대한 최소단위 ( .text ~ .rdata 사이의 간격지정 )

* SizeOfImage ( 4byte )

- EXE/DLL이 메모리에 로딩됐을 때의 전체크기

- 로더가 PE를 메모리에 올릴 때해당 필드를 보고 이 공간만큼 할당

* SizeOfHeader ( 4byte ) : PE헤더의 크기를 알려주는 필드

* Subsystem : 이 프로그램이 GUI인지 console인지 알려주는 역할 ( 0x2 - windows GUI , 0x3 : console )

* DataDirectory 구조체 ( VirtualAddress , Size 필드를 포함 )

export&import*resource directory, IAT 등 각각의 가상주소와 크기를 알 수 있다

( IAT : Import Address Table )


*  32bit환경에서의 DataDirectory 

각종 DLL파일들의 이름들이 무작위 나열되어 있다.

데이터들은 IMPORT Name Table에서 정리된다


DLL파일이름들이 정리되어 있음


DLL파일들과 각 데이터들의 주소가 매치되어 있음



[ IMAGE_SECTION_HEADER ]

각 섹션에 대한 이름, 시작주소와 사이즈 등의 정보를 관리하는 구조체








'악성코드 분석' 카테고리의 다른 글

FSG 수동언패킹 [ Lena21 ]  (0) 2018.04.14
Upack 수동언패킹 [ Lena21 ]  (0) 2018.04.14
UPX 수동언패킹 [ Lena 21 ]  (0) 2018.04.10
Packing & Unpacking  (0) 2018.04.10
어셈블리어 정리 ( cmp & TEST & ZF & CF )  (0) 2018.04.04