在我通过DLL注入(inject)进行修改的第三方应用程序中,有大量代码无意义地抛出EXCEPTION_SINGLE_STEP异常。我希望捕获该异常并将其完全丢弃。但是,Windows不断将其抛出,因此我的异常处理程序陷入了无尽的循环。

我的代码当前:

LONG WINAPI VEH_Handler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
    printf("Got an exception %X at address %X\n", ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress);

    if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP)
    {
        return EXCEPTION_CONTINUE_EXECUTION;
    }

    return EXCEPTION_CONTINUE_SEARCH;
}

//...

//in DllMain
AddVectoredExceptionHandler(1, VEH_Handler);

是否可以强制Windows忽略该异常并继续执行?

最佳答案

尝试将EIP移至下一条指令:

LONG WINAPI VEH_Handler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
  printf("Got an exception %X at address %X\n", ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress);
  if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP)
  {
    ExceptionInfo->ContextRecord->Eip++;
    return EXCEPTION_CONTINUE_EXECUTION;
  }
  return EXCEPTION_CONTINUE_SEARCH;
}

10-08 08:32