zoukankan      html  css  js  c++  java
  • 如何判断当前程序是否运行在虚拟机内

    最近写程序,碰到要检测程序是否运行在虚拟机内的问题。在网上找了一下,找到下面两个函数,可以检测程序是否运行在virtual machine中,支持VMWARE 和virtual pc检测. 主要的原理,都是利用virtual machine往往支持一些真实PC不支持的指令. 

    // IsInsideVPC's exception filter 
    DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep) 

    PCONTEXT ctx = ep->ContextRecord; 

    ctx->Ebx = -1; // Not running VPC 
    ctx->Eip += 4; // skip past the "call VPC" opcodes 
    return EXCEPTION_CONTINUE_EXECUTION; 
    // we can safely resume execution since we skipped faulty instruction 


    // High level language friendly version of IsInsideVPC() 
    bool IsInsideVPC() 

    bool rc = false; 

    __try 

    _asm push ebx 
    _asm mov ebx, 0 // It will stay ZERO if VPC is running 
    _asm mov eax, 1 // VPC function number 

    // call VPC 
    _asm __emit 0Fh 
    _asm __emit 3Fh 
    _asm __emit 07h 
    _asm __emit 0Bh 

    _asm test ebx, ebx 
    _asm setz [rc] 
    _asm pop ebx 

    // The except block shouldn't get triggered if VPC is running!! 
    __except(IsInsideVPC_exceptionFilter(GetExceptionInformation())) 



    return rc; 
    }下面是检测virtual PC的.bool IsInsideVMWare() 

    bool rc = true; 

    __try 

    __asm 

    push edx 
    push ecx 
    push ebx 

    mov eax, 'VMXh' 
    mov ebx, 0 // any value but not the MAGIC value 
    mov ecx, 10 // get VMWare version 
    mov edx, 'VX' // port number 

    in eax, dx // read port 
    // on return EAX returns the VERSION 
    cmp ebx, 'VMXh' // is it a reply from VMWare? 
    setz [rc] // set return value 

    pop ebx 
    pop ecx 
    pop edx 


    __except(EXCEPTION_EXECUTE_HANDLER) 

    rc = false; 


    return rc; 
    }

  • 相关阅读:
    解析三种常见分布式锁的实现
    RabbitMQ基础概念详解
    数据库事务概念
    ECIF与CRM
    MQ(消息队列)学习
    数据粒度的设计
    链表之 头节点与尾指针 区别
    牛客之错题(2016.1.15) && 带头节点与不带头的区别
    数据结构之递归回溯算法
    LeetCode--Single Number
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8529131.html
Copyright © 2011-2022 走看看