【发布时间】:2014-01-24 13:28:00
【问题描述】:
我正在编写一个微小的字节码解释语言(或框架?vm?)。我知道 Windows 在堆栈上使用 PAGE_GUARD,我想使用它。
首先,我保留虚拟内存并在一页上执行 MEM_COMMIT/PAGE_GUARD。
pStack->end = VirtualAlloc(NULL, MaxSize, MEM_RESERVE, PAGE_READWRITE);
if (pStack->end != NULL)
{
pStack->bp = pStack->sp = pStack->base = pStack->end + MaxSize;
if (VirtualAlloc(pStack->base - PageSize, PageSize, MEM_COMMIT, PAGE_READWRITE | PAGE_GUARD) != NULL)
(我知道我应该提交(非 PAGE_GUARD)一页,但这是为了测试 PAGE_GUARD。)
我写__except如下:
__except (StackOnSEHExcept(GetExceptionInformation())) {}
/* A */
...
DWORD StackOnSEHExcept(PEXCEPTION_POINTERS exc)
{
if (exc->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
{
return EXCEPTION_CONTINUE_EXECUTION;
}
else
{
return EXCEPTION_CONTINUE_SEARCH;
}
}
(我也知道我应该提交/保护下一页,但这也是为了测试。)
当我触摸堆栈的内存时,会发生STATUS_GUARD_PAGE_VIOLATION。但在那之后,/* A */ 运行;
发生异常后Windows不会取消标记PAGE_GUARD吗?为什么这段代码不能正常工作?
而且,我不知道如何做这部分:(我也知道我应该提交/保护下一页,但这也是为了测试。)。我能怎么做?我想我应该 1. 获取受保护页面的地址 2. 提交/保护下一页,但我不知道该怎么做 1.
编辑:我知道怎么做 1. 被保护的地址在这里:
exc->ExceptionRecord->ExceptionInformation[1]
感谢您的帮助!
【问题讨论】:
-
您至少需要两页!一个提交和一个页面保护......
-
@JochenKalmbach 请阅读 (~)。我知道,但这是为了测试
PAGE_GUARD。