这个我编写脚本的游戏使用了我们编写脚本的主dll(创造性地命名为“scripts.dll”
这个scripts.dll,服务器端,加载其他插件(.dll)。
问题: 我需要覆盖scripts.dll中的现有函数,例如pluginA.dll,而不会调用scripts.dll中的函数。
我有想法可能会抓取scripts.dll中的地址并用(memcpy()?)我的新函数的地址覆盖它。
哦,功能名称相同。
答案 0 :(得分:2)
这是一个相当大的主题,需要冗长的答案,但幸运的是,它已在其他地方详细介绍过。 This CodeProject article是关于这个主题的相当不错的读物 - 它解释了理论,以及如何使用方便的Microsoft Detours库来轻松完成这项工作。
答案 1 :(得分:1)
首先,我会尝试调整调用者以从pluginA.dll获取此特定函数指针,而不是从scripts.dll通过GetProcAddress获取。
如果这不可行,我会用新指令的跳转指令覆盖旧函数的开头。 x86上的跳转指令是“E9 XX XX XX XX”;注意目标地址是在跳转后相对于PC的。如果您没有x86,机器代码当然会有所不同。