PE格式
PE格式,是微软Win32环境可执行文件的标准格式(所谓可执行文件不光是.EXE文件,还包括.DLL/.VXD/.SYS/.VDM等)。PE 就是Portable Executable 的缩写。Portable 是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的,当然CPU不一样了,CPU指令的二进制编码是不一样的。只是文件中各种东西的布局是一样的。
PE文件使用的是一个平面地址空间,所有代码和数据都合并在一起,组成一个很大的结构。主要有:
.text 是在编译或汇编结束时产生的一种块,它的内容全是指令代码
.rdata 是运行期只读数据
.data是初始化的数据块
.idata 包含其它外来DLL的函数及数据信息,即输入表
.rsrc 包含模块的全部资源:如图标、菜单、位图等
PE文件结构(简化):
-----------------
│1,DOS MZ header│
-----------------
│2,DOS stub │
-----------------
│3,PE header │
-----------------
│4,Section table│
-----------------
│5,Section 1 │
-----------------
│6,Section 2 │
-----------------
│ Section ... │
-----------------
│n,Section n │
-----------------
1、入口点Entry Point
2、文件偏移地址 File Offset
3、虚拟地址 Virtual Address 简称:VA
4、基地址 ImageBase
5、相对虚拟地址 Relative Virual Address 简称:RVA
公式:RVA (相对虚拟地址) =VA (虚拟地址)-ImageBase (基地址)
文件偏移地址和虚拟地址转换
在X86系统中,每个内存的大小是4KB,即0X1000个字节。
文件偏移地址 File Offset =RVA (相对虚拟地址)-ΔK
文件偏移地址 File Offset =VA (虚拟地址) -ImageBase (基地址)-ΔK