You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows特权指令异常处理问题:嵌入Go程序时VEH拦截失效

VMware虚拟机检测代码在Go应用中崩溃的原因分析

我编写了一段通过in指令检测VMware虚拟机存在的代码,由于使用MinGW编译,无法使用__try/__except关键字。代码如下:

static char inside_vm;

static LONG WINAPI IsInsideVMWareExceptionHandler(
    struct _EXCEPTION_POINTERS *ExceptionInfo) {
  ExceptionInfo->ContextRecord->Rip += 1; // Skip 'in' instruction.
  return EXCEPTION_CONTINUE_EXECUTION;
}

int IsInsideVMWareVM(int vmware_v2) {
  inside_vm = TRUE;

  void *handler = AddVectoredExceptionHandler(
      1, IsInsideVMWareExceptionHandler);

  asm(
      "pushq %%rdx\n"
      "pushq %%rcx\n"
      "pushq %%rbx\n"

      "movl $0x564D5868,  %%eax\n" // 'VMXh' magic value
      "movl $0, %%ebx\n"           // any value but not the magic value
      "movl $10, %%ecx\n"          // get VMWare version
      "movl $0x5658, %%edx\n"      // VMWare hypervisor port
      "in %%dx, %%eax\n"           // read port,
                                   // on return EAX returns the VERSION
      "cmp $0x564D5868, %%ebx\n"   // is it a reply from VMWare?
      "setz %0\n"                  // set return value

      "popq %%rbx\n"
      "popq %%rcx\n"
      "popq %%rdx\n"
      : "=a"(inside_vm)
    );

  RemoveVectoredExceptionHandler(handler);

  return inside_vm;
}

问题在于,在物理机上运行时,AddVectoredExceptionHandler()未必能拦截特权指令异常(0xc0000096)。该代码作为独立可执行文件运行正常,但集成到Go应用中时会因未处理的上述异常崩溃,请问可能的原因是什么?

更新:问题与Golang相关,Go使用向量异常处理(VEH)而非结构化异常处理(SEH)。


原因分析

  • VEH优先级与Go全局处理程序冲突:Go会注册自身的全局向量异常处理程序,即便你的处理程序设置了高优先级(AddVectoredExceptionHandler参数1),Go的VEH可能更早注册或拥有更高优先级,先捕获异常后直接终止进程,不会传递给你的处理程序。
  • Go运行时异常处理逻辑限制:Go的VEH是为处理自身运行时异常(如内存错误、goroutine panic)设计的,对于外部引入的特权指令异常,其处理逻辑不会遵循EXCEPTION_CONTINUE_EXECUTION返回值,直接判定为严重错误并触发崩溃。
  • MinGW编译代码与Go运行时兼容性差异:独立运行时系统默认异常链能正常传递异常到你的处理程序,但在Go进程中,Go的VEH会中断这个链条,导致自定义处理程序无法生效。
  • 线程上下文差异:你的C代码运行在Go管理的线程上下文里,Go的线程调度与异常处理绑定,特权指令触发的异常会被视为线程严重错误,直接终止线程或进程,不会交由自定义VEH处理。

内容的提问来源于stack exchange,提问作者ababo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:05:29