在没有编辑主dll的情况下覆盖另一个dll中的函数

时间:2009-07-09 21:18:37

标签: c++ dll

这个我编写脚本的游戏使用了我们编写脚本的主dll(创造性地命名为“scripts.dll”

这个scripts.dll,服务器端,加载其他插件(.dll)。

问题: 我需要覆盖scripts.dll中的现有函数,例如pluginA.dll,而不会调用scripts.dll中的函数。

我有想法可能会抓取scripts.dll中的地址并用(memcpy()?)我的新函数的地址覆盖它。

哦,功能名称相同。

2 个答案:

答案 0 :(得分:2)

这是一个相当大的主题,需要冗长的答案,但幸运的是,它已在其他地方详细介绍过。 This CodeProject article是关于这个主题的相当不错的读物 - 它解释了理论,以及如何使用方便的Microsoft Detours库来轻松完成这项工作。

答案 1 :(得分:1)

首先,我会尝试调整调用者以从pluginA.dll获取此特定函数指针,而不是从scripts.dll通过GetProcAddress获取。

如果这不可行,我会用新指令的跳转指令覆盖旧函数的开头。 x86上的跳转指令是“E9 XX XX XX XX”;注意目标地址是在跳转后相对于PC的。如果您没有x86,机器代码当然会有所不同。