天书夜读之软件加解密技术内幕(1)
前几天去图书馆的时候看到这本书..奈何当时所需书太多..没有顾及到.现在悔恨不已.就从网上找了一个电子书.将就着看了一下.第一章.PE文件格式深入研究
1.1 PE文件格式一览
PE的意思就是Portable Executable(可移植的执行体).它是Win32环境自身所带的执行体文件格式.他的一些特性集成自Unix的Coff(common object file format)文件格式.Portable Executable(可移植的执行体)意味着此文件格式是跨win32平台的:及时windows运行在非intel的CPU上.任何win32平台的PE装载器都能识别和使用该文件格式.当然.移植到不同CPU上PE执行体必然要有一些改变.所有Win32执行体(除了VxD和16位的dll)都使用PE文件格式.包括NT的内核模式驱动程序都使用PE..所以.我们很需要研究PE结构.
图1.
http://bbs.antidu.cn/attachments/month_0808/20080807_b990d3e473772ffcfa22Ak19wtNr17yj.jpg
上图就是PE文件结构的总体层次分布.所有的PE文件(甚至32位的DLLs)必须以一个简单的DOS MZheader开始.我们通常不研究此结构.有了它,程序就可以在DOS下执行,DOS就能识别出这是有效的执行体.然后运行紧随的MZ header之后的DOS stub .DOS stub实际上是个有效的exe.在不支持PE文件格式的操作系统中.他将简单显示一个错误提示.类似于字符串"This program requires windows"或者程序员可根据自己的意图实现完整的DOS代码.通常我们也不对DOS stub太感兴趣.因为大多数情况下它是由汇编器/编译器自动生成.通常.它简单调用中断int 21h服务来显示字符串"This program cannot run in DOS mode".
紧接着 DOS stub的是PE header。.PE header是PE相关结构IMAGE_NT_HEADER 的简称。其中包含了许多PE装载器用到的重要域。当我们更加深入研究PE文件格式后。将对这些重要的域耳熟能详。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header 中找到PE header的起始偏移量。因而跳过DOS stub直接定位真正的文件头PE header
PE文件的真正内存划分为块,称为sections(节)。每节是一块拥有共同属性的数据。比如代码。数据。读写等。我们可以把PE文件想像成一个逻辑磁盘。。PE header是磁盘上的BOOT扇区。而sections 就是各种文件。每种文件自然就有不同属性。比如只读,系统,隐藏等。这里要注意的是节的划分是基于各组数据的共同属性。而不是逻辑概念。重要的不是数据/代码是如何使用的.如果PE文件中的数据/代码拥有相同的属性.他们就能被归入同一节中.如果某块数据想付为只读属性,就可以将该块数据放入置为只读的节中,当PE装载器映射节内容时,它会检查相关节属性并置对应内存块为指定属性。
如果我们将PE文件格式视为一逻辑磁盘,PE header是boot扇区而sections是各种文件,但我们仍缺乏足够信息来定位磁盘上的不同文件,譬如,什么是PE文件格式中等价于目录的东东?别急,那就是 PE header 接下来的数组结构 section table(节表)。 每个结构包含对应节的属性、文件偏移量、虚拟偏移量等。如果PE文件里有5个节,那么此结构数组内就有5个成员。因此,我们便可以把节表视为逻辑磁盘中的根目录,每个数组成员等价于根目录中目录项。
以上就是PE文件格式的物理分布,下面将总结一下装载一PE文件的主要步骤:
1.当PE文件被执行,PE装载器检查 DOS MZ header 里的 PE header 偏移量。如果找到,则跳转到 PE header。
2.PE装载器检查 PE header 的有效性。如果有效,就跳转到PE header的尾部。
3.紧跟 PE header 的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性。
4.PE文件映射入内存后,PE装载器将处理PE文件中类似 import table(引入表)逻辑部分。
页:
[1]