о VirtualProtect
Изменяет защиту в области зафиксированных страниц в виртуальном адресном пространстве вызывающего процесса.
PAGES - не один байт.мы можем установить атрибут PAGE_GUARD
как минимум только на байт страницы (0x1000).в результате, когда вы пытаетесь установить PAGE_GUARD
для какой-либо функции - вы устанавливаете атрибут guard не только для него, но и для множества байтов вокруг него (до и после).в случае, если код такой ваш (в любом случае, ваш код является псевдокодом, который даже не компилируется) - более быстрое исключение будет только после VirtualProtect
return - при следующей инструкции после вызова.если вы хотите, чтобы страница защиты влияла только на одну функцию - вам нужно поместить ее в отдельный раздел exe, скажем, с помощью #pragma code_seg
.Также могу заметить - что не нужно никаких бесконечных циклов или отдельных потоков, созданных для теста
//#pragma code_seg(".guard")
void HookMe(){
MessageBoxW(0, 0, L"HookMe", MB_ICONINFORMATION);
}
#pragma code_seg()
LONG NTAPI ExceptionHandler(::PEXCEPTION_POINTERS pep)
{
if (pep->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
{
WCHAR msg[64];
swprintf(msg, L"guard violation at %p (%p)", pep->ExceptionRecord->ExceptionAddress, HookMe);
MessageBoxW(0, msg, L"ExceptionHandler", MB_ICONWARNING);
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
void gtest()
{
if (PVOID pv = AddVectoredExceptionHandler(TRUE, ExceptionHandler))
{
ULONG op;
if (VirtualProtect(HookMe, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &op))
{
HookMe();
}
RemoveVectoredExceptionHandler(pv);
}
}