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