在 C++ 中更改函数 return 的值(在运行时)
Changing function return value in C++ (In runtime)
我想更改外部函数(在运行时)的 return 值,它位于程序启动时加载的另一个 dll 中。
我想做的实际例子:
dll中的函数:
int numberOfMoney() {
return 0;
}
我的主程序:
HMODULE handle = LoadLibraryA("/myDll.dll");
auto gotFunc = GetProcAddress(handle, "numberOfMoney");
// making numberOfMoney returning 1000 ???
有谁知道我该怎么做?也许没有外部库?谢谢!
您可以通过挂钩在运行时更改函数或函数的 return。挂钩函数有几种不同的技术。最常见的称为热补丁,它在 x86 中使用到中间件函数的相对跳转指令覆盖函数的前五个字节。中间件函数然后可以选择 return 给调用者或调用 trampoline 的一段代码。 trampoline 恢复原来被替换的代码,跳回原来的热补丁函数+5,防止非终止循环。
还有 IAT 挂钩,但更多的是挂钩 API 调用,这些调用通过位于 executable 文件的 headers 中的导入地址 table 解析其地址格式。
VMT 是另一种形式的挂钩,其中虚拟方法可以被挂钩,因为它的地址在虚拟方法中被替换 table。类似于 IAT,但 object 的每个实例都指向虚拟方法 table.
看看这个book这是我最初了解 IAT 和热补丁的地方。
我想更改外部函数(在运行时)的 return 值,它位于程序启动时加载的另一个 dll 中。
我想做的实际例子:
dll中的函数:
int numberOfMoney() {
return 0;
}
我的主程序:
HMODULE handle = LoadLibraryA("/myDll.dll");
auto gotFunc = GetProcAddress(handle, "numberOfMoney");
// making numberOfMoney returning 1000 ???
有谁知道我该怎么做?也许没有外部库?谢谢!
您可以通过挂钩在运行时更改函数或函数的 return。挂钩函数有几种不同的技术。最常见的称为热补丁,它在 x86 中使用到中间件函数的相对跳转指令覆盖函数的前五个字节。中间件函数然后可以选择 return 给调用者或调用 trampoline 的一段代码。 trampoline 恢复原来被替换的代码,跳回原来的热补丁函数+5,防止非终止循环。
还有 IAT 挂钩,但更多的是挂钩 API 调用,这些调用通过位于 executable 文件的 headers 中的导入地址 table 解析其地址格式。
VMT 是另一种形式的挂钩,其中虚拟方法可以被挂钩,因为它的地址在虚拟方法中被替换 table。类似于 IAT,但 object 的每个实例都指向虚拟方法 table.
看看这个book这是我最初了解 IAT 和热补丁的地方。