步驟2.5:將代碼鎖定在一個序列號上
VMProtect 是新一代軟件盜版保護解決方案。VMProtect 是目前強大的反盜版解決方案之一,許多領先的軟件發(fā)行商都在使用它。VMProtect允許保護可執(zhí)行文件(EXE,SCR),動態(tài)鏈接庫(DLL,OCX,BPL)和驅動程序(SYS)。
加密解密技術交流群(766135708)
破解程序常見的方法之一是找到檢查序列號的地方和附近的條件跳轉。如果序列號是正確的,程序的執(zhí)行就會向一個方向發(fā)展,如果不正確,則向另一個方向發(fā)展。黑客可以找到這個跳轉并將其替換為 "correct "的方式。讓我們用這種方式來 "crack "我們的測試程序,是通過直接在源代碼中進行測試。接著我們 "switch off "我們的條件跳轉:
char *serial = read_serial("serial.txt"); int res = VMProtectSetSerialNumber(serial); delete [] serial; if (false && res) {我們的程序接受任何序列號并正常工作。如果文件是通過VMProtect保護的,即使是有經驗的黑客也會花幾個月的時間來定位和修改條件跳轉??紤]到該程序在不同條件下多次檢查序列號,因此,即使是這樣一個簡單的檢查也是相當安全的。
將代碼鎖定在一個序列號上
VMProtect的演示版在處理功能的數量上有限制:只能處理一個功能。如果你使用演示版,你應該只在項目中包含 foo() 函數,否則 VMProtect 的演示版可以選擇 main() 函數,鎖定到一個序列號將無法進行工作。
VMProtect 的許可系統(tǒng)允許你將一個或多個函數的代碼鎖定在一個序列號上,這樣,如果沒有提供正確的序列號,就無法正常進行。函數的主體被虛擬化,然后被加密,只有用正確的序列號才能解密。這意味著,即使黑客發(fā)現(xiàn)并修復了序列號檢查中的條件跳轉,鎖定在序列號上的函數仍然不能工作。在 "Functions "部分選擇foo()函數,并在右側面板將 "Lock to Serial Number "選項改為 "Yes"。
保護該應用程序。由于我們已經 "hacked"了它,在serial.txt文件中放入一個任意的文本并運行該應用程序。下面的文字出現(xiàn)在控制臺:
C:\test>dummy_app.vmp.exe serial number is correct, calling foo()黑客 "fixed"了條件跳轉,程序以 "correct"方式運行。但是當調用foo()時,程序顯示了一條信息:
由于我們將foo()函數鎖定在序列號上,而黑客并沒有這個序列號,所以試圖解密該函數的代碼導致故障,無法繼續(xù)執(zhí)行程序。當按下 "OK "鍵時,程序關閉,"done "信息從未在控制臺顯示。
什么應該鎖定在一個序列號上?
將一個只應在程序的注冊版本中運行的功能鎖定在序列號上是有意義的。由于鎖定需要虛擬化,你應該考慮到一些性能的缺失。如果一個文本編輯器不允許在演示版本中保存結果,你可以將保存文檔的功能加密在一個序列號上。如果在操作過程中,這個函數調用了其他函數,也沒有必要加密它們,因為如果沒有主函數,它們就沒有任何用處。
你還應該記住,在沒有序列號的情況下調用被加密的函數會導致程序關閉,沒有機會保存工作結果。這就是為什么你應該徹底測試應用程序,以確保它不會在試用模式下調用這些函數。在上面的例子中,文本編輯器必須在演示模式下禁用 "Save "命令,并且不對Ctrl+S快捷鍵作出反應。當然,它也不應該要求在退出時保存文檔。如果你不注意這一點,用戶可能會對你的 "buggy "的演示版本感到失望。
鎖定到一個序列號和無效的序列號
當VMProtectSetSerialNumber()函數被調用時,許可模塊會檢查傳遞給該函數的序列號。只有在序列號在檢查時絕對正確的情況下才會執(zhí)行加密的代碼片段,沒有被列入黑名單,具有正確的硬件標識符,沒有過期等等。在這種情況下,所有的加密程序都會被執(zhí)行,直到應用程序被關閉,或者再次調用VMProtectSetSerialNumber()
一些限制會在程序執(zhí)行過程中 "trigger":例如,程序的運行時間可能會過期或序列號過期日期到來。在這種情況下,許可模塊仍然會加密并執(zhí)行鎖定在序列號上的功能。之所以如此,是因為被保護的程序很難檢測到這些限制觸發(fā)的時刻,并相應地改變行為(屏蔽相應的菜單項等)。如果許可模塊突然停止執(zhí)行鎖定在序列號上的代碼片段,這將很可能導致應用程序的故障。這就是為什么當序列號被設置后,會做出決定,并選擇相應的執(zhí)行模式。