PE 구조(PE Header) – 실행 흐름

앞서 프로그램을 분석하기 위해서는 실행파일 구조인 PE 구조를 이해하여야 한다고 했다.

PE 구조 역시 하나의 파일 포맷이라고 할 수 있다. 우리가 익히 잘 알고 있는 ZIP이라는 확장자가 압축 파일을 의미하고 ZIP라는 파일 구조로 생성되어 있듯이, PE 구조란 운영체제가 인식할 수 있는 실행 가능한 파일의 포맷 구조이다.

PE 파일 포맷은 운영체제에서 정의한 파일 포맷으로 Portable Executable의 약자이다.

PE 파일 포맷의 구조만 가지고도 책 한 권을 쓸 수 있는 분량이기에 여기서는 필요한 정보만 다르며, 더 깊이 있게 공부해보고 싶으신 분은 MSDN과 관련 책들을 참고하기 바란다.

 

우리가 흔히 윈도우에서 접하는 확장자 중 PE 파일 포맷으로 작성된 파일의 확장자로는 EXE, SCR, DLL, OCX, SYS, OBJ가 있으며, 직접 실행 가능한 EXE를 제외한 나머지 파일 종류 중 OBJ를 제외하고는 간접적(서비스, 디버깅, 레지스트리 등에 의해)으로 실행이 가능한 파일들이다. 다음 그림은 PE 파일의 전체 구조를 요약한 것이다.

 

[그림] PE 구조

 

다른 곳에서 제공하는 그림과 약간 모양이 다를 수 있지만, 필수 Header들은 동일하다. 위 왼쪽의 그림은 파일 상태의 그림으로 필수로 있어야 하는 부분이다.

그리고 데이터의 순서는 Dos Header를 시작으로 PE Header, Section Table 순서로 구성되어 있다.

그리고 파일 상태와 메모리 상태의 제일 큰 차이점은 메모리 로드시 파일에서 각 영역 크기에 따른 빈 공간이 존재한다. 그에 반해 파일에서는 4바이트~8바이트 가량을 Null Padding(인식하지 않는 공간으로 내용을 채움)을 통해 영역 구분할 수 있도록 되어 있다. 제일 중요한 구조체에 대해 굵게 표시하였다. 이 책에서도 위 두 개의 구조체를 집중적으로 분석할 것이다.

 

그럼 헥사(HEX) 에디터인 HxD를 이용하여, 실행파일의 초기 헥사 데이터를 확인해보자.

 

[그림] 처음 Dos Header이후 Null Padding을 통해 다음 구조체인 PE 구조와 구분된다

 

앞서 PE 구조의 오른쪽 그림의 메모리에 로딩되었을 때 빈 공간이 생성되는 것은 파일에서는 Offset으로 메모리는 VA(Virtual Address)로 표현하는데, Section 크기와 위치를 PE Header에 로드될 메모리 위치를 지정하게 되어 있다. 그리고 PE 구조에 보면 지정할 수 있는 최소 기본 단위에 맞춰 메모리에 위치하기 때문에 실제 파일 공간보다 크고 위치가 변경되게 된다.

PE 구조의 많은 구조체들이 있는데 많은 분석가들이 DOS Header 그리고, NT Header (앞서 PE 구조의 그림에서 PE Header부분으로 구분을 위해 앞으로 NT Header로 표기), Sections Table을 합쳐서 PE Header라고 부르며 그 다음에 위치한 섹션(Section)들을 PE Body라고 한다.

 

그리고 실행파일을 실행하였을 때, PE Header의 동작 흐름은 다음과 같다.

 

[그림] PE 구조의 실행 흐름

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.