微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

shell_notifyicon:试图引用一个不存在的标记,没有显示图标

希腊字母在Windows Concole

如何确定帐户的types(AD用户与AD组)?

如何为新安装的Boost添加编译器包含path和链接器库path?

复制另一个HBITMAP的位图

防止键盘input到达窗口

shmget:不允许操作

如何保持过程的记忆保护

如何阅读由Visual C ++ 2010生成的汇编输出

套接字的function

是的,这不是什么大问题。 函数定义为__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> 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