gpt4 book ai didi

api - 为什么某些函数在导入表中出现多次?

转载 作者:行者123 更新时间:2023-12-03 15:56:32 26 4
gpt4 key购买 nike

我正在开发一个用 Delphi XE2 编写的资源泄漏检测单元。我想监视句柄(文件句柄、事件句柄等)和GDI对象(位图、画笔等)的创建和删除。因此,每次创建句柄或 GDI 对象时,我都想将其放入列表中,当它被删除时,我将其删除。这样我就能够检测泄漏或重复删除。为了实现这一点,我通过更改导入表来 Hook 静态链接的 api。延迟加载或通过 GetProcAddress 获取的 Api 的 Hook 方式不同,但这对我的问题并不重要。

背景信息就讲这么多,现在让我们继续讨论问题。

当我为静态链接函数编写 Hook 算法时,我必须研究 PE 文件格式,特别是导入表。我注意到一些导入的函数(在我的例子中例如“CloseHandle”)被导入了两次!我还发现有些模块出现了不止一次。例如,模块“kernel32.dll”比我正在处理的应用程序出现了 6 次。

我的问题是,为什么某些函数在导入表中出现多次。而且,为什么有些模块在导入表中出现多次?

在我的应用程序中,我只是将所有出现的函数替换为我的函数( Hook ),但我想知道这些重复的原因是什么。当我知道原因后,我可能需要更改我的应用程序。

最佳答案

如果您以不同的单位多次声明外部导入,它将多次出现在导入表中。编译器/链接器不会将它们合并在一起。

如果您在同一单元中多次声明外部导入,编译器/链接器会将它们合并为一个。

关于CloseHandle,它是在Windows单元中声明的。但除此之外,它还在 WindowsAPIs.inc 中声明,该文件包含在 System 单元中。这是对于初学者的两个声明。显然,您的程序使用了重新声明 CloseHandle 的其他单元。

关于api - 为什么某些函数在导入表中出现多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17293707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com