查看: 7551|回复: 5
收起左侧

[其他相关] 如何判断程序或系统运行在虚拟机上

[复制链接]
种过一豆
发表于 2011-7-3 15:10:57 | 显示全部楼层 |阅读模式
本帖最后由 种过一豆 于 2011-7-3 15:14 编辑

在别的地方看到的,前段时间似乎有人“炫耀”过能判断运行环境的程序,贴上一段摘录来的文字(看不懂,代码噢),有兴趣的可以去参研一下,这篇文章的判断是用系统来分析的,不知道用应用程序的话是否有相通之处



========================================================================




如何判断 Linux 是否运行在虚拟机上


判断 OpenVZ/Xen PV/UML

判断 OpenVZ/Xen PV/UML 是最容易的,直接检查 /proc 下的相关目录和文件就可以知道,比如 OpenVZ VPS 上会有 /proc/vz 这个文件;Xen PV 虚拟机上会有 /proc/xen/ 这个目录,并且目录下有一些东西;UML 上打印 /proc/cpuinfo 会找到 UML 标志。写了一个简单的 Python 脚本来检测:

#!/usr/bin/python
# check if a linux system running on a virtual machine (openvz/xen pv/uml)
# written by http://www.vpsee.com

import sys, os

def main():
    if os.getuid() != 0:
        print "must be run as root"
        sys.exit(0)

    # check OpenVZ/Virtuozzo
    if os.path.exists("/proc/vz"):
        if not os.path.exists("/proc/bc"):
            print "openvz container"
        else:
            print "openvz node"

    # check Xen
    if os.path.exists("/proc/xen/capabilities"):
        if (os.path.getsize("/proc/xen/capabilities") > 0):
            print "xen dom0"
        else:
            print "xen domU"

    # check User Mode Linux (UML)
    f = open("/proc/cpuinfo", "r"); t = f.read(); f.close()
    if (t.find("UML") > 0):
        print "uml"

if __name__=="__main__":
    main()

判断 VMware/Xen HVM/KVM

如果使用的是 VMware/Xen HVM/KVM 这样的全虚拟就更难判断一些,最准确的办法是读取 CPUID 来判断,Xen 源代码下面有一段检测是否是 Xen 的 C 语言代码 tools/misc/xen-detect.c,这段代码提供了一个很好的例子,VPSee 重写了代码,用宏替代了函数,增加了对 VMware 和 KVM 的识别,用 gcc 编译后就可以运行:

/*
* check if a linux system running on a virtual machine (vmware/xen hvm/kvm)
* written by http://www.vpsee.com
*/
#include stdio.h
#include string.h

#define HYPERVISOR_INFO 0x40000000

#define CPUID(idx, eax, ebx, ecx, edx) \
    asm volatile ( \
        "test %1,%1 ; jz 1f ; ud2a ; .ascii \"xen\" ; 1: cpuid" \
        : "=b" (*ebx), "=a" (*eax), "=c" (*ecx), "=d" (*edx) \
        : "0" (idx) );

int main(void)
{
        unsigned int eax, ebx, ecx, edx;
        char string[13];

        CPUID(HYPERVISOR_INFO, &eax, &ebx, &ecx, &edx);
        *(unsigned int *)(string+0) = ebx;
        *(unsigned int *)(string+4) = ecx;
        *(unsigned int *)(string+8) = edx;

        string[12] = 0;
        if (strncmp(string, "XenVMMXenVMM", 12) == 0) {
                printf("xen hvm\n");
        } else if (strncmp(string, "VMwareVMware", 12) == 0) {
                printf("vmware\n");
        } else if (strncmp(string, "KVMKVMKVM", 12) == 0) {
                printf("kvm\n");
        } else
                printf("bare hardware\n");

        return 0;
}

判断 VirtualBox/Virtual PC

在 Linux 下运行 dmidecode 工具然后查找 Manufacturer: innotek GmbH, Manufacturer: Microsoft Corporation 关键字就能对应上 VirtualBox 和 Virtual PC.

评分

参与人数 1经验 +10 收起 理由
詩、未詺 + 10 感谢提供分享

查看全部评分

凌语
发表于 2011-7-3 16:33:06 | 显示全部楼层
沙发??
太深奥~
dopod2009
发表于 2011-7-3 16:38:21 来自手机 | 显示全部楼层
太深奥,虽然已经在学习linux。但是还是看不懂
jiao轩
发表于 2011-7-3 20:23:58 | 显示全部楼层
太强大了……
小白看不懂……
studycpp
发表于 2011-7-4 19:13:25 | 显示全部楼层
1.如果是正常程序,为何不让运行在虚拟机上,有什么不可告人的秘密。有这样的软件,立马删除
2.软件判断是不是虚拟机后,隐藏一些动作,继续执行而不表现一些动作;判断是正常机器,执行一些“额外的”动作,不过这些动作最终会被发现
3.既然使用虚拟机,那就肯定不是一般的用户,跟这些用户斗毫无意义

评分

参与人数 1人气 +1 收起 理由
ssama + 1 确实。。。这种软件不敢用

查看全部评分

无垠穹宇
发表于 2011-7-5 19:42:16 | 显示全部楼层
好多linux代码
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-11-24 22:36 , Processed in 0.132642 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表