Visual C ++ – 重写从DLL导入的函数?

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

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

编辑:我得到它与我自己的DLL工作。 在构build时,链接时间码生成需要被禁用。 那么静态链接重写的函数呢?

Solutions Collecting From Web of "Visual C ++ – 重写从DLL导入的函数?"

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

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

如果你的应用程序已经存在,并且不能被修改 ,那么

你可以写代理DLL。 即让你自己的DLL叫kernel32.dll,把它放到应用程序目录,并让你的代理DLL提供所有功能应用程序的需求。 当然,您的自定义DLL应该重定向所有调用它不覆盖原来的kernel32.dll – 通过使用LoadLibrary加载原始的DLL。

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

整个事情是痛苦的,要做到这一点,你至少应该熟悉cli(命令行界面 – Windows上的cmd.exe)和dumpbin实用程序。 这个过时的教程可以让你开始。

或者,您可以尝试使用DLL注入或类似的技术。 也有“Detours”库,我没有使用(不知道为什么我要打扰它,如果我可以做一个代理DLL)。

如果你有源代码访问你的应用程序 ,只有程序的特定部分需要不同的例程…

然后简单地用你想要的任何名称(例如, myLoadLibrary )进行自定义例程。 然后制作一个使用#define的标题来重新定义你的例程。 即像#define LoadLibrary myLoadLibrary 。 在每个需要覆盖的文件中包含这个头文件,并确保它包含在<windows.h>