Portable Executable 파일 종류 : .exe, .dll, .drv, .scr, .obj 등..

[[## PE 관련 프로그램 ##]]
DumpBin.exe : Visual Studio 명령프롬프트에 있는 콘솔 프로그램
PEview : PE 구조를 볼 수 있음. (가벼움)
PEBrowse : PE 구조를 볼 수 있음. (다양한 기능, .NET 버전 등..)
ImageHelp 라이브러리 : PE 조작을 위한 library

PEView로 PEView.exe를 본 모습. (Value 맨 앞에 "MZ"로 시작한다.)



[[## PE 과련 책 ##]]
패킷 분석하듯이 PE를 조목조목 뜯어보며 설명한 책 :

마치 패킷 구조 하나씩 뜯어보는 식으로 PE에 대해 매우 상세히 적은 책이다. 그래서인지 못보겠다.
구조 잘 알면 헥사편집기로 살살 고쳐버리기도 가능할 거 같은데... 실용적인 곳이 어딜지 모르겠다.

PE 포멧 설명이 포함되어 있는 책 (9장정도 분량이다.) :




[[## PE 구조 ##]]
------------------------------------------------------------------------ 
IMAGE_DOS_HEADER : "MZ"(0x4D, 0x5A)로 시작하는 도스 stub
------------------------------------------------------------------------
IMAGE_NT_HEADERS : PE 포멧의 시작
Signature : "PE"(0x50, 0x45) 값을 갖음
IMAGE_FILE_HEADER : PE 파일 정보
IMAGE_OPTIONAL_HEADER : PE 파일이 메모리에 로드될 때 필요한 모든 정보(선택적이지 않음)
IMAGE_DATA_DIRECTORY: 주요 섹션들과 정보들의 위치와 크기 정보
-------------------------------------------------------------------------
IMAGE_SECTION_HEADER [배열] : 섹션 테이블이라고도 부름. 각 섹션에 대한 위치와 크기 속성 정보.
SECTION [배열] : 섹션별 실제 데이터가 저장되는 섹션
-------------------------------------------------------------------------
**. IMAGE_XXXX_XXXX 구조체는 WinNT.h에 정의되어있음.
**. .NET의 PE는 구조다 다름.



[[## 관련 용어 ##]]
RVA (Relative Virtual Address)PE 파일이 가상 주소공간 내에 로드되었을 때 PE의 시작 주소에 대한 상대적 주소(offset)
실제 주소(가상주소) = 이미지 로드 시작 번지(IMAGE_OPTIONAL_HEADER 의 ImageBase 필드) + RVA

VAS (Virtual Address Space) : Virtual Memory Manager가 4GB의 실제 Hard Disk와 연결시켜 준 공간.(PageFile.sys 파일)
VMM (Virtual Memory Manager) : paging file, RAM, VAS를 관리하면서 프로세서에게 4GB의 메모리 공간을 갖고 있는 것 처럼 만들어 준다.
MMF (Memory Mapped File) : 페이징 파일(PageFile.sys)을 사용하지 않고 해당 파일 자체가 페이징 파일 역할을 하는 파일.
다음 API를 통해 직접 MMF를 만들 수 있다.
1. CreateFileMapping()
2. MapViewOfFile() or MapViewOfFileEx()
3. UnmapViewOfFile()


[[## SECTION의 종류 ##]]
.text SECTION (코드) : 프로그램 코드.
.data SECTION (데이터) : 초기화된 전역변수. 읽기/쓰기 가능.
.rdata SECTION (데이터) : 문자열, C++/COM 가상함수 테이블, 상수, 런타임 라이브러리에서 사용하는 에러 메세지 등. 읽기 전용
.textbss SECTION (데이터) : 초기화되지 않은 전역변수. VAS에 매핑시 .data SECTION과 병합됨. 디버깅 모드에서만 생성 (.bss라고도 함)
.idata SECTION (import API 정보) : import할 DLL, API 정보. .rdata와 병합되는 추세.
.didat SECTION (import API 정보) : delay-loading import 데이터.
.edata SECTION (export API정보)  : export할 API 정보. .rdata 혹은 .text 섹션과 병합되며 VC++의 .exp 파일에서 확인 가능.

.rsrc SECTION (리소스)     : dialog, icon, cursor 등 리소스 데이터.
.reloc SECTION (재배치 정보): DLL 파일에서의 재배치 정보. (재배치 : 코드상 관련주소 참조에 대한 정보 갱신)
.tls SECTION (TLS)        : __declspec(thread) 지시어와 함께 선언도니 Thread Local Storage를 위한 섹션
.crt SECTION (C++ runtime): CRT(c++ runtime) 지원용.
.sdata SECTION (short)      : IA-64 같은 전역 포인터 레지스터 지원용.
.srdata  SECTION (short)        : .sdata에 들어갈 수 있는 데이터들의 읽기전용 섹션.
.pdata SECTION (예외 정보)  : 예외정보. IMAGE-RUNTIME_FUNCTION_ENTRY 구조체 배열을 갖으며 IMAGE_DIRECTORY_ENTRY_EXCEPTION 슬롯을 통해 섹션 위치 확인 가능.


.debug$S SECTION (디버깅)     : OBJ 파일에만 존재. 가변길이 코드뷰 포멧 [심벌] 레코드의 스트림.
.debug$T SECTION (디버깅)     : OBJ 파일에만 존재. 가변길이 코드뷰 포멧 [타입] 레코드의 스트림.
.debug$P SECTION (디버깅)     : OBJ 파일에만 존재. 미리 컴파일된 헤더 사용시 존재.
.drectve SECTION (Directives) : OBJ 파일에만 존재. "-defaultlib:LIBC" 처럼 Directives를 지정하는데 이는 링커 명령 라인을 통해 전달될 수 있는 아스키 문자열이다.

디버깅 SECTION :개발시 디버깅을 위해 존재하는 섹션
.tls SECTION : TLS(Thread Local Storage) 섹션. 각 스레드의 고유한 전역 변수 공간.
custom SECTION : 사용자 정의 섹션. 보통 프로세스간 데이터 공유를 위해 만드는 경우가 있음.

섹션은 크게 분류하면 코드와 데이터 섹션이 많이 차지하는거 같다.
코드 섹션    : .text
데이터 섹션 : .data, .rdata, .textbss (넓게 본다면  .idata, .edata, .rsrc 도 포함.)



'C++' 카테고리의 다른 글

Random 난수 생성하기  (0) 2010.10.13
SOCKET  (0) 2010.10.09
Windows Thread 와 Synchronization(동기화)  (0) 2010.10.06
자료구조  (0) 2010.09.30
VC++ 수행시간 체크  (1) 2010.09.15
IME(Input Method Editor)  (0) 2010.09.11
Visual C++ : window 생성 template  (0) 2010.09.10
C++ 포인터 및 레퍼런스  (0) 2010.09.02