写一个demo,hook写法
时间: 2023-12-14 11:39:55 浏览: 81
以下是一个简单的 demo,演示了如何使用 Hook 来修改函数的行为,具体来说,这个 demo 实现了一个简单的加法器,但是在加法器计算结束后会输出一段字符串 "Hooked!",以示我们成功地使用了 Hook 修改了函数的行为。
```c++
#include <iostream>
#include <Windows.h>
// 原始的加法函数
int add(int a, int b) {
return a + b;
}
// Hook 后的加法函数
int hooked_add(int a, int b) {
int result = add(a, b);
std::cout << "Hooked!" << std::endl;
return result;
}
int main() {
// Hook 前调用原始的加法函数
std::cout << add(1, 2) << std::endl;
// Hook
DWORD old_protect;
VirtualProtect((LPVOID)add, sizeof(add), PAGE_EXECUTE_READWRITE, &old_protect);
*(uintptr_t*)add = (uintptr_t)hooked_add;
// Hook 后调用加法函数
std::cout << add(1, 2) << std::endl;
// 恢复原始函数
*(uintptr_t*)add = (uintptr_t)hooked_add;
VirtualProtect((LPVOID)add, sizeof(add), old_protect, &old_protect);
// 再次调用原始加法函数
std::cout << add(1, 2) << std::endl;
return 0;
}
```
在这个 demo 中,我们首先定义了一个简单的加法函数 `add`。然后我们实现了一个新的函数 `hooked_add`,它会在计算结束后输出一段字符串。
接着,我们使用 `VirtualProtect` 函数将 `add` 函数所在的内存页标记为可写,以便我们修改它。然后,我们将 `add` 函数的地址转换为 `uintptr_t` 类型的指针,并将这个指针的值修改为 `hooked_add` 函数的地址,实现了 Hook。
最后,我们再次将 `add` 函数的地址修改回原始的地址,并将内存页恢复为原始的保护级别。这样,我们就成功地完成了 Hook 的过程,并且在 Hook 后的加法函数计算结束后输出了一段字符串。
阅读全文