Ani Gil의
PE구조 살피기
IMAGE_DOS_HEADR
EXE나 DLL을 Win Hex, Hewin 등으로 열어서 봤을 때 가장 맨 처음 부분에 해당하는 버퍼이고 무수히 많은 멤버가 존재하고 파일의 맨 처음부분에 해당한다.
또한 첫 번째 필드인 e_magic 과 마지막 e_lfanew 만 여겨 보면 된다.
e_magic : 현재 파일이 PE파일인지 체크하는 용도이다.
MZ (5A4D)의 값을 가지고 있고 여기서 MZ는 PE를 개발한 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 : 표식이다. 32bit는 0x10B, 64bit는 0x20B가 된다.
SizeOfCode : 코드 양의 전체 크기를 가리킨다.
MajorLinkerVersion, MinorLinkerVersion : 어떤 버전의 컴파일러로 빌드했는지 알려준다. Dev나 VIsual Studio 등
ImageBase : 실제 가상 메모리에 올라가는 번지를 가르킨다.
대부분 0x400000 번지로 된다. 단 DLL은 0x10000000 번지이다.
AddressOfEntryPoint : 엔트리 포인트를 말한다. Image Base와 더하면 시작지점의 값이 나온다.
BaseOfCode : 실제 코드가 실행되는 번지이다. Image Base와 더한 값부터 시작된다. 특별한 일이 없는 한 0x1000 으로 지정되어 있다.
SectionAlignment, FileAlignment : 각 섹션을 정렬하기 위한 저장 단위 이다. 예) .text가 800byte 라면 SectionAlignment는 0x1000 이므로 1000-800 = 200byte는 0으로 채워지고 다음 섹션이 나온다.
SizeOfImage : EXE/DLL 이(가) 메모리에 로딩됐을 때의 전체 크기이다.
로더가 이 필드를 보고 메모리의 공간을 확보하게 된다. 이 값은 반드시 Sechin Algnment의 배수가 된다.
SizeOfHeaders : PE 헤더의 크기를 알려주는 필드이다.
SubSystem : 이 프로그램이 GUI인지 CUI인지 알려주는 역할을 한다.
0x1 : *.sys 같은 드라이버모듈, 0x2 : GUI, 0x3 : CUI
DataDirectory : IMAGE_DATA_DIRECOTORY의 구조체로서
VitualAddress와 Size라는 필드가 포함돼 있다. 익스포트 디렉터리나
임포트 디렉터리, 리소스디렉터리, IAT 등 각각의 가상 주소와 크기를
이 필드를 통해 알 수 있다. 또한
IMAGE_NUMBEROF_DIRECTORY_ENTRIES는 16으로 정의되어있다.
IMGE_SECTION_HEADER : 주로 각 섹션에 대한 이름을 비롯하여,
시작 주소와 사이즈 등의 정보를 관리하는 구조체 이다. 우리가 말하는
코드섹션, 데이터섹션 등을 구할 수 있다.
'Misc' 카테고리의 다른 글
2과제 스크립트와 파일들 (0) | 2021.10.05 |
---|---|
Flask install & CodeDeploy Agent install (0) | 2021.10.05 |
2020 전국기능경기대회 IT네트워크시스템 기초 1과제 해설 (0) | 2021.08.29 |
2019 전국기능경기대회 IT네트워크시스템 기초 1과제 해설 (5) | 2020.12.01 |