阅读:6736回复:21
如何判断程序的执行环境是VM
小弟做程序的时候需要判断程序的执行环境,能不能提示下怎么样判断一程序是在VMWare或VirtuaPC中执行,谢谢。
|
|
最新喜欢:cnmv6 |
沙发#
发布于:2007-12-28 13:27
来段老V的代码 很古老的
抗VM分析 mov ecx, 0Ah ; CX=function# (0Ah=get_version) mov eax, 'VMXh' ; EAX=magic mov dx, 'VX' ; DX=magic in eax, dx ; specially processed io cmd ; output: EAX/EBX/ECX = data cmp ebx, 'VMXh' ; also eax/ecx modified (maybe vmw/os ver?) je under_VMware |
|
|
板凳#
发布于:2007-12-28 13:29
vm backdoor~
其实检查vmware还是很简单的~无数中方法~ |
|
|
地板#
发布于:2007-12-28 14:49
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; } bool IsInsideVPC() { bool rc = false; __try { _asm push ebx _asm mov ebx, 0 // Flag _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; } |
|
地下室#
发布于:2007-12-28 23:17
v1rus:你提到的方法我在VMWare6.0上测试是可以的,但由于环境的限制没有能够做出更多的测试,你以前详细的测试过吗? 在现在运行的主流虚拟机版本上(VM5及VirtualPC系列)上是不是都可以正常工作,谢谢
|
|
5楼#
发布于:2007-12-29 09:33
我只测试了几个版本,不敢说所有系列都行,当然理论上是行得通的,你自己测试看吧
|
|
6楼#
发布于:2007-12-29 19:34
给个通用判断的方法,不管VMWare或VirtuaPC都有效
int DCVM () { unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3"; *((unsigned*)&rpill[3]) = (unsigned)m; ((void(*)())&rpill)(); printf ("idt base: %#x\n", *((unsigned*)&m[2])); if (m[5]>0xd0) printf ("虚拟机\r\n", m[5]); else printf ("真实机器\r\n"); return 0; } |
|
7楼#
发布于:2008-01-02 14:27
引用第6楼xyzreg于2007-12-29 19:34发表的 : 貌似都无效,测了一下,在Visual Studio 2008下,直接运行和调试运行输出均不一样,一会是真实机器,一会是虚拟机。同一台机器出了两个结果。到底该相信谁。 typedef struct _IDTENTRY { unsigned short LowOffset; unsigned short selector; unsigned char unused_lo; unsigned char segment_type:4; //0x0E is an interrupt gate unsigned char system_segment_flag:1; unsigned char DPL:2; // descriptor privilege level unsigned char P:1; /* present */ unsigned short HiOffset; } IDTENTRY,*PIDTENTRY; IDTENTRY idt; __asm sidt idt 楼上不妨验证一下,到底是那个成员出了问题?还是通过获取中断向量判断是否运行在虚拟机本身就有问题? |
|
8楼#
发布于:2008-01-02 19:01
回楼上的,当然是按直接运行的算,东西又不是专门写来被调试的。。。
|
|
9楼#
发布于:2008-01-03 09:01
|
|
10楼#
发布于:2008-01-04 14:01
多核的问题,IDT地址不一样
|
|
11楼#
发布于:2008-01-04 18:21
|
|
12楼#
发布于:2008-01-05 01:03
继续回7楼的,redpill在判断真实机器时确实是有误判,是sidt的问题,改用sLdt的方法吧
#include <stdio.h> int LdtCheck() { unsigned char m[2]; __asm sldt m; //L,not i printf("LDTR: %2.2x %2.2x\n", m[0], m[1]); return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0; } int main(int argc, char * argv[]) { if (LdtCheck()) printf("Virtual Machine detected.\n"); else printf("Native machine detected.\n"); return 0; } |
|
13楼#
发布于:2008-01-05 06:41
看xx算法算pi 300W位的时间和cpu利用率
~~ 最简单的方法就是检查到安装有开发工具或者ida就不执行~~~ 拒绝在任何技术人员的pc上执行~~ |
|
|
14楼#
发布于:2008-01-05 13:51
看xx算法算pi 300W位的时间和cpu利用率???
xx算法,能不能说仔细些 ,谢谢 |
|
15楼#
发布于:2008-01-07 12:10
#include <stdio.h>
inline int idtCheck () { unsigned char m[2]; __asm sidt m; printf("IDTR: %2.2x %2.2x\n", m[0], m[1]); return (m[1]>0xd0) ? 1 : 0; } int gdtCheck() { unsigned char m[2]; __asm sgdt m; printf("GDTR: %2.2x %2.2x\n", m[0], m[1]); return (m[1]>0xd0) ? 1 : 0; } int ldtCheck() { unsigned char m[2]; __asm sldt m; printf("LDTR: %2.2x %2.2x\n", m[0], m[1]); return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0; } int main(int argc, char * argv[]) { idtCheck(); gdtCheck(); if (ldtCheck()) printf("Virtual Machine detected.\n"); else printf("Native machine detected.\n"); return 0; } 是能够测出来,但是编译时有下列警告信息,让人不爽。 C:\WINDDK\3790>cl test.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. test.c test.c(7) : warning C4409: illegal instruction size Microsoft (R) Incremental Linker Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /out:test.exe test.obj |
|
16楼#
发布于:2008-01-07 20:29
引用第13楼killvxk于2008-01-05 06:41发表的 : 算圆周率? |
|
|
17楼#
发布于:2008-01-08 01:18
“idtCheck();
gdtCheck(); ” 这两个没必要写,因为如果依照这两个来判断的话也会出现在真实机器上存在误判的情况,比较准确的是LdtCheck()。 |
|
18楼#
发布于:2008-01-08 11:35
引用第15楼guaiguaiguan于2008-01-07 12:10发表的 : __asm sldt word ptr m; |
|
|
19楼#
发布于:2008-01-08 14:15
引用第13楼killvxk于2008-01-05 06:41发表的 : ,另外可以自动清空磁盘中的文件的扇区。。 |
|
|
上一页
下一页