利用 PEview 分析 PE 文件结构

对照 Import_descriptor 结构体,给出遍历 INT 得到源文件中调用函数的 函数名、库名、函数索引

源程序:wsample01a.exe

首先了解import_descriptor结构体在哪里

首先是最外面一层,可选PE头

接着进入可选PE头

DWORD AOE;
...
DWORD ImageBase;
...
...
...
//结尾
IMAGE_DATA_DIRECTORY DataDirectory;

里面有很多成员变量,在结尾的地方,有一个结构体数组,名叫DataDirectory,里面包含了16个数组,每个数组又又两个成员变量

XX在内存中的起始地址;
XX的长度;

16个数组中第1,2个分别是导出表和导入表,第13个是导入地址表(缩写IAT)

而导入表中又包含了许多结构体,就是我们要找的Image_Import_Descriptor结构体。

因此定位到导入表在内存中的相对偏移地址RVA:

换算RVA -> Raw,由公式Raw - PointToRawData = Rva - VA(PointerToRawData为节在硬盘中起始的地址,VA为节在内存的起始地址,这两个变量都在节表(IMAGE_SECTION_HEADER中)可以找到)

1.我们先确定导入表在哪个节里面

首先看第一个节的RVA,lucky!节的偏移地址和大小符合导入表偏,说明导入表在这个节里面

再确认一下下一个节,没有问题

2.运算的PointToRawData值

则Raw=22A4-2000+E00=10A4(所有地址的值都是偏移地址,可以放一起计算)

用Hxd把十六进制原文件看一下

这里就是第一个Image_Import_Descriptor表中的结构体,共5个成员变量

3.然后有的人可能纠结怎么开头三个元素是空的(大端存储,成员变量1个4字节),有没有算错?在我排查了一个多小时后,我确认自己没有算错

参照IDT,发现也是对的

Name的RVA是23B8,换算Raw为23B8-2000+E00=11B8

我们找到了函数库名

FistThunk变量的Raw值(即IAT表的首地址)=2000-2000+E00=E00,也没错

那么值为0的OriginalThunk成员变量怎么转换为Raw呢?岂不是为负值?

这次我在一个不起眼的ppt里面看到了答案:

若OriginalFirstThunk值为0,就使用FirstThunk代替,那么找到对应地址的值

换算Raw=23AC-2000+E00=11AC

数组里面两个变量:编号+函数名字

编号为0,函数名为lstrcmpW

至此所有问题已解决。

原文地址:https://www.cnblogs.com/echoDetected/p/13832273.html