【PE结构】1.PE文件结构、DOS头

一、前言
二、PE整体结构
三、DOS头
四、NT头
    4.1.文件头
    4.2.扩展头
五、区段头
六、导出表
七、导入表
八、资源表
九、其他表


一、前言

PE(PortableExecutable)文件,也就是Windows操作系统上的可执行文件,不仅仅是扩展名为EXE的文件,还包括DLL、SYS、COM、OCX等多种文件。

Windows操作系统树大招风,运行在上面的各种应用程序(PE文件)自然成了很多人的目标,然而变态的PE结构有效的保护了程序自身,将大批的初级的好奇宝宝们挡在了门外。

本文中,我将自己学到的PE结构相关的知识进行整理,对PE文件进行解剖。
工具:解剖肉体需要手术刀 得意,拆解PE文件需要使用十六进制编辑工具,十六进制工具很多自己百度去,我用的是 010Editor
思想:个人认为,这才是重中之重。拿拆人来说 惊恐什么心肝脾肺肾,就是功能不同的肉而已。PE呢?你看它运行起来后界面炫酷、功能多多,解剖了之后其实就是一堆一堆0和1而已,每堆0和1在一起有不同的功能。当你做到如此冷酷无情之后,你就成功一半了。

OK抓个倒霉的PE祭刀,我整洁的桌面上竟然只有个百度网盘,也不知这相遇到底是我俩谁的不幸,面对大厂的应用程序,目前我还是有点发怵,走你,大不了中途再换一个呗~~~~


二、PE整体结构
将百度网盘拖进010Editor,不是桌面的link,是exe文件哦。
图2.1

通过右半部分,我们可以很清楚的了解整个PE文件的结构。

图2.2

这里对各个部分就不详细说了,总之,整个PE文件可以初略的分成两大部分。
一个是头部,包含各种头,你可以当他是配置文件,当程序启动时,系统会来读这些数据,所以头部出错,文件根本跑不起来。另一个是区段,也就是身体了,里面是各种实现功能的程序和数据,如果这里面出错了,程序会崩溃。

三、DOS头
DOS头就是一堆数据,但它们是一个有序的有含义的组合在一起的结构体。

DOS头是为了兼容DOS程序而设的,现在基本已经用不上了,仅有两个有意义的字段,所以还是很简单的。
DOS头对应的结构体名称叫IMAGE_DOS_HEADER,在右侧点击结构体名称,左侧结构体对应的数据即被选中。


图3.1


3.1.DOS头的大小是64字节
图里的每一位都是一个十六进制数,范围是0到F,长度占4位,两个数字一起8位正好是一字节(看多了习惯就好了)
每行16字节,4行一共64字节,这就是DOS头的大小了。

3.2.DOS头的结构
图3.2

展开结构,可以看到上图,也就是DOS头的结构体。其中,有用的字段只有两个。
  • e_magic (MZSignature
            这个字段被称为魔数,长度两字节,用于标识文件类型。
            EXE文件中,这字段存的值是0x5A4D,按字节存储显示ASCII码值为MZ(小端存储)
            其他文件如PNG什么的你也可以拖到010Editor里面看一下标识哦
        
            这字段通常在程序中用于判断文件,如C++中
if(((PIMAGE_DOS_HEADER)pFile)->e_magic != IMAGE_DOS_SIGNATURE)
{
    // 不是PE文件
}

  • e_lfanew(AddressOfNewExeHeader)
            这个字段用于标识PE头的位置。从图3.2可以看到,其值为158H。
            也就是说,图3.1中最左侧那列 或 图3.2中Start列,值为158H的地址,对应的中间区域即为NT头内容起始。

            这里引入一个概念, 文件偏移,从图3.2可以看到,整个文件的起始内容“4D”对应的地址是0x0000H,地址向下到0x0158H就是PE头内容,也就是说0x0158H是NT头相对于DOS头的文件偏移。
            注意:偏移不同于地址,地址是一个准确定位值,偏移是一个相对定位值。

            程序中可用这个字段得到NT头的位置
(DWORD)pFile + ((PIMAGE_DOS_HEADER)pFile)->elfanew

另外:DOS头和NT中间还有一部分数据,图2.2中DOS_STUB_DosStub,这里也存储着一些提示字符串等,大小不确定,所以定位NT头的时候,要使用DOS头的e_lfanew。


下一篇:【PE结构】2.NT头、文件头、扩展头

    

猜你喜欢

转载自blog.csdn.net/chy_chenyang/article/details/80764506
今日推荐