PE头-关于导入表的计算

我们使用01Editor观察任意标准程序,比如笔记本notepad.exe。

在节NTHeader的DataDirArray的Import

 

 

我们得到

记录导入表的RVA:7604H。

虽然记录在VritualAddress的字段中但是值为RVA。

那么怎么得到导入表呢?

  1. 判断RVA所处的节并获取节的ViatualAddress
  2. 计算RVA与RVA所处的节的ViatualAddress的偏移值
  3. 计算偏移值+RVA所处的节的PointerToRawData并得到导入表的位置

第一步,我们要判断RVA所处的节的位置,这个过程是

 

 

 判断SectionHeader节点的VirtualAddress+SizeofRawData大于等于RVA。

当某个节点成立时,RVA则属于这个节。

本文中则是属于第一节也就是下标为0的SechitonHeaders【0】

 

第二步,计算偏移值

这个偏移值为RVA-VirtualAddress

在本文中则为

7604h-1000h=6604h

 

第三步 计算文件位置

偏移值+PointerToRawData即为文件位置

6604h+400h=6A04h

这个值就是导入表的结构体的值

 

 

 

 

 

那么如何计算具体使用了什么函数呢呢?

我们来计算一下INT的算法吧。

我们已INT为例,也就是Import Name Table的缩写。意思是导入了什么函数。

OriginalFirstThunk这个字段的值是RVA,指向一个import by name的结构体。这个结构体中有俩个字段,第一个字段就是固有编号,长度为两个字节。第二个是字段是代表名字的数组,长度是比特数组。

那么怎么得到这个import by name的结构体?

还是一样重复上面计算导入表的过程。

也即是

1 判断RVA的节 =>0节

2 偏移值=>7990h-1000h=6990h

3 计算文件位置= >6990h+400h=6D90h

我们跳转到6d90这个位置,这个位置的值指向import by name的结构体,所以我们还要重复一次上述计算的过程=》7A7A-1000+400=6E7A

 

 这样我们就计算完成了

posted @ 2022-05-01 21:48  ARM830  阅读(143)  评论(0编辑  收藏  举报