PE头-关于导入表的计算
我们使用01Editor观察任意标准程序,比如笔记本notepad.exe。
在节NTHeader的DataDirArray的Import
我们得到
记录导入表的RVA:7604H。
虽然记录在VritualAddress的字段中但是值为RVA。
那么怎么得到导入表呢?
- 判断RVA所处的节并获取节的ViatualAddress
- 计算RVA与RVA所处的节的ViatualAddress的偏移值
- 计算偏移值+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
这样我们就计算完成了