PE FILE의 구조
- PE Header
DOS Header
DOS stub
NT header
Section header
- PE Body
코드
데이터
리소스
VA & RVA
VA : 프로세스 가상 메모리의 절대주소
RVA : ImageBase에서부터의 상대 주소를 말합니다.
RVA + ImageBase = VA
- 파일에서는 offset 으로, 메모리에서는 VA(Virtual Address)로 위치를 표현합니다..
- PE Header의 끝부분과 각 Section들의 끝에는 NULL padding 영역이 존재한다. 컴퓨터는 파일, 메모리, 네트워크 패킷등을 처리할때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데 PE파일에도 같은 개념이 적용됩니다.
PE Hedaer
DOS Header
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; //DOS signature : 4D5A("MZ")
...
...
LONG e_lfanew; //offset to NT header
}
- 모든 PE 파일은 시작부분에 "MZ"가 필수적으로 존재
- e_lfanew가 가리키는 위치에 NT header의 OffSet이 표시
*NT header의 offset을 나타내는 E0는 Little-endian 방식이기에 000000E0로 읽어야 합니다.
DOS stub
Dos Header의 밑에 존재하며 필수적이지 않은 존재로 지워도 지장이 없습니다.
(사람에 비유하면 손톱과 같은 존재)
*붉게 표시된 부분은 16Bit 어셈블리명령어이기에 32bit 윈도우즈에서는 명령어가 실행되지 않는다
(PE파일로 인식되기에 무시된다.)
하지만 실행시킬수 있는 방법이 있는데 바로
*DOS환경에서 실행,
*DOS용 디버거를 이용해 실행가능(DOS EXE파일로 인식되기에)
즉,notepad.exe는 32bit용 PE파일이지만, DOS 환경에서 실행할 경우에도 같은 문자열이 출력이 된다.
다시말해 DOS환경에서는 16bit DOS용 코드가,Windows환경에서는 32bit Windows코드가 각각 실행된다.
**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다. 자세한건 Reversecore로 가시는게 더 좋습니다.
'Reversing > Theory' 카테고리의 다른 글
PE File Format 0x04 (0) | 2015.01.13 |
---|---|
IDA PRO 단축키 (0) | 2015.01.13 |
PE FILE Format 0x03 (0) | 2015.01.10 |
PE FILE Format 0x02 (0) | 2015.01.09 |
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가? (3) | 2015.01.08 |