HELLO_HELL?

블로그 이미지

준P

windows pe)NT_HEADER 하

Reversing/Windows PE 2014. 7. 11. 23:51

IMAGE_FILE_HEADER 의 구조체중 마지막인 Optional Header입니다.


Optional Header는 NT_HEADER중 가장크기가크며 이값이 잘못 설정되면 실행이되지 않습니다.


typedef struct _IMAGE_DATA_DIRECTORY {

    DWORD   VirtualAddress;

    DWORD   Size;

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16

typedef struct _IMAGE_OPTIONAL_HEADER {

    WORD    Magic;

    BYTE    MajorLinkerVersion;

    BYTE    MinorLinkerVersion;

    DWORD   SizeOfCode;

    DWORD   SizeOfInitializedData;

    DWORD   SizeOfUninitializedData;

    DWORD   AddressOfEntryPoint;

    DWORD   BaseOfCode;

    DWORD   BaseOfData;

    DWORD   ImageBase;

    DWORD   SectionAlignment;

    DWORD   FileAlignment;

    WORD    MajorOperatingSystemVersion;

    WORD    MinorOperatingSystemVersion;

    WORD    MajorImageVersion;

    WORD    MinorImageVersion;

    WORD    MajorSubsystemVersion;

    WORD    MinorSubsystemVersion;

    DWORD   Win32VersionValue;

    DWORD   SizeOfImage;

    DWORD   SizeOfHeaders;

    DWORD   CheckSum;

    WORD    Subsystem;

    WORD    DllCharacteristics;

    DWORD   SizeOfStackReserve;

    DWORD   SizeOfStackCommit;

    DWORD   SizeOfHeapReserve;

    DWORD   SizeOfHeapCommit;

    DWORD   LoaderFlags;

    DWORD   NumberOfRvaAndSizes;

    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;


주석은 제거하엿습니다.


magic은 32비트이면 010B값을 가지고 64비트이면 020B값을 가짐니다.


IMAGE_OPTIONAL_HEADER32인경우 010B값을  IMAGE_OPTIONAL_HEADER64 구조체인경우 020B값을 가짐니다.


AdressOfEntryPoint


AdressOfEntryPoint는 EP(Entry Point)의 RVA값을 가짐니다.


EP는 프로그램에서 최초로 시작되는 코드의 시작주소입니다.


ImageBase


프로세스의 가상메모리는 0~FFFFFFFF까지 같습니다. (64비트에서는 0~FFFFFFFFFFFFFFFF까지 같습니다)


ImageBase는 이 엄청난 범위에서 pe파일의 시작 주소를 나타냄니다.


EXE,DLL파일은 유져 메모리영역(user memory)인 0~7FFFFFFF 범위에 로딩되고 


SYS파일은 커널메모리 영역인 80000000~FFFFFFFF범위에 로딩됨니다,


일방적으로 개발도구에서는EXE파일의ImageBase의 값은 00400000입니다,(다른 값도 가능합니다,)


DLL파일의 경우 10000000입니다 이 또한 다른 값이 가능합니다.


pe로더는 pe파일을 실행시키기위해 프로세스를 생성합니다.


그리고 파일을 메모리에 로딩한후 EIP 레지스터값을 ImageBase + AddressOfEntryPoint 값으로 세팅합니다.



SectionAlignment, FileAlignment


pe파일의 body부분은 많은 section으로 나누어져있습니다.


메모리에서 섹션의 최소단위는 SectionAlignment입니다.


파일에서 섹션의 최소단위를 나타내는것이 FileAlignment 입니다.


하나의 파일안에서 SectionAlignment와 FileAlignment값은 서로 같을수도 있고 다를수도 있습니다.


파일 메모리의 섹션의 크기는 각각SectionAlignment와 FileAlibgnment의 베수가 할당됨니다.


SizeOfImage


SizeofImage는 pe파일이 메모리에 로딩되었을떄 가상메모리에서 PE Image가 차지하는 크기를 나타냄니다.


SizeOfHeader


SizeofHeader는 pe전체의 크기를 나타냄니다. 이값은 Alibgnment값의 배수여야합니다.


파일시작에서 SizeOfHeader옵셋만큼 떨어진위치에서 첫번쨰 섹션이 위치합니다.


sub system


이값을 보고 시스템 드라이버파일인지 일반실행파일인지 콘솔실행파일인지 알수있습니다.


값 

의미 

비교 

1 

 Driver fIle

시스템 드러이버(ex: ntfs sys)

 2

GUI File 

창기반 어플리케이션 

 3

 CUI File

콘솔기반어플리케이션 


NumberOfRvaAndSizes


NumberOfRvaAndSizes는 IMAGR_OPTIONAL_HEADER32구조체의 마지막 맴버인 data Directory 배열의 개수를 나타냄니다.


IMAGE_NUMBEROF_DIRECTORY_ENTRORY는 16이라 정이되어잇지만


pe로더는 numberofrvaandsizes의 값을보고 배열을 크기를 인식합니다 16이 아닐수도 있습니다.


Data Directory


Data Directory는 IMAGE_FATA_DIRECTORY 구조체 의 배열로 


각항목마다 정의된값을 가짐니다.


배열의개수는 16개이며 define으로 갯수가 정해저있습니다.


typedef struct _IMAGE_DATA_DIRECTORY {

    DWORD   VirtualAddress;

    DWORD   Size;

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;


#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16


DataDirectory

DataDirectory[0] = Export Directory

DataDirectory[1] = Import Directory

DataDirectory[2] = Resource Directory

DataDirectory[3] = Exception Directory

DataDirectory[4] = Security Directory

DataDirectory[5] = Basereloc Directory

DataDirectory[6] = debug Directory

DataDirectory[7] = COPYRIGHT Directory

DataDirectory[8] = Global Directory

DataDirectory[9] = TLS Directory

DataDirectory[A] = LOAD_CONFIG Directory

DataDirectory[B] = BOUND_IMPORT Directory

DataDirectory[C] = IAT Directory

DataDirectory[D] = DELAY_IMPORT Directory

DataDirectory[E] = COM_DESCRIPTOR Directory

DataDirectory[F] = Reserved Directory


여기서 Directory는 구조체의 배열입니다.


여기서 


DataDirectory[1] = Export Directory

DataDirectory[2] = Import Directory

DataDirectory[3] = Resource Directory

DataDirectory[9] = TLS Directory


가 중요함니다.


이것들은 나중에 같이 설명할것으므로 눈으로만 보시길 바람니다.

저작자표시 비영리 변경금지 (새창열림)

'Reversing > Windows PE' 카테고리의 다른 글

windows pe) null패딩이 진짜 null패딩인지 확인하기  (0) 2014.07.23
windows pe) RVA to RAW(file offset)  (0) 2014.07.15
windows pe) NT_HEADER 상  (0) 2014.07.10
windows pe)DOS_STUB  (0) 2014.07.10
windows pe) pe 해더 DOS_HEADER  (0) 2014.07.09
Posted by 준P
블로그 이미지

