生活随笔
收集整理的這篇文章主要介紹了
判断程序是否运行在虚拟机中的代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先我們要了解一下什么是虛擬機, 對虛擬機的通用解釋是通過軟件模擬的具有完整硬件系統功能的, 運行在一個完全隔離環境中的完整計算機系統. 通過虛擬機軟件, 你可以在一臺物理計算機上模擬出一臺或多臺虛擬的計算機, 這些虛擬機就像真正的計算機那樣進行工作, 例如你可以安裝操作系統, 安裝應用程序, 訪問網絡資源等等. 對于你而言, 它只是運行在你物理計算機上的一個應用程序, 但是對于在虛擬機中運行的應用程序而言, 它就像是在真正的計算機中進行工作. 因此, 當我在虛擬機中進行軟件評測時, 可能系統一樣會崩潰, 但是, 崩潰的只是虛擬機上的操作系統, 而不是物理計算機上的操作系統, 并且, 使用虛擬機的恢復功能, 我可以馬上恢復虛擬機到安裝軟件之前的狀態. 現在比較流行的虛擬機軟件有 VMWare 和 Microsoft Virtual PC , 它們都能在 Windows 系統上虛擬出多個計算機, 用于安裝 Windows 或其他操作系統. 相比而言, VMWare 不論是在多操作系統的支持上, 還是在執行效率上, 都比 Microsoft Virtual PC 明顯高出一籌. 但是 VMWare 沒有虛擬顯卡, 而是通過 VMWare Tools 才能用上高分辨率和真彩色. Microsoft Virtual PC 模擬了一個比較通用的顯卡:S3Trio32/64(4M), 這點看來比較通用, 易用性較好.?
??????以下主要代碼主要判斷程序是否在虛擬機環境中運行, 測試環境為 Windows 系統, 在 Windows XP SP2 + Microsoft Visual C++ 2003 下調試成功, 附編譯的檢測程序
// test.cpp : 定義控制臺應用程序的入口點。
//#include "stdafx.h"
#include "windows.h"DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep);
bool IsInsideVPC();
bool IsInsideVMWare();
int CheckVPC();int CheckVPC()
{if (IsInsideVPC())MessageBox(NULL, "你在虛擬電腦Microsoft Virtual PC中!", "提示", MB_OK | MB_ICONINFORMATION);else if (IsInsideVMWare())MessageBox(NULL, "你在虛擬電腦VMWare中!", "提示", MB_OK | MB_ICONINFORMATION);elseMessageBox(NULL, "你在真實的電腦中!", "提示", MB_OK | MB_ICONINFORMATION);return 0;
}DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)
{CONTEXT *ctx = ep->ContextRecord;ctx->Ebx = -1;ctx->Eip += 4;return EXCEPTION_CONTINUE_EXECUTION;
}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_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;
}bool IsInsideVMWare()
{bool rc = true;__try{__asm{push edxpush ecxpush ebxmov eax, 'VMXh'mov ebx, 0mov ecx, 10mov edx, 'VX'in eax, dxcmp ebx, 'VMXh'setz[rc]pop ebxpop ecxpop edx}}__except (EXCEPTION_EXECUTE_HANDLER){rc = false;}return rc;
}int _tmain(int argc, _TCHAR* argv[])
{return CheckVPC();return 0;
}
總結
以上是生活随笔為你收集整理的判断程序是否运行在虚拟机中的代码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。