有人知道Windows上PE可执行格式的'导入地址表'是'per dll'还是'per exe'?
答案 0 :(得分:1)
任何PE都可以有一个导入地址表,因此DLL和EXE都可以拥有它们。这是有道理的,因为两者都可以在其他二进制文件上具有依赖项(导入)。除非您正在进行动态加载(LoadLibrary
/ GetProcAddress
),否则在调用另一个模块时,您将拥有一个导入地址表。
您可以在Visual Studio中使用dumpbin
实用程序查看PE的导入:
user32.dll上的示例:
<强> C:\ Windows \ System32下&GT; dumpbin /进口 USER32.DLL 强>
Microsoft(R)COFF / PE 翻斗车版本10.00.30319.01 版权所有(C)Microsoft Corporation。 保留所有权利。
转储文件user32.dll
文件类型:DLL
部分包含以下内容 进口:
ntdll.dll 7DC60000 Import Address Table 7DCCACEC Import Name Table 0 time date stamp 0 Index of first forwarder reference 15A NtOpenKey 7A9 wcscat_s 7AD wcscpy_s ...
...和notepad.exe ...
C:\ Windows \ System32下&GT; dumpbin / imports Notepad.exe的强>
Microsoft(R)COFF / PE 翻斗车版本10.00.30319.01 版权所有(C)Microsoft Corporation。 保留所有权利。
转储文件notepad.exe
文件类型:EXECUTABLE IMAGE
部分包含以下内容 进口:
ADVAPI32.dll 1001000 Import Address Table 100A234 Import Name Table FFFFFFFF time date stamp FFFFFFFF Index of first forwarder reference 77C71C82 27E RegSetValueExW 77C7BCD5 26E RegQueryValueExW 77C7BED4 230 RegCloseKey ...
答案 1 :(得分:0)
IAT(导入地址表)是每个PE文件(dll和exe)。
当加载程序加载exe文件时,它将PE的每个部分复制到进程内存,除非为此部分设置了IMAGE_SCN_MEM_DISCARDABLE。 IAT位于.idata部分(msdn):
PE文件的.idata部分包含加载程序确定目标函数地址并将其修补到可执行映像所需的信息。 .idata部分(或导入表,我更喜欢称之为)...
没有为idata部分设置IMAGE_SCN_MEM_DISCARDABLE。因此,idata部分复制到内存中,exe和dll都有此部分 - 意味着IAT是每个PE。
我写了一个简单的dll加载器here,如果它有助于你理解。