轉帖|使用教程|編輯:楊鵬連|2021-07-14 11:03:46.407|閱讀 373 次
概述:由于工作需要,經常會接觸一些加過殼的軟件,VMProtect是其中自己比較'欣賞'的一款加殼軟件,先從運行時開始分析。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
VMProtect是一種很可靠的工具,可以保護應用程序代碼免受分析和破解,但只有在應用程序內保護機制正確構建且沒有可能破壞整個保護的嚴重錯誤的情況下,才能實現最好的效果。
VMProtect通過在具有非標準體系結構的虛擬機上執行代碼來保護代碼,這將使分析和破解軟件變得十分困難。除此之外,VMProtect還可以生成和驗證序列號,限制免費升級等等。
VMProtect正版授權在線訂購享受最低價,僅售801元起!還不趕緊加入你的訂購清單?>>更多詳情可點擊咨詢購買
前言
由于工作需要,經常會接觸一些加過殼的軟件,VMProtect是其中自己比較'欣賞'的一款加殼軟件,曾考慮過做一次庖丁解'V',無奈工作較忙,一直沒有合適的機會(太懶),不過,好在終于說服自己開始了。言歸正傳,先從運行時開始。
準備工作
將下述代碼編譯為控制臺X64可執行程序VMP.exe.
#include <stdio.h> int main() { auto v1 = 1; auto v2 = 2; auto vsum = v1 + v2; printf("1 + 2 = %d", vsum); getchar(); return 0; }
使用VMProtect Ultimate v 2.13.5 加殼處理,生成VMP_UserDebugger.exe:
分析過程-運行時
當執行到如下所示代碼處時,所需的寄存器環境已基本初始化完成完成(000-05B為寄存器初始化代碼):
此時,運行環境已基本初始化完成(分析見下文),需特別關注的寄存器如下表所示:
分析后續代碼:
可以看到,已經進入'VM'的世界了,需要注意到06F和073處代碼,可以發現對字節碼的'取'操作是逆序的(后文我們可以發現,對操作碼和操作數的'取'操作,皆是逆序進行的),將這個塊標記為VmInitialize。
繼續分析后面的Handler:可以看到是一個POP操作,將棧中數據POP到一個偽寄存器(BYTE:[RSI-1]指示了要POP到哪個寄存器),將這個代碼段標記為VmPOP8。
繼續:除了缺少RSI和R12的賦值,其它基本與VmInitialize相同,另外可以注意到操作碼的二者解碼算法是一致的,將其標記為VmJMP。
繼續:可以看到是一個PUSH操作,記為VmPUSH4, 注意10F處的ja,是棧溢出錯誤檢查,結合108處代碼,可以知道RDI指向的偽寄存器組的大小為0xE0這個事實。
跳過110處的VmJMP操作(參見上文),繼續:
這是一個基于棧的加法操作,將其標記為VmADD。我們參考VmADD實現,可以大膽猜測VMP的二元運算棧模型,如下圖:
至此,簡單總結一下,VMP維護了一個偽寄存器組(RDI),虛擬機棧(RBP),虛擬了PUSH, POP, JMP等指令,虛擬了基于棧的ADD等算術運算。
虛擬機運行時內存布局如下:
如果您對該加密/解密軟件感興趣,歡迎加入vmpQQ交流群:740060302
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: