PE-NT头
IMAGE_NT_HEADERS STRUCT{
+0hDWORDSignature //签名:(PE)
+4hIMAGE_FILE_HEADER FileHeader //文件头
+18hIMAGE_OPTIONAL_HEADER32OptionalHeader //可选头
} IMAGE_NT_HEADERS ENDS
这一段红框中的就是NT头部分
文件头:
typedef struct _IMAGE_FILE_HEADER
{
+04h WORD Machine; // 运行平台
+06h WORD NumberOfSections; // 文件的区块数目
+08h DWORD TimeDateStamp; // 文件创建日期和时间
+0Ch DWORD PointerToSymbolTable; // 指向符号表(主要用于调试)
+10h DWORD NumberOfSymbols; // 符号表中符号个数(同上)
+14h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小
+16h WORD Characteristics; // 文件属性
} IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;
重要的有五个:
第一个是运行平台:一般Intel 386 x86的就是0X14C
第二个是节区数目:一定和实际的节区要相同,不然会运行错误
第三个是文件创建日期和时间:用C语言的ctime函数可以进行转换
第四个是可选头的大小:从IMAGE_OPTIONAL_HEADER的起始偏移加上SizeOfOptionalHeader才是真正的IMAGE_SECTION_HEADER
第五个是文件属性:用来标识文件是否可运行状态,是否为DLL等。(按位OR来组合)
typedef struct _IMAGE_OPTIONAL_HEADER
{
//
// Standard fields.
//
+18h WORD Magic; // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah BYTE MajorLinkerVersion; // 链接程序的主版本号
+1Bh BYTE MinorLinkerVersion; // 链接程序的次版本号
+1Ch DWORD SizeOfCode; // 所有含代码的节的总大小
+20h DWORD SizeOfInitializedData; // 所有含已初始化数据的节的总大小
+24h DWORD SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h DWORD AddressOfEntryPoint; // 程序执行入口RVA
+2Ch DWORD BaseOfCode; // 代码的区块的起始RVA
+30h DWORD BaseOfData; // 数据的区块的起始RVA
//
// NT additional fields. 以下是属于NT结构增加的领域。
//
+34h DWORD ImageBase; // 程序的首选装载地址
+38h DWORD SectionAlignment; // 内存中的区块的对齐大小
+3Ch DWORD FileAlignment; // 文件中的区块的对齐大小
+40h WORD MajorOperatingSystemVersion;// 要求操作系统最低版本号的主版本号
+42h WORD MinorOperatingSystemVersion;// 要求操作系统最低版本号的副版本号
+44h WORD MajorImageVersion; // 可运行于操作系统的主版本号
+46h WORD MinorImageVersion; // 可运行于操作系统的次版本号
+48h WORD MajorSubsystemVersion;// 要求最低子系统版本的主版本号
+4Ah WORD MinorSubsystemVersion;// 要求最低子系统版本的次版本号
+4Ch DWORD Win32VersionValue; // 莫须有字段,不被病毒利用的话一般为0
+50h DWORD SizeOfImage; // 映像装入内存后的总尺寸
+54h DWORD SizeOfHeaders; // 所有头 + 区块表的尺寸大小
+58h DWORD CheckSum; // 映像的校检和
+5Ch WORD Subsystem; // 可执行文件期望的子系统
+5Eh WORD DllCharacteristics; // DllMain()函数何时被调用,默认为 0
+60h DWORD SizeOfStackReserve; // 初始化时的栈大小
+64h DWORD SizeOfStackCommit; // 初始化时实际提交的栈大小
+68h DWORD SizeOfHeapReserve; // 初始化时保留的堆大小
+6Ch DWORD SizeOfHeapCommit; // 初始化时实际提交的堆大小
+70h DWORD LoaderFlags; // 与调试有关,默认为 0
+74h DWORD NumberOfRvaAndSizes;// 下边数据目录的项数,这个字段自Windows NT 发布以来 // 一直是16
+78h IMAGE_DATA_DIRECTORY DataDirectory;
// 数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
重要的有10个:
第一个Magic:当是IMAGE_OPTIONAL_HEADER32等于10B,当是IMAGE_OPTIONAL_HEADER64等于20B
第二个AddressOfEntryPoint:是程序载入内存后Entry Point的RVA值,内存中EP = ImageBase + AddressOfEntryPoint
第三个ImageBase:程序的首选装载地址,一般exe载入后EP都等于ImageBase + AddressOfEntryPoint,dll可能发生重定位,所以可能不是
第四个SectionAlignment:内存中区段的大小
第五个FileAlignment:磁盘中的文件区块对齐大小 (这两个的大小可能相同也可能不同,但是一般FileAlignment都是小于等于SectionAlignment)
第六个SizeOfImage:PE IMAGE装入内存中的大小
第七个SizeOfHeader:整个PE头的大小,是FileAlignment的整数倍,第一节区开始的位置 = SizeOfHeader
第八个Subsystem:区分驱动文件(*.sys)和(*.exe , *.dll)
第九个NumberOfRvaAndSize:指定数据目录表的成员数(小于等于16)
第十个DataDirectory:数据目录表(结尾是一个空的结构,接下来就是节区头)
DataDirectory:
0 IMAGE_DIRECTORY_ENTRY_EXPORT 导出表
1 IMAGE_DIRECTORY_ENTRY_IMPORT 导入表
2 IMAGE_DIRECTORY_ENTRY_RESOURCE 资源
3 IMAGE_DIRECTORY_ENTRY_EXCEPTION 异常(具体资料不详)
4 IMAGE_DIRECTORY_ENTRY_SECURITY 安全(具体资料不详)
5 IMAGE_DIRECTORY_ENTRY_BASERELOC 重定位表
6 IMAGE_DIRECTORY_ENTRY_DEBUG 调试信息
7 IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 版权信息
8 IMAGE_DIRECTORY_ENTRY_GLOBALPTR 具体资料不详
9 IMAGE_DIRECTORY_ENTRY_TLS Thread Local Storage
10 IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 具体资料不详
11 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT具体资料不详
12 IMAGE_DIRECTORY_ENTRY_IAT 导入函数地址表
13 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 具体资料不详
14 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR具体资料不详
15 未使用 就是空的那个
页:
[1]