PE格式基础及程序的装入
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。
DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。
PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。
Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。
二、程序的装入
当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一个有效的PE文件,拒绝执行。
如果DOS Header 和PE Header都正常有效,那么Loader就会根据PE Header 及Section Table的指示,将相应的代码和数据映射到内存中,然后根据不同的Section进行数据的初始化,最后开始执行程序段代码。
三、PE格式高级分析
下面我们以一个真实的程序为例详细分析PE格式,分析PE格式最好有PE分析器,常用的软件是Lord PE,也有其它的分析工具和软件如PE Editor 、Stud PE等。
先分析一下磁盘文件的内容,这里我们使用UltraEdit32(UE)工具,这是一个实用的文件编辑器,可以编辑文本和二进制文件。
这是一个PE文件的DOS Header,其中我们最关心的就是e_lfanew这个字段的值,它指向了PE Header 在磁盘文件中
通过实验得出,之所以OllDbg 会发出如此的警告,是因为该文件的PE信息中AddressOfEntryPoint超出了Code Section(.text)段所记录的地址(0000000h~00270000h)。将.text判定为代码段,由PE头的BaseOfCode得出。如果将此段代码植入.text 段,那么将不会出现此提示。
PE文件能否正常加载执行,与磁盘文件结构密切相关,但一旦将磁盘文件映射为内存镜像后,就与磁盘文件脱离了关系。所以磁盘仅仅是一个规范的数据结构。
通过实验,我们可以得出这样的结论:对于一个小的代码段(其二进制代码长度小于代码段下一节的RVA-(BaseOfCode+代码段的VirtualSize)),植入是成功的。
那么我们通过分析磁盘文件和内存映射的关系,就可以修改代码段,将代码植入到代码段。在植入代码段后,要对PE文件的磁盘数据和进行一次定位修复,就可以完成代码的整体植入。
代码段一般是PE文件的第一个Section,如果此段变长,就要将其后续段的RVA和磁盘偏移地址都要进行修正。修正完成后,仅仅是保证了PE文件的磁盘格式正确,接下来主要就是修改导入表数据,资源表数据。最后要参照原PE文件将新PE文件对数据段的数据的引用进行修正。
至此,我们完成了一次对PE文件新代码的引入问题的研究。但对于一个复杂的PE文件,修改还远不如此。还要处理输出表、TLS表及其它数据的表的内容