windows pe) NT_HEADER 상
IMAGE_NT_HEADERS 구조체는 총 3가지로 구성되어있으며 크기는 F8입니다.
Signature, FileHeader, OptionalHeader 구조체 맴버로 구성되어있습니다.
FileHeader, OptionalHeader는 또 다른 구조체로구성되어있습니다.
signature는 ("PE"0000)로 구성되어 있습니다.
만약 64비트라면 _IMAGE_NT_HEADER64를 사용합니다.
참고로 _IMAGE_NT_HEADERS 구조체입니다.
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
typedef struct _IMAGE_NT_HEADERS64 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
두번쨰로 FILE_HEADER 구조체는 파일의 개략적인 속성을 나타냄니다.
일단 구조체를 살펴보시면
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Machine, NumberOfSections, TimeDateStamp, PointerToSymbolTable, NumberOfSymbols, SizeOfOptionalHeader, Characteristics
총7가지로 이루어져있습니다.
machine은 cpu의 고유한 값입니다.
windows 에서는 이렇게 정의되어있습니다.
#define IMAGE_FILE_MACHINE_UNKNOWN 0
#define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
#define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-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
#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/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT 0x01c4 // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33 0x01d3
#define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
#define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
#define IMAGE_FILE_MACHINE_CEF 0x0CEF
#define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE 0xC0EE
제 컴퓨터는 0x8664 라고 써져잇으니 AMD64 이군요 (intel 에서는 리틀에디안 사용!!!)
number of section 말그대로 섹션의 수 입니다.
0006 이라고 써져 잇으니 6개인가봄니다.
실제로 peview 로 보시면 6개나옴니다.
IMAGE_SECTION_HEADER ~라고 보이시져 이게 섹션 입니다.
이렇게 생긴게 6개 보이네요 peview 사용방법을 익히시는것도 좋습니다.
TimeDateStamp는 수정한 날자인데 오류가 있는지 2009년이네여
참고로 속성에서 보이는 날자는 한국시간입니다. UTC는 표준시이므로 9시간을 더해주셔야합니다.
PointerToSymbolTable은 symboltable로가는 포인터 주소 입니다.
coff는 많은 프로그램을 하나로 모아 메모리에 옮기는 과정이 매우 복잡하고 많은시간이 필요해서 미국 AT&T에서 고안해낸 방법이다.
같은 성질을 가지는것은 하나로 합친것을 섹션이라하고 언어에 따라 섹션이 달라진다. 그리고 프로그램의 개수와 상관없이 프로그램을 몇개의 색션으로 구분하기 떄문에 간단해진다.
numberofsymbols
말그대로 심볼의 개수 입니다. PointerToSymbolTable 이 정의 되었다면 symbol의 갯수를 같는다.
헌데 요즘은 symbol의 크기가 커져서 사용하지 않는다고 한다,,,,
characteristics는 파일 속성을 나타내는값으로 실행가능한 형태인지 혹은 dll파일인지 정보들이 bit or 형식으로 조합됨니다.
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved external references).
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 // Aggressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // If Image is on removable media, copy and run from the swap file.
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // If Image is on Net, copy and run from the swap file.
#define IMAGE_FILE_SYSTEM 0x1000 // System File.
#define IMAGE_FILE_DLL 0x2000 // File is a DLL.
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // File should only be run on a UP machine
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.
'Reversing > Windows PE' 카테고리의 다른 글
windows pe) RVA to RAW(file offset) (0) | 2014.07.15 |
---|---|
windows pe)NT_HEADER 하 (0) | 2014.07.11 |
windows pe)DOS_STUB (0) | 2014.07.10 |
windows pe) pe 해더 DOS_HEADER (0) | 2014.07.09 |
windows pe) pe 구조 (0) | 2014.07.05 |