如何区分32bit和64bitPE文件
IMAGE_FILE_HEADER->Machine
可执行文件的目标CPU。通常的值是:
IMAGE_FILE_MACHINE_I386 0x014c // Intel 386
IMAGE_FILE_MACHINE_IA64 0x020B // Intel 64
IMAGE_FILE_MACHINE_IA64 0x8664 // Intel 64
……
PE结构中如何告诉系统是否需要动态基址
IMAGE_OPTIONAL_HEADER->DllFlags
DllFlags[6]决定。
DLL Characteristics:
Value | 含义 |
---|---|
8000 | Terminal Server aware |
2000 | WDM driver |
0800 | No bind |
0400 | No SEH |
0200 | No isolation |
0100 | NX compatible |
0080 | Force integrity |
0040 | Dynamic base动态基址 |
PE结构如何区分dll和exe?
IMAGE_FILE_HEADER->Characteristics
Characteristics[13]决定。
Hi高位数据 | 含义 |
---|---|
8000 | Bytes reversed hi |
4000 | Uniprocessor only |
2000 | 是DLL |
0800 | Patch on net |
0400 | Patch on removable |
0200 | Debug stripped |
0100 | 32 bit machine |
Lo低位数据 | 含义 |
---|---|
0080 | Bytes reversed lo |
0040 | ??? |
0020 | Handle >2Gb address |
0010 | Agressively trim set |
0008 | Symbols stripped |
0004 | Line numbers stripped |
0002 | Executable |
0001 | Relocations stripped |
PE中一个特别的点:e_lfanew
它似乎保持指向DOS头后面,但确实没有规定e_lfanew必须指向后面,所以你可以通过将e_lfanew指向到DOS头来完成一段“压缩”。
同样的ELF头部起+2,+3位置没有被使用,也可以用做存储一些隐蔽数据。
以上数据部分从ExeInfoPe中找出来的。