vmp殼基礎原理


VMP殼 :是用來保護關鍵的代碼段的一種加密殼
原理:抽出局部代碼,轉變為中間碼,虛擬機引擎對中間碼進行解釋,替代CPU解釋執行代碼,然后跳轉回源地址,每次執行都解釋執行一次代碼,虛擬機有一套自己的反編譯算法去解釋執行代碼:
比如
mov = 0xe8 ebx = 02 eax = 01 mov ebx,eax 被虛擬機解釋執行為 e8 02 01
注意:這套虛擬機對應的反編譯算法是根據程序的不同隨機的產生
 

 

 

VMP殼
原理 :把虛擬機執行的代碼, 在用自己的反匯編引擎分析出來,達到解密的效果
 
虛擬機句柄的概念:某一類的機器碼mov,add,等其他指令不同的解釋執行代碼
 
VMP殼加密代碼調用過程:
1 虛擬機申請一塊內存(可能在堆,可能在棧),保存寄存器環境,中間碼執行后的結果保存到申請內存的寄存器中,執行完后,把寄存器的環境賦值給真正的寄存器,相當於中間碼被cpu執行了
 
VMP堆棧圖

 

 

ebp 保存中間碼棧環境
esp 保存虛擬機環境的棧環境
 
 
 
補充:
1 中間碼和虛擬機引擎都會放在代碼段下面
2 虛擬機的分類:
棧式虛擬機- 所有操作數通過出棧入棧進行操作, 優點:中間碼體積小, 缺點:執行代碼效率低
中間碼: add eax0, ebx0 虛擬機:push eax0 push ebx0 pop ecx pop edx add ecx, edx mov eax0, ecx push ecx
注意:中間碼的寄存器帶個0
 
典型代表: java,lua5.0以前是 棧式虛擬機
 
寄存器式虛擬機 - 所有操作數通過內部寄存器操作,優點: 執行代碼效率高 缺點: 中間碼的體積大
有一塊內存, 相當於自己的寄存器,reg0 - reg16
中間碼:add eax0, ebx0 虛擬機: mov reg0, eax0 //reg0 reg1 等寄存器是虛擬機在堆中或棧中模擬的寄存器 mov reg1, ebx0 add reg0, reg1 mov eax0, reg0
 
典型代表: lua5.0以后,davik(android 5.0) 寄存器式虛擬機
 
jit - just in time ,即時編譯, 將中間碼翻譯成機器碼執行
典型代表: .net, android art, java現在版本
vmprotect


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM