PE文件(内部实质-字节码分析)

在这篇博客本人会从多个方面来解说PE文件,并在每一步解说中配上实际的图片以便更好地理解

  • PE文件
    * PE文件是什么?
    * PE文件的内部实质
    * 对PE文件内部实质的各部分

1.PE文件是什么?
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的(文件后缀名为)EXE、DLL、OCX、SYS、COM的文件都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。现在大多数的可执行程序,像微信,qq等启动程序都是PE文件。
当然,还有其他的可执行(EXE)文件格式,比如
1)DOS中的MZ格式,
2)Windows 3.0/3.1中的NE(New Executable)文件格式,它是16为的Windows可执行文件格式。
示例:
举个直观的例子,下图是关于qq的文件显示,我们可以看到qq.exe,这就是可执行文件,就是可以运行的文件。所以我们可以运行,运行之后的界面像登陆啊,好友显示等等我就不多说了。
但它内部实质是什么呢?如下图显示,这是用PEview软件打开的qq程序,可以看到qq.exe内部的十六进制的数据形式。
用户眼中的qq

PE文件(内部实质-字节码分析)_第1张图片
下图是qq.exe文件内部实质:
PE文件(内部实质-字节码分析)_第2张图片

2.PE文件的内部实质:
下面我们以pandownload这个软件为例来解说PE文件内部结构,如下图所示:
PE文件(内部实质-字节码分析)_第3张图片
我们可以很直观的观察到这个pandownload.exe文件的结构(如下图),最外部是它的名字“PanDownload.exe”,进一步是DOS头,DOS程序…,节表等等,而每一个分区里是对应的十六进制内容,但可能又有进一步的分区,结构非常明显易懂。
PE文件(内部实质-字节码分析)_第4张图片
我们用下图来看,会更加明显,这一个pandownload.exe文件可分为DOS MZ header,DOS stub,PE header, Section table等。
PE文件(内部实质-字节码分析)_第5张图片

3.接下来我们对每一个部分进行解说:
1)DOS MZ header
默认情况下是64个字节,我们知道,一个字16位,一个字节8位,换成16进制,也就是一个字节两个十六进制位,我们很清楚的看到,以第一行为例,一行从4D到00,有2*16个,也就是16个字节,所以64个字节也就是40h(h是十六进制的意思),即从00h到30h。
如下图就是DOS MX header的位置范围。这里用黄色强调的4个字节 00 00 01 40需要特别注意,它可以用来定义PE文件头的开始位置,而且这个小字段也可以用来检查PE文件的合法性。
在这里插入图片描述
这个PE文件头的位置如图:
PE文件(内部实质-字节码分析)_第6张图片

2)DOS stub:
如下图,图中圈着的部分就包含了DOS stub,DOS stub实际上就是一个DOS小程序,我们可以看到旁边有Value显示:“This program cannot be run in DOS mode…”,如果我们在DOS下去执行一个可执行程序的时候,可能就会遇到这个提示,就是说"这个程序不能在DOS模式下运行的"。
PE文件(内部实质-字节码分析)_第7张图片
3)PE header
如图:
PE文件(内部实质-字节码分析)_第8张图片
PE文件头分三个部分。
1)字串 (Signature)
2)映像文件头(FileHeader)
3)可选文件头(OptionalHeader)
PE文件(内部实质-字节码分析)_第9张图片
所以下图为了便于观看,用不同颜色的笔标注不同部分,黄色部分是Signature部分,红色下划线的部分,是IMAGE_FILE_HEADER部分,其余部分是IMAGE_OPTIONAL_HEADER部分。
PE文件(内部实质-字节码分析)_第10张图片
各部分的作用:
①字串 (Signature)
是PE文件的标识,可以判定一个文件是否是PE文件。
②映像文件头(FileHeader)
包含了关于PE文件的的具体信息,比如说,PE文件的节数目,机器类型,后续可选文件头大小等等。如图所示,00 03 01 4C,01 4C的意思指向可选文件头大小,00 03 就是说3个字节。
在这里插入图片描述
PE文件(内部实质-字节码分析)_第11张图片
③可选文件头(OptionalHeader))
内存镜像加载地址(ImageBase)
程序入口点(代码从哪里开始执行)
节再文件和内存中的对齐粒度
本程序再内存中的镜像大小,文件头大小等

4).Section table
节表,是紧挨着PE header的一个结构数组。而这个数组的每一项有其对应的一个节,即每一个节均对应一个节表项。这里,每一个节表项里含有的内容如下:
1)节名
2)节在文件和内存中的开始地址
3)长度:
4)节属性等。
下图是截取某个文件的节表部分:如图,以不同颜色区分,我们可以看到有三个节表项,每个节表项两行半,通过观察右边的解释我们可以看到text,rdata以及data,这三个词边数这三个节表项里包含的节的节名,当然里面还有关于上述的地址和长度等内容,具体我们以text为例来解释:
PE文件(内部实质-字节码分析)_第12张图片
下图(属性表)正是对应着上图中的text内容,首先是从前8个字节(从2E到00)是节名text,再下面4个字节00 00 00 46(从图中看就是46 00 00 00),这4个字节是节的虚拟大小,再下面4个字节00 00 10 00是节的虚拟偏移量,在计算机中,通过偏移量和基地址(已知)就可以确定节的地址了,再下面4个字节,00 00 02 00和再下面的4个字节00 00 04 00等下图都有解释,Raw就是指这个节再内存中占用的整体的空间,Raw偏移是指这个节在文件里的偏移大小,我们再看到最后4个字节,就是描述的特征.
PE文件(内部实质-字节码分析)_第13张图片
关于这个特征,上图中是60 00 00 20,这4个字节所对应的内容显示在上图中右边的“特征标记”,我们可以看到特征标记显示,CODE(意思是说这个节包含代码,置位),MEM_EXECUTE(意思是说这个块是可执行的),MEM_READ(意思是说这个块是可写的)。具体每一个特征标记对应的十六进制如下图:
这个图怎么看呢?
我觉得呢,因为计算机都是以二进制读取文件,而这便是以二进制的bool值的形式来读取这个特征值的,怎么说呢?前面我们知道text特征对应的值是60 00 00 20,把其中的6这一个位就是0110(二进制),0110中每一位其实就是对应下图中最后4个的每一个选项,6就是2和4的结合,举个例子,如果这个位不是6而是F,F的二进制是1111那就是说,这个块是可共享,可执行,可读,可写的。接下来我们再看60 00 00 20中的20,同样的思路,只不过选项有点少罢了。
PE文件(内部实质-字节码分析)_第14张图片

5.节:
“节”是每个可执行文件的核心部分。PE文件一般都有多个"节",比较常见的有:
1)代码节
2)数据节
3)引入函数节
4)资源节等
5)引出函数节
6)重定位节
下面我们就以前三个节的具体情况来分析:
1)代码节:顾名思义就是存放代码的节。
代码节一般名为.text或CODE,该节含有程序的可执行代码。一般每个PE文件都有代码节。
举个例子:
以SpeedPan.exe这个文件为例,我点击.text的节,右边显示由00000400位置开始,这个就是存放代码的位置,或者说其实位置,当然存放什么代码我不知道,知道我也看不懂。
PE文件(内部实质-字节码分析)_第15张图片
2)初始化的数据节:顾名思义就是存放已经初始化的数据的节
这个节一般取名为.data或DATA,已初始化的数据节中存放的是在编译前就已经确定的数据。例如说下图中.data中数据节的数据,这些数据我们还没有执行这个文件之前,它就已经存在这个文件里了。是已经初始化的数据,至于未初始化的数据节在下面解说。
PE文件(内部实质-字节码分析)_第16张图片
3)未初始化的数据节:存放未初始化的数据的节
这个节名称一般叫.bbs。
这个节里放有未初始化的全局变量和静态变量,例如"stctic int k;"在执行前我们还没有给这些变量初始化,这个节不占用空间,但是它有节表部分,节表表明了各个属性,但Raw偏移量这些都为0,因为它在文件不占用空间,它只在内存中占用空间。
下图是SpeedPan.exe文件的.bbs部分。
PE文件(内部实质-字节码分析)_第17张图片
4)引入函数节
这个节一般名为“.rdata”,但是呢,本人在网上查找后,以及自己电脑的显示,这些引入表有的是放在.rdata,有的是放在.idata。
网上其他的博客的解释如下图,不过这不重要,重要的是知道是什么意思就可以了。
在这里插入图片描述
引入函数,就是说被程序调用但其执行代码又不在程序中的函数。而这些函数位于一个或者多个DLL中,在调用这程序中只保留函数信息,包括函数名及其驻留DLL名等。常见的动态链接库有kernel32.dll,user32.dll,gdi32.dll等。
如图:
PE文件(内部实质-字节码分析)_第18张图片
当我们点击其中的引入目录时:
如下图,右边显示便是引入目录。
PE文件(内部实质-字节码分析)_第19张图片
引入目录由一系列的IMAGE_IMPORT_DESCRIPTOR结构组成。这个结构的数量取决于要使用的DLL文件的数量,每一个结构对应一个DLL文件。在所有这些结构的最后,由一个全为0的IMAGE_IMPORT_DESCRIPTOR结构作为结束。
如下图:
目录下,每5行就是一个IMAGE_IMPORT_DESCRIPTOR结构,每一个结构都记录了导入名,导入的dll文件等的信息。最后以一个全为0的IMAGE_IMPORT_DESCRIPTOR结构结束。
PE文件(内部实质-字节码分析)_第20张图片

你可能感兴趣的:(PE文件(内部实质-字节码分析))