0%

PE 구조 이해하기 - IMAGE_NT_HEADERS 구조

windows 시스템 실행파일의 구조와 원리 책 내용을 요약 및 정리 하는 포스팅이에요.

PE파일의 맨 앞부분에 해당하는 IMAGE_NT_HEADER에 대한 알아볼 거에요.

이 부분은 내용이 길어서 여기서는 간단한 구조체 설명만 할거에요.


PE 파일의 시작

IMAGE_NT_HEADER은 진정한 PE파일의 시작을 알리는 신호이면서, PE에 관계된 많은 부분을 담고 있어요.

이것도 마찬가지로 IMAGE_NT_HEADER도 “WinNT.h” 헤더 파일에 정의되어 있어요.

1
2
3
4
5
6
typedef struct _IMAGE_NT_HEADERS
{
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADER32, *PIMAGE_NT_HEADER32;

여기서 DWORD 형인 Signature 필드는 PE 파일을 나타내는 매직넘버에요. 이 값도 마찬가지로 “WinNT.h” 헤더 파일에 정의되어 있어요.

1
2
3
4
5
#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ
#define IMAGE_OS2_SIGNATURE 0x454E // NE
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
#define IMAGE_VXD_SIGNATURE 0x454C // LE
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00

PE 파일임을 확인하는 방법?

PE 파일을 확인하는 방법은 아주 간단해요.
IMAGE_DOS_HEADER 구조체의 마지막 필드인 e_lfanew가 가리키는 값만큼 파일 포인터를 이동시켜 그 오프셋부터 DWORD형으로 값을 읽고, 그 값을 IMAGE_NT_SIGNAUTRE 매크로 상수와 비교하기만 하면 되요.


마지막으로…

IMAGE_NT_HEADER 구조체는 매직넘버 필드뿐만 아니라, PE에 관계된 부분을 설명해주는 다른 구조체들도 포함되어 있어요. IMAGE_FILE_HEADERIMAGE_OPTIONAL_HEADER 에요.

여기서는 IMAGE_NT_HEADERS 중에서 32비트용 IMAGE_NT_HEADER32를 설명을 했어요. 64비트용 IMAGE_NT_HEADER64도 있다는 것을 잊지 마세요!
그리고 이 구조체에 필드로 들어있는 IMAGE_OPTIONAL_HEADERS 도 32비트용인 IMAGE_OPTIONAL_HEADER32, 64비트용인 IMAGE_OPTIONAL_HEADER64가 있어요.

32비트용과 64비트용은 별다른 차이가 없어요.
대부분의 구조가 거의 같기 때문에 32비트용을 완벽하게 이해하고 차후에 64비트용에서 쓰이는 부분과 바뀐 부분만 체크하면 되요






참고자료


IMAGE_NT_HEADER32
IMAGE_NT_HEADER64