lisir1 发表于 2022-12-13 15:39

PE导入表手动分析

本帖最后由 lisir1 于 2022-12-13 15:45 编辑

导入表的定义

PE 导入表保存了 PE 文件导入的函数和 DLL,并为操作系统提供了调用这些函数所需的信息。PE 导入表确保 PE 文件正常工作,并提供了调用库函数的方法。如图:



导入表的位置
和上一节 导出表的位置一样位于扩展PE头的DIRECTORY DataDirectory里,第一个是导出表,第二个就是导入表。
> typedef struct _IMAGE_DATA_DIRECTORY
>{
> DWORD   VirtualAddress;      //导入表开始的地址       **注意是RVA的值**
> RVADWORD   Size;                //导入表大小
> }
> IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;





导入表的地址为:0x000500D0(RVA),大小为:0x00000104
由于此文件文件对齐和内存对齐都是1000h,所以RVA==FOA
代表第一个导入表从500D0开始,从可以引用多个DLL知道导入表不止一个,当连续出现20个零的时候说明导入表结束;

可以看到从501C0开始连续20个字节为0,则导入表有12个(16*15/20)

我们会发现12个与刚开始利用OD分析出来的DLL个数不相同,这是因为静态文件分析只能分析出程序在编译时所链接的DLL文件,而OD能够检测到程序在运行时动态加载的DLL文件。

第一个导入表分析:
导入表的数据结构:typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
      DWORD   Characteristics;            
      DWORD   OriginalFirstThunk; // 指向 导入名称表INT(ImportNameTable)的RVA
    } DUMMYUNIONNAME;
    DWORD   TimeDateStamp;                  
    DWORD   ForwarderChain;               
    DWORD   Name;                   // 指向 DLL名称的地址 RVA
    DWORD   FirstThunk;             // 指向 导入地址表IAT(ImportAddressTable)的RVA
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
先来分析DLL名称,在0x0C处,地址为:0x00050A58,跟过去:

名称以00结束,完整的DLL名称是:KERNEL32.dll

再来分析导入名称表,即dll下的函数名:在0x00050278



同样KERNEL32.dll下的函数名称不可能只有一个,遇到连续的8个零代表名称表结束,第一个名称所在的地址为:00051442,第二个地址为:0005142A



后面的函数名就不一一列出了,前两个分别为:GetDiskFreeSpaceA;GetVolumeInformationA;
0100和0177是函数在导出表中的索引

我们再来分析导入地址表IAT,在0x000460A4



我们会发现此处存储的和导入名称地址内的相同,这是为什么呢,原来在程序运行后,导入地址表所指向的内容就会被操作系统改为函数的VA;
那么为什么同一段数据存储两遍呢,因为一旦IAT被修改后,如果没有INT的对照,我们无法重新找到该地址调用了哪个函数。

我们来看程序运行后,IAT的变化:


在OD数据窗口中跳转到0x000460A4,不难发现存储的是函数的地址。

总结:
通过分析 PE 导入表,我们可以发现程序依赖于哪些其他文件,以及它们如何使用这些文件中的函数。这可以帮助我们了解程序的工作原理,并对其进行静态分析。分析 PE 导入表的难点在于其结构比较复杂,手动分析它更有利于我们了解它的结构,并对它做出一些恰当的修改使得程序不会出错。

吴虾咪 发表于 2022-12-13 15:47

神仙打架,这就是天书啊。

lisir1 发表于 2022-12-13 23:33

homehome 发表于 2022-12-13 22:23
存储的和导入名称地址内的相同,若是不想要某个加载的DLL,填0就可以了?

填0会导致后续DLL都无法加载,不想加载某个DLL,有种思路:把其导入名称表地址、DLL名称表地址和导入地址表地址分别改为下一个DLL的地址

qazqazwang 发表于 2022-12-13 16:09

吴虾咪 发表于 2022-12-13 15:47
神仙打架,这就是天书啊。

俺也一样

lzy1983 发表于 2022-12-13 17:53

真是天书{:1_909:}

yuanting 发表于 2022-12-13 18:09

没有涉及这些板块,看的也是不知道

ssjjtt 发表于 2022-12-13 18:38

大佬牛逼.萌新来了

apull 发表于 2022-12-13 19:14

多谢分享,学习了。

dou520dou 发表于 2022-12-13 20:54

吴虾咪 发表于 2022-12-13 15:47
神仙打架,这就是天书啊。

真*神人,一点点都看不懂

homehome 发表于 2022-12-13 22:23

存储的和导入名称地址内的相同,若是不想要某个加载的DLL,填0就可以了?
页: [1] 2 3
查看完整版本: PE导入表手动分析