PE 파일 포맷은 COFF(Common Object File Format)라는 포맷을 계승한 파일 포맷으로, COFF의 확장판이라고 보면 된다. COFF 포맷은 MS에서 사용하던 이전 버전의 여러 실행 파일뿐만 아니라 라이브러리 파일, OBJ 파일에 대한 공통 포맷을 제공한다.
이 PE 파일 포맷은 64bit 경우 PE+라고도 하지만, 기본적으로 PE 파일 포맷을 바탕으로 한다.
IMAGE_XX_XXXX 형태의 명칭들은 모두 WinNT.h 헤더 파일에 정의된 구조체다.
PE 파일은 처음에 MZ로 시작하는 IMAGE_DOC_HEADER 구조체로 시작해서 도스와의 호환을 위한 코드인 도스 스텁을 담고 있다. 이 스텁 다음부터 실제 PE 포맷이 시작된다.
실질적인 PE 포맷의 시작은 IMAGE_NT_HEADERS라는 구조체로 정의된 헤더로 표현된다.
IMAGE_NT_HEADERS는 'PE' 시그니처를 시작으로 차례대로 IMAGE_FILE_HEADER와 IMAGE_OPTIONAL_HEADER 구조체로 구성된다.
IMAGE_FILE_HEADER는 PE 파일의 파일 정보를 나타내고,
IMAGE_OPTIONAL_HEADER는 이름과 달리 전혀 선택적이지 않은 PE 파일이 메모리에 로드될 때 필요한 중요한 정보를 담고 있다.
이 IMAGE_OPTIONAL_HEADER 내에는 기본 필드들과 함께 주요 섹션과 정보의 위치 및 크기를 나타내는 IMAGE_DATA_DIRECTORY 구조체의 배열이 존재한다.
그리고 IMAGE_OPTIONAL_HEADER 구조체에 이어 섹션 헤더라 불리는 IMAGE_SECTION_HEADER 구조체의 배열이 펼쳐진다.
여기까지가 PE 파일의 헤더에 해당되며, 이 헤더 다음부터 실제 내용들, 즉 코드, 데이터들이 섹션(Section)이라는 블록 단위로 각각 저장된다.
이 섹션의 시작 위치와 크기, 그리고 속성을 담고 있는 헤더가 IMAGE_SECTION_HEADER 구조체며, 이 구조체의 배열이 '섹션 헤더 테이블'이 된다. 섹션 헤더가 가리키는 각각의 섹션은 그 종류에 따라 자체 포맷을 갖는다.
대표적으로 실행 코드를 담고 있는 .text 섹션, 전역 데이터들을 담고 있는 .data 섹션, 그리고 가져오기 함수/변수와 내보내기 함수 또는 변수에 대한 정보를 담고 있는 .idata, .edata 섹션, 대화상자나 아이콘, 메뉴 등의 리소스 데이터의 내용을 담고 있는 .rsrc 섹션 등이 있다.
'리버싱 > 윈도우 리버싱' 카테고리의 다른 글
RVA와 섹션 (0) | 2021.01.21 |
---|---|
PE 파일 (0) | 2021.01.17 |
WinDbg, mona세팅 (구/신 버전 다 있음) (0) | 2021.01.01 |
WinDbg Preview (0) | 2020.12.31 |
디버깅 환경 (0) | 2020.12.29 |