吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2327|回复: 21
收起左侧

[原创] PE导入表手动分析

[复制链接]
lisir1 发表于 2022-12-13 15:39
本帖最后由 lisir1 于 2022-12-13 15:45 编辑

导入表的定义

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

000013.png

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

000014.png

000015.png

导入表的地址为: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,跟过去:
000016.png
名称以00结束,完整的DLL名称是:KERNEL32.dll

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

000017.png

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

000011.png 000012.png

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

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

000018.png

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

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

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

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

免费评分

参与人数 4威望 +1 吾爱币 +22 热心值 +4 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
axin0529 + 1 热心回复!
apull + 1 + 1 谢谢@Thanks!
yuanting + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

吴虾咪 发表于 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
lzy1983 发表于 2022-12-13 17:53
真是天书
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就可以了?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 17:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表