它应该做什么:让我们说某人想要编辑程序中的变量。好吧,您将能够看到篡改该变量的地址(例如,可能是mov
指令)。
我是怎么想的:我得到了该变量的地址,我使用VirtualProtect
对其进行PAGE_GUARD
保护,并创建了一个矢量异常处理程序检查EXCEPTION_GUARD_PAGE
并检查所访问的地址是否受保护,如果是,则保存最后访问该地址的地址(来自上下文)。
现在,我开始只是尝试创建一个简单的处理程序,看看它是否可以在进行更改时通知我,但它不起作用。首先,每当我尝试printf
变量上有PAGE_GUARD
的地址时,我就会得到一个访问异常,或者如果我在Visual Studio之外启动它就会崩溃。
我还尝试设置PAGE_NOACCESS
并处理向量处理程序中的EXCEPTION_ACCESS_VIOLATION
,但之后没有任何反应。
long __stdcall handler(EXCEPTION_POINTERS* pExceptInfo) {
if (EXCEPTION_GUARD_PAGE == pExceptInfo->ExceptionRecord->ExceptionCode)
printf("accessed by 0x%p\m", pExceptInfo->ContextRecord->Esp);
return EXCEPTION_CONTINUE_EXECUTION;
}
int main() {
int32_t nNumber = 555111222;
UINT_PTR uiNumberAddr = ReCa<UINT_PTR>(&nNumber);
DWORD dwOld(0);
VirtualProtect(reintepret_cast<void*>(uiNumberAddr), sizeof(uiNumberAddr), PAGE_GUARD, &dwOld);
AddVectoredExceptionHandler(1, handler);
for (;;) {};
getchar();
return 0;
}
对我的想法有什么想法以及它为什么不起作用?