0%

逆向工程核心原理第十三章PE文件

逆向工程核心原理第十三章PE文件格式

准备知识

  • 首先是类型

image-20211208184817595

(除OBJ之外都是可执行的,DLL、SYS是用其他方法间接执行的。OBJ不能以任何形式执行,所以逆向分析中一般不管它。)

  • 再贴一个易混淆的image-20211208184932670

    image-20211208190541199

    (RVA+imageBase=VA)

  • 节区:Flash芯片的最小数据存储单位称为节区。节区通常情况包含节区头、节区数据、节区尾等3个部分

    (节区头和节区尾用来存储该节区的一些管理字、ECC校验等管理信息,而节区数据则是存放实际有效的数据。这里可以将节区看成是带管理信息的扇区,一般情况下节区数据的长度为512个字节(一个扇区长度)。)

在生成进程时(加载到内存中),操作系统(OS)会为程序单独分配4G大小的虚拟内存,每个程序所分配的空间互不影响(即使运行同一程序)。)

image-20211211133948441

接下来正式开始

  • 在Windows下所谓PE文件即Portable Executable,意为可移植的可执行的文件。常见的.EXE、.DLL、.OCX、.SYS、.COM都是PE文件。PE文件有一个共同特点:前两个字节为4D 5A(MZ)。如果一个文件前两个字节不是4D 5A则其肯定不是可执行文件。比如用16进制文本编辑器打开一个“.xls”文件其前两个字节为:0XD0 0XCF;打开一个“.pdf”其前两个字节为:0X25 0X50。

    PE文件结构:DOS头+PE头+节表+.data/.rdata/.text。
    注意:一个exe文件本身是一个PE文件,但是由于包含dll库,所以一个exe文件也是许多PE文件组成的(包含多个dll)一个PE文件。

  • DOS头和DOS存根

    DOS头结构体中的v拉两个重要成员是e_magic(DOS签名)和e_lfanew(指示NT头的偏移(不同文件的值不同。))

    如第一条所说,所有PE文件的前两个字节都必须是4D5A(MZ),e_lfanew的值为000000E0

    (Intel的CPU采用小端序标识法存储数据–逆序。)

    DOS存根为可选内容(有无都不影响程序正常运行,且大小不固定。),其有代码和数据混合组成。

  • NT头:由签名结构体(值为50450000h–”PE“00),文件头和可选头组成。NT头的结构体大小为F8(十进制为248).

    文件头中,值得注意的是machine码,每个CPU都有唯一的machine码

    image-20211211115319553

image-20211211115418486

RVA to RAW

image-20211211122015407

(注:每个PE文件中的RVA和Pointer等值是不一样的,需根据具体情况来进行计算。上述VietualAddres是指的SizeofRawData)

  • IAT(导入地址表)—一种记录程序正在使用哪些库中的哪些函数的表格。(相对的为EAT—导出地址表。)

    image-20211211132147232

    image-20211211133010828

    INT是一个包含导入函数的信息的结构体指针数组。

    image-20211211140607158

    重要成员

    image-20211211140348489

    IAT的导入顺序如下

    image-20211211140800787

    • EAT(导出地址表)—它是不同的应用程序可以调用库文件中欧共提供的函数,只有通过EAT才能准确求得相应库中导出函数的起始地址。(在PE文件中仅有一个用来说明库EAT的结构体。)

    image-20211211132631404

    • IMAGE_EXPORT_DIRECTORY的重要成员如下图

    image-20211211132812251

  • DLL—一种动态链接库(附上DLL概念的描述和加载方式。)

    image-20211211130223999

DLL的存在使得内存和磁盘空间的浪费得以减小。

重定位:PE装载器先把一个DLL文件装载到内存为10000000(Imagebase处),然后尝试把另一个DLL文件也装载到该处,可该处已经装载了一个,故需要将其装载到其他内存地址(空白的)。

image-20211211130953633

image-20211211131019298

​ (注:ordinal为函数的固有编号。)

  • 值得一提的是,只要符合了PE文件规范就是PE文件,故可以在规范之外作出改动,从而制作出一些奇异的PE文件,这一类统称为Patched PE文件。(还没学到,以后会写。)