每dll或每个exe的PE的“IMPORT ADDRESS TABLE”?

时间:2010-09-27 03:15:19

标签: windows dll exe portable-executable

有人知道Windows上PE可执行格式的'导入地址表'是'per dll'还是'per exe'?

2 个答案:

答案 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,如果它有助于你理解。