PE -> 실행 파일 구조 -> MZ, PE 확인
PEview
PEBrowse
--------------------
IMAGE_DOS_HEADER
Dos헤더 -> #include <winnt.h>
WORD e_magic; // magic number -> MZ -> 소문자는 안됨
WORD e_cbip; //
...
...
LONG e_lfnew; // File address of new exe header -> NT헤더의 시작 주소를 가짐
-> PE 라는 글자가 시작 되는 곳
DOS헤더
MS-DOS Stub program -> 윈도우 일때, 도스 전용 프로그램은 실행 할 수 없음
-> 변경해도 파일 실행에 지장이 없음
NT헤더 -> 멤버 3개
-> DWORD Signature -> PE\0\0
-> Image_File_Header -> typedef된 구조체 ->
-> WORD Machine; cpu의 고유한 식별값을 담고 있음 32 / 64 bit / AMD
0x014c / 0x0200 / 0x8664
-> WORD NumberOfSection; 섹션의 개수를 담고 있음
-> 4
-> WORD TimeDateStamp; PE파일 생성된 시간, 빌드된 시간
-> 변경이 쉬워서 그냥 참고만 하기
-> WORD SizeOfOptionalHeader;
다음 나오는 optional헤더의 크기를 알고 있음
->보통 E0이라는 값을 가짐
-> WORD Characteristics;
-> exe (0x0002), dll(0x2000)파일 인지 구분
010F -> bit화 시켜서 OR
-> 하나의 값으로 여러개를 표현
--------
IMAGE_OPTIONAL_HEADER
멤버들
WORD Magic; 0x10B -> 32 bit
0x20B -> 64 bit
...
...
**
DWORD AddressOfEntryPoint;
-> entry point, EP 라고도 부름
-> 프로그램이 처음으로 시작될 코드의 주소를 담고 있는 멤버 (RVA)
-> VA (virtual address)
-> 절대 주소, 실제 주소
-> RVA, r for relative -> 상대 주소
-> 기준을 잘 확인
---------
IMAGE_OPTIONAL_HEADER(NT addtional fields)
멤버들
DWORD ImageBase; PE가 메모리 상에 로딩(매핑) 되었을때 시작 주소 -> RVA의 기준값
image -> 메모리상에 로드된 상태
imageBase + entrypoint -> address of entry point (프로그램이 처음 시작되는 주소)
DWORD SectionAlignment; 섹션의 배치 간격을 나타내는 멤버
메모리상의 섹션의 배치 간격
ex) alignment의 배수가 되어야 함
75 -> null padding영역 -> 100
150 -> -> 300
DWORD FileAlignment; 파일상의 섹션의 배치 간격
**
PE가 메모리상에 있는 모습과 파일상의 모습이 같을수도 있고, 다를 수도 있음
-> 75 -> null padding 영역 -> 200
150 -> null padding -> 400
-> PE 조작할 때 잘 고려 해야 함
DWORD SizeOfImage;
-> 메모리 상에서 PE가 차지하고 있는 크기
WORD Subsystem;
1: drive계열 파일
2; GUI g for graphic
3: CUI c for console
DWORD NumberOfRvaAndSizes;
-> imageDataDirectory 원소 개수 -> 0x10 -> 고정은 아님, 값이 바뀔 수 있음
---------
IMAGE_DATA_DIRECTORY
구조체 배열 -> 0~15
마지막 15번은 null로 채워져 있음
주요 배열 정보
0번 방 : export 함수 정보가 있음
1번 방 : import 함수 정보
9번 방 : TLS 정보 -> 안티 디버깅시 주로 사용
DWORD VirtualAddress;
DWORD Size;
----------------
IMAGE_SECTION_HEADER
섹션의 개수 만큼 존재
정보만 알고 있음
...
...
DWORD VirtualSize;
-> 메모리 상에서 섹션이 차지하고 있는 크기
DWORD VirtualAddress;
-> 메모리상에서 섹션이 시작하는 주소
DWORD SizeOfRawData;
-> 파일상에서 섹션이 차지하고 있는 크기
DWORD PointerToRawData;
-> 파일상에서 섹션이 시작하는 위치
...
...
..
DWORD Characteristics;
-> 섹션에 대한 속성, 특징
IMAGE_SCN_CNT_CODE -> 코드 인지
IMAGE_SCN_CNT_INITIALIZED_DATA -> 초기화 되어 있는지
IMAGE_SCN_CNT_UNINITIALIZED_DATA -> 초기화 되어 있지 않은지
IMAGE_SCN_MEM_EXECUTE -> 실행이 가능한지
IMAGE_SCN_MEM_READ -> 읽기가 가능한지
IMAGE_SCN_MEM_WRITE -> 쓰기가 가능한지
-> bit 화 하여 OR 연산 -> 여러개의 속성들을 하나의 값으로 표현 가능
-------------
다시 PE 구조 정리
PE
-> 메모리와 파일 상에 존재
<FILE상에 존재하는 PE>
DOS_H
NT_H
SECTION_H
...
section들
...
...
<메모리 상에서 존재하는 PE>
DOS_H
Magic -> MZ
e_lf.. -> NT헤더 값
NT_H
멤버1: PE signature -> PE\0\0
멤버2: IMAGE file header -> 구조체 맴버
-> machine -> cpu의 고유한 값을 가짐 32 bit (0x014c)/64 bit (0x0200)
-> numberofsections -> 섹션의 개수 -> ex) 4
-> timedatestamp -> 생성, 빌드된 시간
-> sizeofoptionalheader -> optional header의 크기 -> 0xE0 -> 다른 값 올 수 있음
-> characteristics -> 속성,특징 -> exe(0x0002) / dll(0x2000)
멤버3 : OPTIONAL_H -> 구조체 중 가장 큼
magic -> 32 bit 0x10B
-> 64 bit 0x20B
addressofentrypoint -> 프로그램이 처름 시작되는 주소 (RVA)
->상대 주소 -> 기준이 필요 -> imagebase가 기준이 됨
-> 메모리상
-> ep + imagebase -> 코드 시작점
alignment -> 섹션의 배치 간격을 나타냄
-> filealignment -> 파일상의 배치 간격
-> sectionalignment -> 메모리상의 배치간격
sizeofimage -> 메모리상에서 PE가 차지하는 크기
subsystem -> 1. 드라이브 계열
2. GUI
3. CUI
IMAGE_DATA_DIRECTORY
구조체 계열
numberofrvasize -> 0x10 (16개)
0~15 -> 마지막 방을 null로 채워져 있음
0:export
1:import
9: TLS
SECTION_H
정보
2개씩 묶어 확인
virtual -> 메모리
size 메모리상에서 섹션이 차지하는 크기
address 메모리 상에서 섹션이 시작하는 주소
Raw -> file
size 파일상에서 섹션이 차지하는 크기
pointer 파일상에서 섹션이 시작하는 위치
characteristics -> 속성 -> 읽기, 쓰기, 실행, 초기화, 코드인지
...
...
파일에서는 offset 이라는 용어를 사용
'Reversing' 카테고리의 다른 글
Packing & MUP (0) | 2014.10.02 |
---|---|
report (0) | 2014.10.02 |
summing-up questions (0) | 2014.09.24 |
analyzing files using ollydbg (0) | 2014.09.24 |
analyzing assembly sentences (0) | 2014.09.23 |