use*_*913 2 winapi reverse-engineering coff disassembly portable-executable
在反汇编/转储exe时,我在.idata导入部分中得到三个表:
我理解IAT和INT是什么,但更准确的是什么?
有人可以提供解释,因为各种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 _ ........
Run Code Online (Sandbox Code Playgroud)
让我们从以下两个表的高度简化的图片开始:
\n\n这张图显示了你的可执行文件在磁盘上的情况。这些表具有完全相同的内容、完全相同的 API 函数名称列表以及完全相同的顺序。
\n(好吧,你可能会问:\xe2\x80\x9c怎么可能把这么长的名字放到4个字节中?\xe2\x80\x9d 继续阅读以获得答案;正如我所写的,我们从一张简化的图片开始。)
\n现在加载器将可执行文件加载到内存中,因此最初复制到内存中的这些表仍然是相同的。但:
\n将所有必需的 DLL(动态链接库)加载/映射到内存后,它已经知道所有导入函数的地址,因此
\n它将第二个表(导入地址表)中导入函数的名称替换为其地址(只有名称 \xe2\x80\x9cImport Address Table\xe2\x80\x9d 才与其内容相对应)。
\n于是内存中的情况就变得不一样了:
\n\n现在回答上面(我自己的)问题:
\n\n\n怎么可能把这么长的名字放进4个字节呢?
\n
当然,这是不可能的。在导入查找表中只有指向名称的指针(地址)。
\n这里发挥第三个表,导入提示/名称表,这些指针的目标,所以现实(而不是前两张图片中的简化)看起来像这样(我使用了与列表中相同的地址) :
\n\n到目前为止,我只回答了我自己的问题,是时候回答你的问题了:
\n\n\n我了解 IAT 和 INT 是什么,但 IT 更确切地说是什么?
\n
导入表,更准确地说是导入目录表,是一个条目数组(表),每个导入的库有一个条目(一行)(在您的情况下有3 个库,因此该表由3行组成)。
\n它的简化图片在这里:
\n\n每行由 5 个双字(指针)组成。对我们来说,只有 3 个重要,第一个(指向 ILT 的指针),最后一个(指向 IAT 的指针),最后一个(通过 DLL 的名称标识行;所以它是一个指针)提示/名称表中的 DLL 名称)。
\n导入目录表与其他两个表的配合如下所示:
\n\n(在这张图中我省略了与第三个表的合作,已经提到过提示/名称表。)
\n注意:我故意省略了图片中的零填充分隔行,并且我没有按序数处理导入(为了简单起见,强调想法)。
\n从手册第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
Run Code Online (Sandbox Code Playgroud)
注意:由于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
Run Code Online (Sandbox Code Playgroud)
导入地址表的结构和内容与导入查找表的结构和内容相同,直到文件绑定为止.在绑定期间,导入地址表中的条目将被导入的符号的32位(或64位(PE32 +)地址覆盖:这些地址是符号本身的实际内存地址(尽管从技术上讲,它们仍然是称为"虚拟地址").绑定的处理通常由加载器执行.
上面的所有引用和表格均来自参考文献2中列出的Microsoft PE/COFF手册.