在Win32平台上(包括Windows 95/98/ME/NT/2000/XP/2003/CE),可执行文件是PE(Portable Executable)格式。PE文件使用的是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。文件的内容被分割为不同的区块(Section,又称区段、节等),块中包含代码或数据。
刚接触这块的朋友只需要简单了解一下PE格式,更具体的PE格式请参考脱壳基础知识入门(2006年版) PE相关名词解释如下:
1.入口点(Entry Point)
程序在执行时的第一行代码的地址应该就是这个值。
2.文件偏移地址(File Offset)
PE文件在磁盘上储存时,各数据的地址称文件偏移地址(File Offset)。用十六进制工具(例如Hex Workshop、WinHex等)打开文件显示的地址就是文件偏移地址。
3.虚拟地址(Virtual Address,VA)
由于Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。与实地址模式下的分段地址类似,虚拟地址也可写成"段:偏移量"的形式,这里的段是指段选择器。
4.基地址(ImageBase)
文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 9x中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。
5.相对虚拟地址
相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。即:相对虚拟地址(RVA)=虚拟地址(VA)-基址(ImageBase)。
4.2 虚拟地址和偏移量转换
在OllyDBG,IDA和W32Dasm下显示的地址值是虚拟地址(Virual Address,VA)。而十六进制工具里,如:Hiew、Hex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 。
其转换原理是因为PE文件在磁盘上的数据结构与在内存中的结构是一致的,如下图: