试着像MSVC那样做。他们直接调用UnhandledExceptionFilter来绕过应用程序的异常处理程序。 从gs_report.c(一些的#ifdefs跳过):
/* Make sure any filter already in place is deleted. */
SetUnhandledExceptionFilter(NULL);
UnhandledExceptionFilter((EXCEPTION_POINTERS *)&GS_ExceptionPointers);
TerminateProcess(GetCurrentProcess(), STATUS_STACK_BUFFER_OVERRUN);
另一种可能性是把一个空的处理程序在列表的头部。这样的事情:
#include <stdio.h>
#include <excpt.h>
#include <intrin.h>
int main()
{
__try
{
__writefsdword(0, -1); // put chain end marker (-1) in fs:0
*(int*)9 = 0; // trigger the exception
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Exception!\n"); // this does not appear
}
}
编辑:对不起,我没有注意到“没有源”,直到现在。但是如果你可以修补代码,你可以添加“mov fs:[0],-1”。
有趣...我可以做到这一点。不过,我以前从来没有编写过“葡萄酒” - 而且可能需要很长时间才能找到所有正确的地方。我希望别人能想出更容易的东西(...说那个人试图在一个半正确的模拟器下重新启动一个受保护的应用程序......,是的,我看到了讽刺) – viraptor 2010-08-29 04:36:43
添加了替代方法 – bdonlan 2010-08-29 04:49:59
不幸的是,似乎照顾了SIGSTOP,因为我只在日志中看到更多的SEH消息。 – viraptor 2010-08-29 16:26:18