为什么 exe 的导入表对 kernel32.dll(或任何其他 dll)有两个引用?

逆向工程 视窗 x86 恶意软件 聚乙烯 安全
2021-07-09 22:00:49

据我所知,导入描述符表由_IMAGE_IMPORT_DESCRIPTOR结构数组组成。_IMAGE_IMPORT_DESCRIPTOR每个导入的 dll都有一个

我有一个 exe,其中有两个_IMAGE_IMPORT_DESCRIPTOR用于kernel32.dll
为什么会这样?
为什么这个 exe 需要导入 dll 两次?

注意:我正在使用PEview查看 PE 结构。PEview 是否有可能变得混乱?即使PEview 有问题,exe 是否可以导入相同的 dll 两次


我对 PE 结构中的 TLS 目录还有另一个疑问。

是TLS目录/表,其存在于IMAGE_OPTIONAL_HEADER所述的PE,本只有当EXE /程序使用的隐式TLS(即__declspec(thread)),而不是当我们使用API(使用功能类似于即明确的TLS TlsAllocTlsFreeTlsSetValueTlsGetValue等等)。

程序使用这个很常见吗?我在很多地方都读到过,这可以作为恶意可执行文件的启发式方法。

1个回答

理论上,导入表可以包含与导入一样多的对 DLL 的引用。产生这种效果的是链接器的一个功能,在某些情况下,链接器不执行任何类型的字符串池化。

Borland 产品将单元视为独立的对象,因此所使用的任何导入功能都包含在内,而无需参考任何其他功能。效果是一个 DLL 名称,为第一个单元的该 DLL 的一组导入;DLL 名称(可能是重复的),第二个单元的该 DLL 的一组导入(其中任何或全部也可能从第一组复制);等等。

就 TLS 而言,仅当程序使用显式 TLS 时才会出现 TLS 目录条目。即它声明了一个链接器可以看到的静态 TLS 条目,以及当程序第一次启动时 Windows 必须初始化的条目(因为程序可能会立即使用它)。动态TLS(TlsAlloc、TlsFree)的使用完全在程序控制范围内,需要程序自己进行初始化。