반응형
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 멤버.. )
반응형
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
40. 64비트 디버깅 (0) | 2024.12.26 |
---|---|
39. WinDbg (1) | 2024.12.18 |
37. x64 프로세서 이야기 (0) | 2024.12.18 |
36. 64비트 컴퓨팅 (2) | 2024.12.18 |
35. 좋은 분석 도구를 선택하는 다섯 가지 기준 (0) | 2024.12.04 |