1、DOS头

// DOS MZ头,大小为64个字节
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否是PE文件的第一个标志)
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[]; // Reserved words
LONG e_lfanew; // 非常重要,操作系统通过它找到NT头,NT头相对于文件的偏移地址
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

DOS MZ头下面是DOS Stub,整个Dos Stub是一个字节快,其内容随着链接时使用的链接器不同而不同,而且长度不固定

2、NT头

// NT 头
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
(1)紧跟在DOS Stub后面的是PE头标识(DWORD) Signature, 占四个字节,内容固定为“PE\0\0“。
(2)标准PE头、文件头、COFF头,占20个字节
3、文件头
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; // 运行平台
WORD NumberOfSections; // PE中节的数量
DWORD TimeDateStamp; // 文件创建日期和时间
DWORD PointerToSymbolTable; // 指向符号表(用于调试)
DWORD NumberOfSymbols; // 符号表中的符号数量(用于调试)
WORD SizeOfOptionalHeader; // 扩展头结构的长度
WORD Characteristics; // PE文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

4、扩展PE头

// 32位程序当中扩展头的大小为224个字节
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic; // (有用)魔术字 107h = ROM Image, 10Bh = exe Image
BYTE MajorLinkerVersion; // 链接器版本号
BYTE MinorLinkerVersion;
DWORD SizeOfCode; // (有用)所有含代码的节的总大小
DWORD SizeOfInitializedData; // (有用)所有含已初始化数据的节的总大小
DWORD SizeOfUninitializedData;// (有用)所有含未初始化数据的节的大小
DWORD AddressOfEntryPoint; // (重要)程序执行入口RVA
DWORD BaseOfCode; // (有用)代码的节的起始RVA
DWORD BaseOfData; // (有用)数据的节的起始RVA
DWORD ImageBase; // (重要)程序的建议装载基址(如果没有加载到这个地址,会发生重定位)
DWORD SectionAlignment; // (重要)内存中的节的对齐粒度,一般是0x1000
DWORD FileAlignment; // (重要)文件中的节的对齐粒度,一般是0x200
WORD MajorOperatingSystemVersion; // 操作系统版本号
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion; // 该PE的版本号
WORD MinorImageVersion;
WORD MajorSubsystemVersion; // 所需子系统版本号
WORD MinorSubsystemVersion;
DWORD Win32VersionValue; // 未用
DWORD SizeOfImage; // (重要)把文件加载进内存,所需要的内存大小,注意是进行了块对齐之后
DWORD SizeOfHeaders; // (重要)所有头 + 节表的大小
DWORD CheckSum; // 校验和
WORD Subsystem; // (有用)文件的子系统
WORD DllCharacteristics; // (有用)指示DLL特征的标志
DWORD SizeOfStackReserve; // (有用)初始化时的栈大小
DWORD SizeOfStackCommit; // (有用)初始化时实际提交的栈大小
DWORD SizeOfHeapReserve // (有用)初始化时保留的堆大小
DWORD SizeOfHeapCommit; // (有用)初始化时实际提交的堆大小
DWORD LoaderFlags; // 与调试有关
DWORD NumberOfRvaAndSizes; // (有用)下面的数据目录结构的项目数量
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // (非常重要)数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

5、数据目录表

// 数据目录项
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress; // 数据的起始RVA
DWORD Size; // 数据块的长度
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
struct IMAGE_DATA_DIRECTORY_ARRAY DataDirArray
[]struct IMAGE_DATA_DIRECTORY Export // 导出表
[]struct IMAGE_DATA_DIRECTORY Import // 导入表
[]struct IMAGE_DATA_DIRECTORY Resource // 资源表
[]struct IMAGE_DATA_DIRECTORY Exception // 异常表
[]struct IMAGE_DATA_DIRECTORY Security // 安全表
[]struct IMAGE_DATA_DIRECTORY BaseRelocationTable // 重定位表
[]struct IMAGE_DATA_DIRECTORY DebugDirectory // 调试信息
[]struct IMAGE_DATA_DIRECTORY CopyrightOrArchitectureSpecificData // 版权信息
[]struct IMAGE_DATA_DIRECTORY GlobalPtr // 全局PTR
[]struct IMAGE_DATA_DIRECTORY TLSDirectory // 线程本地存储
[]struct IMAGE_DATA_DIRECTORY LoadConfigurationDirectory // 配置加载表
[]struct IMAGE_DATA_DIRECTORY BoundImportDirectory // 绑定导入表
[]struct IMAGE_DATA_DIRECTORY ImportAddressTable // 导入函数地址表
[]struct IMAGE_DATA_DIRECTORY DelayLoadImportDescriptors // 延迟加载表
[]struct IMAGE_DATA_DIRECTORY COMRuntimedescriptor // CLR头
[]struct IMAGE_DATA_DIRECTORY Reserved // 预留

6、区段头表