by 준P

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

링크

카테고리

HELLO? (157)
스터디 (6)
Windows 구조와 원리 OS를 관통하는 프로그.. (6)
Development (44)
Android (5)
Assembly (4)
C/C++ (11)
C# (0)
HTML (1)
JAVA (2)
JSP (3)
JS Script (2)
Linux Shell Script (2)
Open GL (1)
PHP (0)
Python (1)
QT library (3)
SQL (1)
Swift (1)
MongoDB (0)
Express JS (1)
Angular JS (1)
Node JS (1)
SpongePoweredForgePluginDev.. (2)
Unity3d (1)
Docker (0)
Linux (22)
Linux Kernel Study (1)
Network (9)
WireShark (1)
Network Theory (6)
Hack the packet 2013 (2)
Reversing (50)
Windows PE (10)
Windows Reversing (1)
Linux PE (0)
Linux Reversing (0)
Android Reversing (2)
Reversing Tools (8)
CodeEngn (25)
Reversing.kr (2)
abex's (2)
Sites (3)
System (12)
FTZ (9)
Buffer Over Flow (3)
GDGkr (1)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
준P's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

HELLO_HELL?

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • HELLO? (157)
    • 스터디 (6)
      • Windows 구조와 원리 OS를 관통하는 프로그.. (6)
    • Development (44)
      • Android (5)
      • Assembly (4)
      • C/C++ (11)
      • C# (0)
      • HTML (1)
      • JAVA (2)
      • JSP (3)
      • JS Script (2)
      • Linux Shell Script (2)
      • Open GL (1)
      • PHP (0)
      • Python (1)
      • QT library (3)
      • SQL (1)
      • Swift (1)
      • MongoDB (0)
      • Express JS (1)
      • Angular JS (1)
      • Node JS (1)
      • SpongePoweredForgePluginDev.. (2)
      • Unity3d (1)
    • Docker (0)
    • Linux (22)
    • Linux Kernel Study (1)
    • Network (9)
      • WireShark (1)
      • Network Theory (6)
      • Hack the packet 2013 (2)
    • Reversing (50)
      • Windows PE (10)
      • Windows Reversing (1)
      • Linux PE (0)
      • Linux Reversing (0)
      • Android Reversing (2)
      • Reversing Tools (8)
      • CodeEngn (25)
      • Reversing.kr (2)
      • abex's (2)
    • Sites (3)
    • System (12)
      • FTZ (9)
      • Buffer Over Flow (3)
    • GDGkr (1)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바