【发布时间】:2018-11-06 14:23:31
【问题描述】:
我正在尝试使用 PAGE_GUARD 挂钩一个函数,但在调用页面/地址时它不会引发任何异常。
void HookMe(){
printf("Not hooked\n");
}
void GoodFnc(){
printf("Hooked!\n");
}
long ExceptionHandler(PEXCEPTION_POINTERS ex){
printf("ExceptionHandler called\n");
}
/*Called by CreateThread in main*/
DWORD WINAPI ExceptionTesting(LPVOID) {
DWORD old = 0;
AddVectoredExceptionHandler(1, ExceptionHandler);
if (VirtualProtect((LPVOID)HookMe, 1, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old))
printf("PAGE_GUARD set\n");
//This was for testing:
//*(char*)0 = 0;//ExceptionHandler gets called when ACCESS_VIOLATION happens
while (1) {
HookMe();
Sleep(1000);
}
return 0;
}
上面的代码每秒只会显示PAGE_GUARD set,然后是Not hooked,不会引发任何异常。
我还确保HookMe() 与ExceptionHandler(...) 和ExceptionTesting(LPVOID) 位于不同的内存页面中
导致任何类型的异常,例如 ACCESS_VIOLATION(如在无限循环上方的注释中所见)将导致 ExceptionHandler 被调用。
【问题讨论】:
-
AFAIK,
VirtualProtect不会抛出任何异常。您应该检查函数是否失败或成功,如果失败则调用GetLastError -
它确实成功了(
printf("PAGE_GUARD set\n");被调用)。虽然在循环中调用 HookMe() 时没有引发任何异常 -
你在调试器下测试吗?无论如何,您 page_guard 设置的不是单个函数地址,而是 1 页(0x1000 字节)。在这种保护之后,您的所有代码都可以成为页面保护。
-
并且您的代码无论如何都无效,甚至不会被编译。这是伪代码吗?