void VFuncHook(uintptr_t VFunc, uintptr_t hookAddr)
{
// 假设 PAGE_SIZE 是系统的页面大小
size_t page_size = sysconf(_SC_PAGESIZE);
// 计算
addr
所在页的起始地址
void *page_start = (void *)((uintptr_t)VFunc & ~(page_size - 1));
// 计算要修改的地址的偏移量
size_t
offset
= (uintptr_t)VFunc - (uintptr_t)page_start;
// 新的权限:不可读写可执行
int
prot = PROT_READ | PROT_WRITE;
// 使用 mprotect 修改内存权限
if
(mprotect(page_start, page_size, prot) == -1)
{
LOGD(
"[-] mprotect Erro"
);
exit(EXIT_FAILURE);
}
Write<uintptr_t>(VFunc, hookAddr);
if
(mprotect(page_start, page_size, PROT_READ) == -1)
{
LOGD(
"[-] mprotect Erro"
);
exit(EXIT_FAILURE);
}
// LOGD(
"[+] Hook"
);
}