Chapter 3-1. PE(Portable Executable) 분석
개인 공부용이므로 내용이 부실할 수 있습니다!
Section 1. PE(Portable Executable)분석
-> PE파일 포맷은 윈도우에 해당하는 파일 포맷으로 .exe, .dll, .cpl, .sys, .scr, .drv, .vxd, .ocx 확장자를 가진 파일들에게서 볼 수 있다. 윈도우에서 이 실행파일들을 IMAGE라는 명칭으로 구조체를 칭한다.
(DOS 영역, PE Header 영역, Section Header 영역, Section 영역)->
▶ DOS 영역
-> 윈도우 실행파일을 Dos 환경에서 실행하려고 할 때 사용자에게 에러를 보여줌 그러나 윈도우에서 DOS영역에서 실행하는 경우는 많지는 않음
▷ DOS MZ Header
1. e_magic : 이 구조체 멤버는 DOS MZ Header 맨 앞에 위치하고 ‘4D 5A’값을 가지고 아스키코드로 ‘MZ’라는 값을 가진다.
2. e_lfanew : 이 구조체 멤버는 PE파일의 머리인 IMAGE_NT_HEADER를 가리키는 오프셋을 가지고 있다.
▷ DOS Stub Program
-> DOS 모드에서 윈도우 응용프로그램을 실행했을 때 아래와 같은 문구를 출력한다.
‘This Program connot be run is DOS mode’
▶ PE Header 영역
-> PE 파일의 시작 부분으로서 PE File Signature, PE File Header, PE File Optional Header 영역이 있다.
▷ PE File Signature
-> PE 영역의 시작을 알리는 시그니처를 가지고 있다. ‘PE/0/0(0x50/0x45/0x00/0x00)’이다.
▷ PE File Header
-> 실행 파일 자체의 메타데이터를 가지고 있다. 길이는 20바이트이다.
구조체로는 IMAGE_FILE_HEADER 구조체를 가지고 있으며 아래 그림과 같은 오프셋을 가지고 있다. (오프셋의 자세한 값들은 책을 보자)
▷ RVA(Relative Virtual Address)
-> 가상메모리의 맵핑된 이후의 오프셋 값. 프로세스는 코드와 데이터가 가상메모리에 매핑이 되는데 이때 시작 지점이 BASE Address 가 되고 그 이후에 RVA(가상 오프셋)을 더해주어야 가상 주소가 된다.
가상 주소 = 베이스 주소 + RVA
▷ PE File Optional Header
-> 실행 파일의 실행정보가 담긴 부분
Standard Fields, NT Additional Fields, IMAGE_DATA_DIRECTORY를 가진다.
▶ Section
▷ Section Header
-> 각 섹션이 필요한 메타데이터와 메모리에 로드될 때 필요한 정보들을 저장하고 있다.
▷ .text 섹션
-> 실행파일의 소스코드가 들어있는 섹션으로, 초기화되거나 초기화되지 않은 변수, import와 export 테이블 정보를 제외한 나머지 소스코드들이 저장되어 있다. 섹션의 위치와 크기는 섹션헤더를 참고하면 알 수 있다.
▷ .data 섹션
-> .data 섹션은 읽기/쓰기가 가능한 일반적인 데이터를 위한 섹션으로, 정적변수와 전역변수가 저장된다.
▷ .rdata 섹션
-> 읽기전용 섹션으로 상수와 배열로 직접 정의된 문자열과 런타임 라이브러리에서 사용하는 에러 메시지 등이 저장된다.
▷ .idata, .edata 섹션
-> import table, export table이 들어있음
▷ .reloc 섹션
-> PE 파일이 메모리상에 로드 될 때 재배치에 관해 참조하는 정보가 들어있는 섹션, DLL 파일의 경우 메모리에 로드시 재배치를 염두하고 있어서 이 섹션이 없으면 실행이 되지 않을 수 있다. 실행파일들은 필요로 하지 않을 수 있음