首页
社区
课程
招聘
如何判断程序是否在虚拟机下运行?
发表于: 2016-6-10 22:22 15530

如何判断程序是否在虚拟机下运行?

2016-6-10 22:22
15530
现在的淘宝的虚拟机非常厉害啊

号称

深度去除 Vm 标示 硬盘 ID 注册表 硬件信息虚拟化 系统内核底层修改

请问有什么办法对抗呢,,由于防止程序单机被多开..

程序不想在虚拟机下被运行.

以下是目前我已知的处理办法

1.遍历注册表

2.遍历的虚拟机进程

3.遍历虚拟机驱动文件

4.检测 MAC 特征

5.检测虚拟机虚拟硬件特征.

以上办法均有办法破解,,所以求赐教...

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
如果只是应用层检测比较容易过。若是有驱动权限可以很大概率检测到虚拟机。
2016-6-11 00:08
0
雪    币: 157
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
求指点!!
2016-6-11 01:09
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1.检测系统中有没有vmware的相关服务,一般在虚拟机上不会有,当然要隐藏好你代码,如果被发现,做一个假服务就轻松逃过;
2.利用虚拟机上特有的某些漏洞进行检测。
3.Google anti-ware,老外可能有办法~~~
暂时想到这些。
2016-6-11 04:26
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
分情况检测:
1、VT开启则从原理上检测VT。当然需要区分360核晶等正常杀软开启VT的情况,否则会误报。
2、VT关闭则检测影子页表或者检测二进制翻译等。
2016-6-11 11:28
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
你给那个系统发布以下阿 看看能否检测出来
2016-6-11 12:38
0
雪    币: 22
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
so 强大。。试试这个

....删除了。。

才下载了一个VM 确实能被迷惑。。。。
2016-6-11 16:55
0
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不同的hypervisor有不同的特征值可以检测, 比如说vmware, hyper-v, kvm, xen-hvm的虚拟机都比较简单,可以使用通用的cpuid 指令检测(0x40000000),它们都有对应的值标示自己是运行在虚拟机中, 其它的也都有相应的特征值可以提取,具体需要看对应资料。当然,如果专门为了欺骗guest里的应用,对hypervisor作了hack,就不一定容易找到了,需要多花些时间针对具体的案例分析。
2016-6-11 17:32
0
雪    币: 157
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
可否留个联系方式进一步探讨
2016-6-11 22:04
0
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
给你举个简单的例子吧:
#include <stdio.h>
#include <string.h>

int main() {

  char vendor[13];
  memset (vendor, 0, sizeof vendor);

  unsigned int eax = 0x40000000;
  unsigned int *sig = (unsigned int *) vendor;

  asm volatile (
        "xchgl %%ebx,%1; xor %%ebx,%%ebx; cpuid; xchgl %%ebx,%1"
        : "=a" (eax), "+r" (sig[0]), "=c" (sig[1]), "=d" (sig[2])
        : "0" (eax));
  vendor[12] = 0;

  if (!strcmp(vendor, "KVMKVMKVM")) {
     puts ("This is a KVM guest.");
  } else if (!strcmp(vendor, "VMwareVMware")) {
     puts ("This is a VMWare guest.");
  } else if (!strcmp(vendor, "Microsoft Hv")) {
     puts ("This is a Microsoft Hyper-V or Windows Virtual PC guest");
  } else if (!strcmp(vendor, "XenVMMXenVMM")) {
     puts ("This is a Xen HVM guest.");
  } else {
     puts ("This is a host or hypervisor is not detected correctly.");
  }

  return 0;
}


在KVM虚拟机里的结果:
$ gcc test.c -o detect_hypervisor; ./detect_hypervisor
This is a KVM guest.
2016-6-12 22:54
0
雪    币: 157
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=xylo;1433480]给你举个简单的例子吧:

#include <stdio.h>
#include <string.h>

int main() {

  char vendor[13];
  memset (vendor, 0, sizeof vendor);

  unsigned int e...[/QUOTE]

哈哈 这个代码不太懂
2016-6-15 21:23
0
游客
登录 | 注册 方可回帖
返回
//