/* RDSTC is a famous x86 instruction to count the number of cycle since reset. This can be used to detect the VM. Thanks to Forcepoint for blog article. */ #define LODWORD(_qw) ((DWORD)(_qw)) BOOL rdtsc_diff_locky() { ULONGLONG tsc1; ULONGLONG tsc2; ULONGLONG tsc3; DWORD i = 0; // Try this 10 times in case of small fluctuations for (i = 0; i < 10; i++) { tsc1 = __rdtsc(); // Waste some cycles - should be faster than CloseHandle on bare metal GetProcessHeap(); tsc2 = __rdtsc(); // Waste some cycles - slightly longer than GetProcessHeap() on bare metal CloseHandle(0); tsc3 = __rdtsc(); // Did it take at least 10 times more CPU cycles to perform CloseHandle than it took to perform GetProcessHeap()? if ((LODWORD(tsc3) - LODWORD(tsc2)) / (LODWORD(tsc2) - LODWORD(tsc1)) >= 10) return FALSE; } // We consistently saw a small ratio of difference between GetProcessHeap and CloseHandle execution times // so we're probably in a VM! return TRUE; }