2017-09-17 110 views
1

我試圖檢測我的Windows是否在虛擬機上運行。我發現這被稱爲喬安娜魯特克絲卡的紅色藥丸這個C代碼:當我在我的VC++項目它在線Red Pill檢測虛擬化

((void(*)())&rpill)(); 

失敗消息運行它

int swallow_redpill() 
{ 
    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3"; 
    *((unsigned*)&rpill[3]) = (unsigned)m; 
    ((void(*)())&rpill)(); 
    return (m[5]>0xd0) ? 1 : 0; 
} 

但是:訪問衝突執行位置0x003AFCE8。 我做錯了嗎?

+1

您試圖使用'rpill'中的數據作爲函數,但是程序中的正常數據不應該是可執行的,因此它不能被「調用」。如果您使用的是64位系統,其中地址大小爲64位? 'unsigned'類型等於'unsigned int',它在所有現代標準PC平臺上都是32位類型的,所以當你將它「修補」到代碼中時,'m'的地址可能會被截斷。 –

+0

@Someprogrammerdude是否意味着這不是工作方法?或者有什麼方法可以使這個解決方案在x86和x64系統上都能正常工作? – Kiramm

+0

指針問題很容易通過將您的程序構建爲32位可執行文件來解決。這不會解決數據無法執行的問題,但我不知道如何解決這個問題。 –

回答

0

顯然,示例代碼試圖執行的不同行爲的內部一些虛擬機比*一些」真正的硬件。請注意,其他的虛擬機可能無法與這種簡單的方法檢測到的機器指令序列。

代碼執行失敗的原因是,在現代操作系統上,您無法執行數據部分,您需要專門將該代碼部分放入可執行部分,或將數據部分更改爲可執行部分。