मैं एक ऐसा एप्लिकेशन विकसित करने की कोशिश कर रहा हूं जो यह पता लगाता है कि प्रोग्राम वर्चुअल मशीन के अंदर चल रहा है या नहीं।64-बिट विंडोज़ वीएमवेयर पहचान
के लिए 32-बिट विंडोज, वहाँ पहले से ही तरीकों नीचे दिए गए लिंक में विस्तार से बताया है: http://www.codeproject.com/Articles/9823/Detect-if-your-program-is-running-inside-a-Virtual
मैं आभासी पीसी और एक 64-बिट विंडोज ऑपरेटिंग सिस्टम में VMware का पता लगाने के बारे में कोड अनुकूल करने के लिए कोशिश कर रहा हूँ। वीएमवेयर के लिए, कोड एक विंडोज एक्सपी 64-बिट ओएस में सफलतापूर्वक पता लगा सकता है। लेकिन जब मैं इसे मूल प्रणाली (विंडोज 7 64-बिट ओएस) में चलाता हूं तो प्रोग्राम क्रैश हो जाता है।
मैंने कोड को .asm फ़ाइल में रखा है और ml64.exe फ़ाइल के साथ कस्टम बिल्ड चरण को परिभाषित किया है। के लिए 64-बिट Windows एएसएम कोड है:
__try
{
returnValue = IsInsideVM();
}
__except(1)
{
returnValue = false;
}
अग्रिम धन्यवाद:
IsInsideVM proc
push rdx
push rcx
push rbx
mov rax, 'VMXh'
mov rbx, 0 ; any value but not the MAGIC VALUE
mov rcx, 10 ; get VMWare version
mov rdx, 'VX' ; port number
in rax, dx ; read port
; on return EAX returns the VERSION
cmp rbx, 'VMXh'; is it a reply from VMWare?
setz al ; set return value
movzx rax,al
pop rbx
pop rcx
pop rdx
ret
IsInsideVM endp
मैं की तरह एक cpp फ़ाइल में इस हिस्से कहते हैं।
वैसे हाँ, हार्डवेयर पोर्ट्स तक पहुंचने का प्रयास करना, जो एक विशेषाधिकार प्राप्त ऑपरेशन है, उपयोगकर्ता कोड में फंस जाएगा। आपको एसईएच का उपयोग करके अपवाद पकड़ने की जरूरत है। ऐसा लगता है कि आप कोशिश कर रहे हैं, लेकिन आपने (1) कंपाइलर विकल्प या (2) डीबगर ट्रेस नहीं दिखाया है। –