尝试像 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”。