首页 89游戏资讯 正文

深度解析pe文件结构:各个部分功能一目了然!

我记得那会儿,我们组里接了个活,要分析一个老掉牙的程序,没有源码,只有那么一个可执行文件。那时候我经验少,拿到手就感觉一头雾水,打开IDA看反汇编,一大堆东西,也不知道从哪下手。心里就寻思,这玩意儿到底是个啥结构?总不能是随便拼凑出来的?

本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu

当时就硬着头皮,想着得把这玩意儿彻底搞明白。我先是上网找了一堆资料,什么PE文件格式解析,什么Windows可执行文件结构。一开始看那些文档,感觉就是一堆英文缩写和专业名词,完全看不进去,越看越懵逼,直接想摔电脑。我就想,这东西肯定得上手敲,光看是看不懂的。

我立马就动手了,找了个十六进制编辑器,随便拖进去一个exe文件。从最开始的00地址看起。我看到最前面有一小段固定的内容,网上说那是DOS头部。这玩意儿就是个遗留产物,老古董了,程序运行在DOS环境下会显示一些提示,比如“This program cannot be run in DOS mode.”。我当时就琢磨,这玩意儿现在还有啥用?后来才知道,它主要是为了兼容性,而且最关键的是,里面有个字段叫e_lfanew,这玩意儿指向后面真正的PE头。我当时就跟着这个偏移量,一点点往后翻。

翻过去一看,果然,到了一个新的地方,开头就是那几个大写字母“PE”,后面跟着两个空字节。,这就是PE签名。跟着PE签名后面,紧接着就是文件头(FILE HEADER)。这里面存着一些这个可执行文件的基本信息,比如这是个32位还是64位程序(机器类型),有多少个节(节的数量),编译时间戳啥的。我就对照着资料,一个字节一个字节地去读,去理解。感觉就像在解谜一样。

再后面就是可选文件头(OPTIONAL HEADER),这名字一听就让人迷惑,可选的?那有些程序是不是就没有?后来才知道,这个“可选”是针对COFF格式文件说的,对PE文件来说,它实际上是必不可少的。这里面的信息就多了去了,什么程序的入口点在哪(AddressOfEntryPoint),内存中代码段从哪开始(BaseOfCode),数据段从哪开始(BaseOfData),最重要的,还有镜像基址(ImageBase),程序加载到内存里的起始地址就在这儿。还有节对齐(SectionAlignment)和文件对齐(FileAlignment),这俩参数决定了文件在内存和磁盘上的对齐方式,这很重要,因为直接影响了文件加载到内存后的地址计算。

然后就是最核心的部分——节表(SECTION TABLE)了。我发现,文件头里那个“节的数量”就是为了告诉我们这里有多少个节。每个节表项都描述了一个节的详细信息:

  • 节名:比如.text是放代码的,.data是放全局变量和静态变量的,.rsrc是放资源的,像图标、位图、字符串之类的。还有.idata是导入表,.edata是导出表。当时看到这么多不同的节,一下子就明白了,原来程序就是这么一块一块地把不同类型的数据和代码分开存放的。
  • 节在文件中大小和地址:这个是文件上的偏移和大小。
  • 节在内存中大小和地址:这个是加载到内存后的偏移和大小。
  • 节的属性:比如这个节是可读、可写还是可执行的。

我再把目光转向那些实实在在的内容。对照着节表里记录的地址和大小,我用十六进制编辑器一点点跳过去看。.text节里面确实是代码,那一大堆汇编指令就在那儿。.data节里面能看到一些程序用到的字符串,或者是一些初始化的数据。.rsrc节里,我就能看到程序的图标,弹窗的文字,这些东西。那一刻,我觉得以前那些乱七八糟的程序,突然就变得“透明”了。知道哪里藏着代码,哪里藏着数据,哪里藏着资源。以前看那些病毒样本,看到一个exe就头大,现在一看它的PE结构,心里就有谱了,知道这东西加载到内存里大概是个啥样。

通过这么一步步地去拆解,去对比,去理解,我才真正把PE文件的结构搞明白了。从最开始的啥都不知道,到后来能对着一个二进制文件,大致说出它的各个部分是什么,干什么用的,这种成就感是真不赖。那会儿再看IDA的反汇编,心里就不慌了,因为我知道那些代码是从.text节来的,那些数据是从.data节来的,一切都变得有章可循。

这个过程是真的挺折腾的,但也真的很有意思。它让我意识到,很多看起来很复杂的东西,只要你愿意一层一层地去剥开,去深入了解它的底层逻辑,总能把它搞明白。现在回过头再看,PE文件结构这个东西,就是程序在磁盘上的一个“骨架”,理解了骨架,你就能更好地理解程序的运行。