PE文件架构学习(二)

一.区块表(Section Table)

​ 在PE文件与原始数据之间存在一个区块表。区块表中包含每个块在映像中的信息,分别指向不同的区块实体,一个区块对应一个块表,可以把一个区块想象成一个人,然后人的身份信息就被放在了块表里面,块与区块表的对应关系如下:

image-20240316172355910

​ 紧跟着 IMAGE_NT_HEADERS 的是区块表,它是一个IMAGE_SECTION_HEADER 结构体。每个 IMAGE_SECTION_HEADER 结构包含了它所关联的区块的信息,例如位置、长度、属性等等,其结构如下:

image-20240316172457896

​ 上述信息都可以对照PEstudy来进行查找,在这儿不一一赘述,然后就是记住一个区段的结尾就是下一个区段的开始。

二.常见区块与区块合并

​ 当对一个exe文件进行查壳的时候,可以进行区块的查看,下面是一个常见的区块名总结:

image-20240316174334257

​ 如若发现除此之外的比较可以的区块的话,那就应该当心此exe大概率有壳。

​ 区块中的数据逻辑通常是关联的,PE文件一般至少有两个区块,一个是代码块,另一个是数据块,每个区块都有特定的名字,这个名字用于表示区块的用途,咱们也可以创建和命名自己的区块,大部分的程序只使用编译器产生的默认的区块,但偶尔可能有一些特殊的需求,需要将代码或数据放到一个单独的区块里,例如建立一个全局共享块。

​ 同时,如果有两个区块有相似或者一直的属性,那么它们在链接时能合并成一个区块。

三.区块的对齐值

区块的大小是要对齐的,即是每个区段所占的位置都要对齐,在x86中,一般为1000h,而在x64中一般为2000h。

四.输入表

​ 一个可执行文件使用了来自其他DLL的代码或数据的动作称为输入。当一个PE文件被载入时,Windows加载器的工作之一就是定位所有被输入的函数和数据,并让正在载入的文件可以使用那些地址。这一整个过程就是通过PE文件的输入表(Import Table 也称导入表)完成的。输入表中保存的是函数名和其驻留的DLL名等动态链接所需要的信息。

五.输入函数

​ 输入函数就是被程序调用但其执行代码不在程序中的函数,这些函数的代码位于相关的DLL文件中,在调用者程序中只保留了相关的函数信息,函数名和DLL文件名等**(不包括函数的地址信息)。且只有当磁盘中的文件被装载到内存当中的时候,Windows加载器才会将相关的DLL载入,并将调用输入函数的指令函数实际的地址**联系起来(一种隐式链接,只不过在Windows的加载器中自动完成罢了,在我们的代码当中肯定是不会体现的)。

​ 在PE文件当中有一组数据结构,它们分别对应于被输入的DLL。每一个这样的结构都给出了被输入的DLL的名称并指向一组函数指针,这组函数指针被称为输入地址表(Import Address Table,IAT),一但模块被载入,IAT中将包含所有要调用输入的函数的地址。

​ 由下图演示:红框处即为程序的载入基址

image-20240317231811743

​ 再加上下图导入表中所示的函数的偏移地址信息,到x32的 dbg 上查找一下:即为0002E264+00400000

image-20240317232131807

​ 从 dbg 中的汇编栏中直接ctrl+g搜索一手:0042E264

image-20240317232537379