关于PE文件(可执行文件,Portable Executale)结构的研究以前也看过,很久没回顾了。前两天看了本书又涉及到这方面的知识,在此分享一下个人心得,毕竟本人是还没出茅庐的菜鸟,可能有错误之处恳请大家指正。
我相信大家在接触PE听到的醉多的就是什么RVA,VA,Offset,Rsize,Vsize啥啥啥乱七八糟的名称,还有计算公式。网络上关于这个的解释都是粘过来,复制过去,很多描述这些概念的人我相信他们自己都搞不清楚这些。学习PE文件结构其实就是为了掌握磁盘文件和它在内从里的映射关系。这个说简单,其实还是挺麻烦。PE文件就是可执行文件,但不限于exe文件,还有dll,COM,sys都算是PE文件。在此我们只简单地说下exe文件。PE文件被加载到内存中运行的过程是我们关心的。PE文件是如何在内存中被管理的呢,它又被加载到内存的哪里呢?PE文件被加载到内存中的位置,也就是内存地址,是在PE文件中被设置好的,它会告诉系统,将自己加载到某个地址,而且,32位PE中,这个地址往往是0x00400000。我们往往是运行多个可执行文件,那么肯定会冲突。这个我们不用担心,操作系统会进行内存管理,每个文件在自己的虚拟空间里运行,互不影响。这个地址也就是VA(第一个概念,Virtual Address)。要明白VA不是一个地址,它是一段地址空间,我们很关心运行这个PE文件的内存首地址(Image Base,映像基址,第二个概念)。如果说想了解PE文件的内存结构,必须深入理解PE文件的结构。尤其是节区数据,因为节区数据中存储的是汇编指令和操作数,也就是执行的代码和代码使用的变量,常量等数据。ok,贴张图吧,PE文件结构回头再谈,今天只说下PE文件在内存运行的过程和地址转换的概念性东西,这些很枯燥但是相当重要。