yenas0 2024. 12. 18. 05:49
반응형

64비트 Windows OS 에서 프로세스의 가상 메모리 크기는 16테라임

유저영역이 8테라 커널이 8테라

변경 된거 맞춰서 PE파일 포맷도 바뀌었다..

 

PE32+(PE+, PE64)

PE32+은 64비트 네이티브 모드에서 실행되는 포멧이고 기존 32비트 파일의 확장된 형태임

 

IMAGE_NT_HEADERS

// Define IMAGE_NT_HEADERS64 structure for PE32+
typedef struct _IMAGE_NT_HEADERS64 {
    DWORD Signature;                      // Signature of the NT Header
    IMAGE_FILE_HEADER FileHeader;         // File Header
    IMAGE_OPTIONAL_HEADER64 OptionalHeader; // Optional Header for PE32+
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;

// Define IMAGE_NT_HEADERS32 structure for PE32
typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;                      // Signature of the NT Header
    IMAGE_FILE_HEADER FileHeader;         // File Header
    IMAGE_OPTIONAL_HEADER32 OptionalHeader; // Optional Header for PE32
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

// Conditional Typedef for IMAGE_NT_HEADERS based on platform
#ifdef _WIN64
    typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
    typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
#else
    typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
    typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
#endif

차이점은 세번째 멤버가 각각 IMAGE_OPTIONAL_HEADER64랑 IMEAGE_OPTIONAL_HEADER32라는거임

 

IMAGE_FILE_HEADER

// Machine types for IMAGE_FILE_HEADER.Machine
#define IMAGE_FILE_MACHINE_UNKNOWN      0x0000  // Unknown machine
#define IMAGE_FILE_MACHINE_I386         0x014c  // Intel 386, x86
#define IMAGE_FILE_MACHINE_R3000        0x0162  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R4000        0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000       0x0168  // MIPS big-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2    0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA        0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3          0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP       0x01a3  // SH3 DSP
#define IMAGE_FILE_MACHINE_SH3E         0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4          0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5          0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM          0x01c0  // ARM little-endian
#define IMAGE_FILE_MACHINE_THUMB        0x01c2  // ARM Thumb
#define IMAGE_FILE_MACHINE_AM33         0x01d3  // AM33
#define IMAGE_FILE_MACHINE_POWERPC      0x01f0  // IBM PowerPC little-endian
#define IMAGE_FILE_MACHINE_POWERPCFP    0x01f1  // IBM PowerPC FP
#define IMAGE_FILE_MACHINE_IA64         0x0200  // Intel IA-64
#define IMAGE_FILE_MACHINE_MIPS16       0x0266  // MIPS 16-bit
#define IMAGE_FILE_MACHINE_ALPHA64      0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU      0x0366  // MIPS FPU
#define IMAGE_FILE_MACHINE_MIPSFPU16    0x0466  // MIPS FPU 16-bit
#define IMAGE_FILE_MACHINE_AXP64        IMAGE_FILE_MACHINE_ALPHA64 // AXP64 alias
#define IMAGE_FILE_MACHINE_TRICORE      0x0520  // Infineon TriCore
#define IMAGE_FILE_MACHINE_CEF          0x0CEF  // Common Executable Format
#define IMAGE_FILE_MACHINE_EBC          0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64        0x8664  // AMD64 (x64)
#define IMAGE_FILE_MACHINE_M32R         0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE          0xC0EE  // CEE

Machine 멤버 값이 바뀜.

32에서는 Machine값이 014C로 고정되어있었는데 여긴 8664임

 

 

IMAGE_OPTIONAL_HEADER

오 코드 너무 길다 포기

바뀐점만 말하면 Magic넘버 바뀜 32에서는 010B였고 +에서는 020B다

긜고 BaseOfData에서는 PE 파일의 데이터 섹션의 시작주소(RVA)를 의미하던 BaseOfData항목 제거됨

ImageBase멤버의 자료형이 ULONGLONG(8바이트)로 확장됨 -> 확장된 프로세스의 가상 메모리에 대응하려고

스택이랑힙도 저 사이즈로 변경됨

 

IMAGE_THUNK_DATA

얘 구조체도 4바이트에서 8바이트로 바뀜

 

IMAGE_TLS_DIRCTORY

VA의미하는 멤버들 8바이트로 확장(StartAddressOfRawData, EndAddressOfRawData, AddressOfIndex, AddressOfCallBacks 멤버.. )

반응형