ببخشيد . اختلاف هست بين Virtual Machine و Virtual Drive . احتمالا منظور جلوگيري از اجراي برنامه در Virtual PC و Wmware WorkStation بوده است.
به طور كلي بيشتر قابليتهاي اين برنامه آش دهن سوزي نيستند و با استفاده از WinAPI به راحتي قابل پياده سازي هستند. مثلا براي جلوگيري از اجراي برنامه در هارد با GetModuleHandle مي توانيد Handle فايل در حال اجرا را بگيريد. بعد با GetModuleFileNameByHandle نام درايو و مسير فايل در حال اجرا را بدست بياوريد. بعد با GetDriveType مشخص كنيد كه آيا برنامه از درايو سي دي اجرا شده يا نه. اما از اين نظر كه يك نفر همه اين ها را در يكجا جمع آوري كرده و به صورن يك برنامه درست كرده كه نياز ديگران را به دستكاري در سورس از بين برده و مي شود به صورت اتوماتيك با فشار دادن يك كليد اين بلاها را بر سر برنامه آورد جالب هست.
کد:
BOOL DetectVMWare(void)
{
__try
{
__asm mov ecx,0ah
__asm mov eax,'VMXh'
__asm mov ebx,0x86D48565
__asm mov dx ,'VX'
__asm in eax,dx
__asm cmp ebx,'VMXh'
__asm je OutCode
return FALSE;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
OutCode:
return TRUE;
}
// IsInsideVPC's exception filter
DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)
{
PCONTEXT ctx = ep->ContextRecord;
ctx->Ebx = -1; // Not running VPC
ctx->Eip += 4; // skip past the "call VPC" opcodes
return EXCEPTION_CONTINUE_EXECUTION; // we can safely resume execution since we skipped faulty instruction
}
// high level language friendly version of IsInsideVPC()
BOOL DetectVPC(void)
{
BOOL rc = FALSE;
__try
{
_asm pushad
_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 byte ptr [rc]
_asm popad
}
// The except block shouldn't get triggered if VPC is running!!
__except(IsInsideVPC_exceptionFilter(GetExceptionInformation()))
{
}
return rc;
}
من اينترنت بدرد بخور ندارم . بدون حضور وكليم هيچ توضيحي نميدم.