假设我有一个名为middle.dll的dll,它是从runme.dll导入函数的
我现在有一个替代的runmeDBG.dll,它具有和runme.dll一样的导出function
有没有办法使用middle.dll,但有它链接到从runmeDBG.dll导出的function,而不是runme.dll?
我可以更改middle.dll的代码,但不知道将包含我生成middle.dll时使用的函数的dll的名称。
(所有这些在C / C ++和Mingw工具集的背景下)
我假设middle.dll不是你的,它静态链接到runme.dll。 不,在静态链接的情况下无法更改dll名称; 你可以,但是,将runmeDBG.dll重命名为runme.dll,并将其放在dll loader将找到它的地方。 或者使用清单将可执行文件直接指向特定的路径。 runme.dll并不是必需的,是吗?
如果通过使用GetProcAddress
访问DLL中的所有函数,那么是的,您可以在运行时切换使用哪个模块。 只需加载替代模块(请参阅LoadLibrary
),并将其句柄用作GetProcAddress
的参数。
你可能不想使用这个太可能导入,但会变得非常单调乏味!
只需重命名替换,并将其放在与您的可执行文件相同的目录。
这个问题很古老,但是我在Google中首次发现它,因为我遇到了一个非常类似的问题,然后在其他地方找到了更好的解决方案。 这是我发现的解决方案在另一个线程中解释:延迟加载DLL。
如何重命名一个DLL,但仍然允许EXE找到它?
例如,如果将DLL设计为静态链接(使用接口中的类),但是您需要实际加载它而不更改其接口,则此技术可能非常有用。 您只需告诉Windows延迟加载DLL,并在实际加载DLL时,Windows调用您的预加载钩子,然后您只要将句柄返回到具有相同接口的不同的DLL(可能具有不同的名称)。