Visual C ++ - 覆盖从DLL导入的函数?

时间:2012-03-05 12:15:30

标签: c++ windows visual-c++ dll c++11

我正在尝试覆盖kernel32.dll中的特定功能。是否有可能在静态库中重新定义该函数并强制可执行文件使用静态库中的那个?我想不同的联系可能会成为一个问题。

可以使用我自己的自定义DLL覆盖它。但问题是DLL本身需要链接到kernel32.dll,所以它忽略了我对该函数的定义。

编辑:我使用自己的DLL。在构建它时,需要禁用链接时间代码生成。那么静态链接被覆盖的函数呢?

3 个答案:

答案 0 :(得分:3)

如果我理解正确,您需要在kernel32.dll中使用Windows API函数的自定义行为。如果是这样,您需要挂钩到Windows API。一种方法是使用Detours。我自己没有尝试过,但这里是CodeProject文章的链接 - http://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours

答案 1 :(得分:2)

是的,这不是什么大问题。函数定义为__dllimport,但未指定从哪个 DLL导入。链接器只选择提供它们的第一个导入库。因此,。先通过你的图书馆。在MSVC中,您需要禁用“包含标准库”,因为它们位于自定义库之前。

答案 2 :(得分:0)

如果您的应用已存在且无法修改,则

你可以编写代理DLL。即制作你自己的dll名为kernel32.dll,将其放入应用程序目录,并使你的代理dll提供所有功能应用程序的需求。当然,您的自定义DLL应该重定向它不会覆盖到原始k​​ernel32.dll的所有调用 - 通过使用LoadLibrary加载原始dll。

因为LoadLibrary是由kernel32提供的,并且你代理的是kernel32,所以很可能你必须命名你的代理dll kernel33.dll并修补原始exe,并使它加载kernel33而不是kernel32。

整个问题是痛苦,要成功做到这一点,你应该至少熟悉cli(命令行界面 - Windows上的cmd.exe)和dumpbin实用程序。 This过时的教程可以帮助您入门。

或者,您可以尝试使用dll注入或类似技术。我还没有使用"Detours"库(如果我可以创建代理dll,我不知道为什么我还要打扰它)。

如果您对应用程序有源代码访问权限,并且只有程序的特定部分需要不同的例程......

然后只需使用您想要的任何名称制作自定义例程(例如myLoadLibrary)。然后创建一个使用#define重新定义例程的标题。即像#define LoadLibrary myLoadLibrary这样的东西。在您需要覆盖的每个文件中包含该标头,并确保在<windows.h>之后包含该标头。

相关问题