外部地址
VMProtect是新一代軟件保護實用程序。VMProtect支持德爾菲、Borland C Builder、Visual C/C++、Visual Basic(本機)、Virtual Pascal和XCode編譯器。
在保護應用程序時,VMProtect 會利用在編譯期間釋放的空間來滿足自身需求,包括存儲各種數據(虛擬化或變異代碼、VM 解釋器等)。因此,當從程序的其他部分跳轉到受保護代碼“內部”時,可能會發生某些情況。執行此類跳轉的地址稱為外部地址。當使用代碼標記并且在標記內執行從程序的非保護部分跳轉時,可能會發生上述情況:
VMProtectBegin(無);
因為我:=0 到 10 做
開始
公司(J);
VM保護結束;
結尾;
在匯編代碼中,這個循環看起來像:
-------------- 標記開始 --------------
0044D12C 移動 eax,0000000B
0044D131 公司 ebx
--------------標記結束----------------
0044D132 dec eax
0044D133 jnz 0044D131
顯然,當0044D12C和0044D131地址的命令被虛擬化,并在0044D133執行非虛擬化條件跳轉時,會出錯,因為0044D131地址包含各種數據或只是垃圾而不是原始代碼。在這個例子中,0044D131 是一個外部地址。
啟用“調試模式”選項后,INT 03 命令將替換原始代碼。這是一個簡單的斷點和調試器命令。當受保護的應用程序在調試器下執行并且控制被傳遞到 0044D131 地址時,斷點被激活,并且調試器窗口顯示給定跳轉的起始地址。
當檢測到此類跳轉時,我們建議檢查所有代碼標記,看它們是否設置正確。如果未標記受保護代碼,或者無法更改程序邏輯以避免在受保護代碼內部傳遞控制權,則應在 GUI 中將此類地址標記為外部地址。