判断是否虚拟机

来源:互联网 发布:meryl streep 人工智能 编辑:程序博客网 时间:2024/05/17 22:41
Opt("MustDeclareVars", 1)If _VCheck() Then        MsgBox(0, "", "True")Else        MsgBox(0, "", "False")EndIf Func _VCheck()        Local $strComputer = ".", $sMake, $sModel, $sBIOSVersion, $bIsVM, $sVMPlatform        Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")        Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")        If IsObj($colItems) Then                For $objItem In $colItems                        ;MsgBox(0,"","Name: " & $objItem.Name)                        $sMake = $objItem.Manufacturer                        $sModel = $objItem.Model                Next        EndIf         $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", 0x10 + 0x20)        If IsObj($colItems) Then                For $objItem In $colItems                        ;MsgBox(0,"",$objItem.BIOSVersion(0))                        $sBIOSVersion = $objItem.SMBIOSBIOSVersion                Next        EndIf         $bIsVM = False        $sVMPlatform = ""         MsgBox(0, "", "Manufacturer=" & $sMake)        MsgBox(0, "", "Model=" & $sModel)        MsgBox(0, "", "BIOSVersion=" & $sBIOSVersion)        If $sModel = "Virtual Machine" Then                ; Microsoft virtualization technology detected, assign defaults                $sVMPlatform = "Hyper-V"                $bIsVM = True                ; Try to determine more specific values                Switch $sBIOSVersion                        Case "VRTUAL - 1000831"                                $bIsVM = True                                $sVMPlatform = "Hyper-V 2008 Beta or RC0"                        Case "VRTUAL - 5000805", "BIOS Date: 05/05/08 20:35:56  Ver: 08.00.02"                                $bIsVM = True                                $sVMPlatform = "Hyper-V 2008 RTM"                        Case "VRTUAL - 3000919"                                $bIsVM = True                                $sVMPlatform = "Hyper-V 2008 R2"                        Case "A M I  - 2000622"                                $bIsVM = True                                $sVMPlatform = "VS2005R2SP1 or VPC2007"                        Case "A M I  - 9000520"                                $bIsVM = True                                $sVMPlatform = "VS2005R2"                        Case "A M I  - 9000816", "A M I  - 6000901"                                $bIsVM = True                                $sVMPlatform = "Windows Virtual PC"                        Case "A M I  - 8000314"                                $bIsVM = True                                $sVMPlatform = "VS2005 or VPC2004"                EndSwitch        ElseIf $sModel = "VMware Virtual Platform" Then                ; VMware detected                $sVMPlatform = "VMware"                $bIsVM = True        ElseIf $sModel = "VirtualBox" Then                ; VirtualBox detected                $bIsVM = True                $sVMPlatform = "VirtualBox"        Else        EndIf        If $bIsVM Then                MsgBox(0, "", "IsVirtualMachine=True")                MsgBox(0, "", "VirtualMachinePlatform=" & $sVMPlatform)        Else                MsgBox(0, "", "IsVirtualMachine=False")        EndIf        Return $bIsVMEndFunc   ;==>_VCheck



$a = _CheckVM()If $a = "" Then        MsgBox(0, "我不在虚拟机里", "我不在虚拟机里!")Else        MsgBox(0, "我在虚拟机里!", "我在虚拟机里,我的理由是" & @CRLF & @CRLF & $a)EndIf ;检查是否运行于虚拟机环境。返回空值说明运行于真实环境,返回一个字符串,说明运行于虚拟机环境并给出解释。;方法:检查虚拟机服务/进程,硬盘,BIOS 主板/芯片组;发现2个以上即确定为虚拟机环境 Func _CheckVM()        $strComputer = '.'        $objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')        $vmhit_count = 0        $vmhit_details = ""        ; 检查虚拟机管理程序        If ProcessExists("VBoxService.exe") Or ProcessExists("VBoxTray.exe") Or ProcessExists("VMwareTray.exe") Or ProcessExists("VMwareUser.exe") Then _AddVMHit($vmhit_count, $vmhit_details, "RUNNING SOFTWARE", "Found a Vbox or VMware guest OS service or tray process")        ; 检查虚拟机设备        If Not IsObj($objWMIService) Then                MsgBox(0, "", "? WTF?")                Return ""        EndIf        ; 检查虚拟机硬盘        $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL', 0x10 + 0x20)        If IsObj($colItems) Then                For $objItem In $colItems                        $vReturn = $objItem.Model                        Select                                Case StringInStr($vReturn, "VBOX HARDDISK")                                        _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""VBOX HARDDISK""")                                Case StringInStr($vReturn, "QEMU HARDDISK")                                        _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""QEMU HARDDISK""")                                Case StringInStr($vReturn, "VMWARE VIRTUAL IDE HARD DRIVE")                                        _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""VMWARE VIRTUAL IDE HARD DRIVE""")                                Case StringInStr($vReturn, "VMWARE Virtual S SCSI Disk Device")                                        _AddVMHit($vmhit_count, $vmhit_details, "DISKS", "Found device ""VMWARE Virtual S SCSI Disk Device""")                        EndSelect                Next        EndIf        ; 检查虚拟机BIOS        $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", 0x10 + 0x20)        If IsObj($colItems) Then                For $objItem In $colItems                        Select                                Case StringInStr($objItem.BIOSVersion(0), "Vbox")                                        _AddVMHit($vmhit_count, $vmhit_details, "BIOS", "Found Vbox BIOS version")                                Case StringInStr($objItem.SMBIOSBIOSVersion, "virt")                                        _AddVMHit($vmhit_count, $vmhit_details, "BIOS", "Found Vbox BIOS version")                        EndSelect                Next        EndIf        ; 检查虚拟机主板/芯片组        $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Baseboard", "WQL", 0x10 + 0x20)        If IsObj($colItems) Then                For $objItem In $colItems                        Select                                Case StringInStr($objItem.Name, "Base Board") And StringInStr($objItem.Product, "440BX Desktop Reference Platform")                                        _AddVMHit($vmhit_count, $vmhit_details, "MOTHERBOARD", "Found VMware-style motherboard, ""440BX Desktop Reference Platform"" / Name=""Base Board""")                        EndSelect                Next        EndIf        If $vmhit_count >= 2 Then                Return $vmhit_details & @CRLF & @CRLF & "Hits in " & $vmhit_count & " of 4 hardware categories - probably a virtual machine."        Else                Return ""        EndIfEndFunc   ;==>_CheckVM  Func _AddVMHit(ByRef $vmhit_count, ByRef $vmhit_details, $this_hit_category, $this_hit_text)        If StringInStr($vmhit_details, "In CATEGORY:" & $this_hit_category & ":") Then                $vmhit_details &= " and " & $this_hit_text        Else                If $vmhit_details > "" Then $vmhit_details &= @CRLF                $vmhit_details &= "In CATEGORY:" & $this_hit_category & ": " & $this_hit_text                $vmhit_count += 1        EndIfEndFunc   ;==>_AddVMHit


0 0
原创粉丝点击