// 节表项
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 8个字节的节名
union {
DWORD PhysicalAddress;
DWORD VirtualSize; // 该节在没有对齐前的真实尺寸,该节可以不准确
} Misc;
DWORD VirtualAddress; // 节区的RVA地址
DWORD SizeOfRawData; // 在文件中对齐后的尺寸
DWORD PointerToRawData; // 在文件中的偏移
DWORD PointerToRelocations; // 在OBJ文件中使用
DWORD PointerToLinenumbers; // 行号表的位置(供调试使用)
WORD NumberOfRelocations; // 在OBJ文件中使用
WORD NumberOfLinenumbers; // 行号表中行号的数量
DWORD Characteristics; // 节的属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

7、RVA 转 FOA

 // RVA 转 FOA
DWORD rva2foa(IMAGE_NT_HEADERS* pNt, DWORD dwRva)
{
IMAGE_SECTION_HEADER* pScnHdr = (IMAGE_SECTION_HEADER*)
IMAGE_FIRST_SECTION(pNt);
for (DWORD i = ; i < pNt->FileHeader.NumberOfSections; i++)
{
if (dwRva >= pScnHdr[i].VirtualAddress &&
dwRva <= pScnHdr[i].VirtualAddress + pScnHdr[i].SizeOfRawData)
{
return dwRva - pScnHdr[i].VirtualAddress + pScnHdr[i].PointerToRawData;
}
}
return -;
}

WinPE基础知识之头部的更多相关文章

  1. WinPE基础知识之代码解析

    void CMyPE::OnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 // 打开一个文件夹选择对话框 CFileDialog dlg(TRUE); dlg. ...

  2. WinPE基础知识之重定位表

    typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; // (重要)需要重定位的位置,这是一个RVA DWORD SizeOfBl ...

  3. WinPE基础知识之导入表

    // 导入表 (结构体数组,以一个全零元素为结尾,每一个数组元素,代表一个PE文件导入信息) // 导入表存储的是从其它PE文件导入过来的函数名.序号,加载到内存之后,还存储这些函数的地址 typed ...

  4. WinPE基础知识之导出表

    // 导出的东西包括函数(变量.类)地址,序号,函数(变量.类)名 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // ...

  5. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  6. HTML基础知识

    一个完美的web前端攻城狮,所具备的专业素养有:HTML5.XHTML.CSS3.JavaScript.JQuery.PS.PHP等.所以说,我要学的东西还有很多... 没别得,我也是一个H5的初学者 ...

  7. C++ 顺序容器基础知识总结

    0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...

  8. C#基础知识记录一

    C#基础知识记录一 static void Main(string[] args) { #region 合并运算符的使用(合并运算符??) 更多运算符请参考:https://msdn.microsof ...

  9. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

随机推荐

  1. 【NetDevops】网络自动化运维--1获取用户基本信息

     版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.  之前博客的云主机到期了没续费,被删啦最重要的是没有备份!此处省略几个字.....      ...

  2. hadoop2.7.7+habse2.0.5+zookeeper3.4.14+hive2.3.5单机安装

    环境 腾讯云centos7 1.hadoop下载 http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar ...

  3. Flex 弹性盒子布局使用教程

    本文转载于<https://blog.csdn.net/lyznice/article/details/53981062>

  4. ubuntu tensorflow cpu faster-rcnn train data

    (flappbird) luo@luo-All-Series:~/MyFile/tf-faster-rcnn_box$ (flappbird) luo@luo-All-Series:~/MyFile/ ...

  5. Redis有序Set、无序Set的使用经历

    为了实现一个类似关系数据库中的卖家信息的单表,首先我们知道单表必然可增删查改,其次为了区分先来后到又需要有ID主键且自增长.开始考虑使用hash数据类型,因为hash是key+列1.列2...这样一来 ...

  6. Linux命令之ntpdate、hwclock

    ntpdate用于同步系统时间.hwclock用于同步硬件时间. (1).ntpdate ntpdate [选项] [时间服务器] 一般直接ntpdate [时间服务器] 常用的时间服务器:ntp[1 ...

  7. Centos7 系统更改apache默认网站目录(解决You don't have permission to access / on this server问题)

    当我们在Centos7中配置好Apache时,发现apache默认解析目录是在 /var/www/html,也就是说当访问服务器 IP 或者本地 localhost 时, 默认定位到这个目录里的 in ...

  8. golang web框架设计2:自定义路由

    继续学习谢大的Go web框架设计 HTTP路由 http路由负责将一个http的请求交到对应的函数处理(或者一个struct的方法),路由在框架中相当于一个事件处理器,而这个时间包括 用户请求的路径 ...

  9. webdriervAPI(CSS定位元素)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  10. PJzhang:钓鱼域名生成工具urlcrazy

    猫宁!!! www.baidu.com和www.baibu.com是不是很相似,urlcrazy可以自动生成一大批. 这款工具的作者是Andrew Horton 工具下载地址: http://www. ...