导入表、导入地址表、导入名称表有啥区别?

Posted

技术标签:

【中文标题】导入表、导入地址表、导入名称表有啥区别?【英文标题】:What's the difference between the import table, import adress table, and import name table?导入表、导入地址表、导入名称表有什么区别? 【发布时间】:2015-12-26 18:43:05 【问题描述】:

当反汇编/转储 exe 时,我在 .idata 导入部分得到三个表:

导入表 (IT) 导入地址表 (IAT) 导入名称表 (INT)

我了解 IAT 和 INT 是什么,但更确切地说 IT 是什么?

谁能提供解释,因为各种 PE 教程令人困惑。我不完全理解他们描述的那些官方结构名称在此特定数据上的映射。

此处的提示/答案会有所帮助

示例 PE 文件部分

SECTION .idata  align=4 noexecute                       ; section number 3, data 

Import_table:                                           ; dword 
    db 50H, 30H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403000 _ P0...... 
    db 00H, 00H, 00H, 00H, 0ACH, 30H, 00H, 00H      ; 00403008 _ .....0.. 
    db 68H, 30H, 00H, 00H, 58H, 30H, 00H, 00H       ; 00403010 _ h0..X0.. 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403018 _ ........ 
    db 0C0H, 30H, 00H, 00H, 70H, 30H, 00H, 00H      ; 00403020 _ .0..p0.. 
    db 60H, 30H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403028 _ `0...... 
    db 00H, 00H, 00H, 00H, 0D0H, 30H, 00H, 00H      ; 00403030 _ .....0.. 
    db 78H, 30H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403038 _ x0...... 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403040 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403048 _ ........ 
    db 80H, 30H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403050 _ .0...... 
    db 8EH, 30H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403058 _ .0...... 
    db 98H, 30H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403060 _ .0...... 

Import_address_table:                                   ; dword 
imp_ExitProcess:                                        ; import from        KERNEL32.dll  
    dd 00003080H, 00000000H                         ; 00403068 _ 12416 0

imp_printf:                                             ; import from  msvcrt.dll 
    dd 0000308EH, 00000000H                         ; 00403070 _ 0000308E 00000000 

imp_MessageBoxA:                                        ; import from USER32.dll 
    dd 00003098H, 00000000H                         ; 00403078 _ 00003098 00000000 

Import_name_table:                                      ; byte 
    db 17H, 01H, 45H, 78H, 69H, 74H, 50H, 72H       ; 00403080 _ ..ExitPr 
    db 6FH, 63H, 65H, 73H, 73H, 00H, 0B1H, 02H      ; 00403088 _ ocess... 
    db 70H, 72H, 69H, 6EH, 74H, 66H, 00H, 00H       ; 00403090 _ printf.. 
    db 0B2H, 01H, 4DH, 65H, 73H, 73H, 61H, 67H      ; 00403098 _ ..Messag 
    db 65H, 42H, 6FH, 78H, 41H, 00H, 00H, 00H       ; 004030A0 _ eBoxA... 
    db 00H, 30H, 00H, 00H, 4BH, 45H, 52H, 4EH       ; 004030A8 _ .0..KERN 
    db 45H, 4CH, 33H, 32H, 2EH, 64H, 6CH, 6CH       ; 004030B0 _ EL32.dll 
    db 00H, 00H, 00H, 00H, 14H, 30H, 00H, 00H       ; 004030B8 _ .....0.. 
    db 6DH, 73H, 76H, 63H, 72H, 74H, 2EH, 64H       ; 004030C0 _ msvcrt.d 
    db 6CH, 6CH, 00H, 00H, 28H, 30H, 00H, 00H       ; 004030C8 _ ll..(0.. 
    db 55H, 53H, 45H, 52H, 33H, 32H, 2EH, 64H       ; 004030D0 _ USER32.d 
    db 6CH, 6CH, 00H, 00H, 00H, 00H, 00H, 00H       ; 004030D8 _ ll...... 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004030E0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004030E8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004030F0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004030F8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403100 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403108 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403110 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403118 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403120 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403128 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403130 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403138 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403140 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403148 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403150 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403158 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403160 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403168 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403170 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403178 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403180 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403188 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403190 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 00403198 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031A0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031A8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031B0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031B8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031C0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031C8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031D0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031D8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031E0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031E8 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031F0 _ ........ 
    db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H       ; 004031F8 _ ........ 

【问题讨论】:

是导入目录表。每个导入的 DLL 一个条目,每个条目 20 个字节。 manual中的第6.4.1章。 【参考方案1】:

导入表

来自manual 6.4.1 节:

导入信息以导入目录表开头,该表描述了导入信息的其余部分。导入目录表包含用于解析对 DLL 映像中的入口点的修复引用的地址信息。

每个导入目录表条目都有格式

Offset    Size    Field
0         4       Import Lookup Table RVA
4         4       Time/Date Stamp
8         4       Forwarder Chain
12        4       Name RVA
16        4       Import Address Table RVA

注意:由于 DLL 可以在不同的内存位置加载,RVA 代表相对虚拟地址,即加载后内容相对于图像库的地址

导入查找表

再次来自文档:

这些条目的集合描述了从图像到给定 DLL 的所有导入。

这些字段包含有关如何处理导入的信息(序号与名称)。如果它指定按序号导入,则表中的其余条目包含序号,否则它包含提示/名称表条目的 RVA。

提示/名称表

提示/名称表中的条目格式如下:

Offset    Size    Field    Notes
0         2       Hint     Index into the Export Name Pointer Table
2         varies  Name     Null terminated ASCII string
*         0 or 1  Pad      Each entry must be on an even boundary

导入地址表

导入地址表的结构和内容与导入查找表的结构和内容相同,直到文件被绑定。在绑定期间,导入地址表中的条目会被导入符号的 32 位(或 PE32+ 的 64 位)地址覆盖:这些地址是符号本身的实际内存地址(尽管从技术上讲,它们仍然是称为“虚拟地址”)。绑定的处理通常由加载程序执行。

参考文献

    Portable Executable 上的***条目 Official Documentation Ero Carrera 的 helpful diagrams

以上所有引用和表格均来自参考 2 中列出的 Microsoft PE/COFF 手册。

【讨论】:

【参考方案2】:

让我们从以下两个表格的高度简化图开始:

这张图显示了您在磁盘上的可执行文件的情况。这些表具有完全相同的内容,具有完全相同的 API 函数名称列表和完全相同的顺序。

(好吧,你可能会问:“怎么可能把这么长的名字放在 4 个字节中?”继续阅读以获得答案;正如我所写的,我们从一张简化的图片开始。)


现在加载器将您的可执行文件加载到内存中,因此最初复制到内存中的这些表仍然相同。但是:

在将所有需要的 DLL(动态链接库)加载/映射到内存后,它已经知道所有导入函数的地址,所以

它将第二个表(导入地址表)中的导入函数的名称替换为它们的地址(只有这样名称“导入地址表”才与其对应的内容)。


所以内存的情况就不同了:


现在回答上面(我自己的)问题:

如何将这么长的名称放入 4 个字节中?

当然,这是不可能的。 导入查找表中只有指针(地址)指向名称。

第三个表,导入提示/名称表,这些指针的目标,所以现实(而不是前2张图片中的简化)看起来像这样(我使用与您列表中的地址相同的地址):


到目前为止,我只回答了我自己的问题,是时候回答你的问题了:

我了解 IAT 和 INT 是什么,但更准确地说 IT 是什么?

导入表,更准确地说是导入目录表,是一个条目数组(表),每个导入的库都有一个条目(一行)(在您的情况下 3 库,因此该表由 3 行组成。

这里是它的简化图:

每行由 5 个双字(指针)组成。对我们来说只有 3 个是重要的,第一个(指向 ILT 的指针),最后一个(指向 IAT 的指针),最后一个(通过 DLL 的名称标识行;所以它是指向DLL 在提示/名称表中的名称)。

导入目录表与其他两个表的配合如下:

(在这张图中我省略了与第三张表的合作,已经提到了Hint/Name Table。)


注意:我故意省略了图片中的零填充分隔行,并且我没有处理按序号导入(对于为了简单起见强调思想)。

【讨论】:

以上是关于导入表、导入地址表、导入名称表有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

mysql导入数据库_仅仅用frm向mysql导入表结构

使用外键导入 csv

导入表与导出表(1)

PE知识复习之PE的绑定导入表

PE 导入表

Delphi 中如何将EXCEL表导入到已知的数据库中,再进行操作