人肉跟蹤VMProtect入口至出口運行全過程(1)
一 、前言
跟vmp正面剛的起因是想自己實現一個ARM VMProtect的保護軟體,作者在查閱了大量資料以後還是不太理解 VMProtect 到底是怎麼實現的,
終於意識到沒有紮實分析過 VMProtect ,只停留在看別人分析的臆想階段,是不可能理解VMProtect的。所以下定決心耐心分析,追隨大佬們的腳印前行,也開始自己為技術瘋狂的年月。
二 、分析的樣本
是使用vmp v2.04 虛擬難度下的最快速度(所有都不勾選)設置,對一條mov eax,0x77指令加保護的最簡單樣本,從頭到尾跟蹤完這個樣本,就理解 VMProtect的入口出口,虛擬寄存器、虛擬棧。分析記錄無視了一些並非新手最應該關注的細節,分析過程不保證完全準確,甚至有一些錯誤,希望大家能理解。
三、附件的內容
pdf和rar中是本菜跟vmp初次正面交鋒全過程記錄,逐條人肉記錄了指令執行的每一次堆棧和寄存器變化,爭取追究每個細節,過程寫的詳細而羅嗦,比較費時間,不適合高手看,不適合沒時間的人看,適合想寫出vmp的新手看。
四 、沒精力的同學
可以看貼子中提煉後的重點內容和附件.xlsx。希望對寫vmp感興趣但一知半解的人有所幫助。
五 、另外
建議動手調試vmp樣本前,最好看過其他一些幾篇文章,對vmp有一個初步的認識。
1 、虛擬機保護技術淺談
https://bbs.pediy.com/thread-139586.htm
2 、VMP虛擬機加殼的原理學習
https://www.tuicool.com/articles/bIFrMz
3 、動手實現代碼虛擬機
http://www.mottoin.com/87374.html
4 、VMProtect2.04加殼程序從入門到精通
https://bbs.pediy.com/thread-121412.htm
六 、重點內容提煉
提煉了下重點內容,沒時間的同學直接看這個過程:
首先打開附件(點擊文末「閱讀原文」即可獲取附件)
" 用Excel顏色標記出_VMProtect樣本Trace的內容的結構.xlsx ",
表格中我標出四中顏色,紫色、藍色、橙色、黃色
大概的規律是,紫色部分只出現了一次,後面全都是藍橙黃的組合
所以代碼分為兩個部分:(1)紫色(2)藍橙黃
1、 最開始紫色部分作用(vmp指令執行前的準備)
(1) 向正常棧push所有真實寄存器。
(2) 意圖在正常棧中構建出一個給vmp使用的空間。
(3) 此空間原則上一分為二。
上部分稱為context區,16個4位元組空間,每1個代表一個vmp虛擬寄存器,EDI記錄著它的上邊界。
下部分稱為運算區(或者叫vmp運算棧),是vmp指令執行用的棧,使用EBP記錄該vmp運算棧的棧頂。
(4) 第一步的push所有真實寄存器操作完成後,這些寄存器值正位於vmp運算棧中。
(5) 給ESI一個指向,後面會用這個指向去載入vmp的位元組碼。
2、藍-橙-黃部分作用(一條vmp指令的執行)
每一個藍橙黃組合,代表執行完一條vmp指令。
藍色:載入並解密位元組碼。
橙色:根據位元組碼數值計算出handler地址。
黃色:執行該handler邏輯。
3、前十幾個藍橙黃
前十幾個藍橙黃都是一種handler,是一種類似pop的操作,我們稱之它為vPop。
這十幾個vPop在做什麼呢?是將紫色部分向vmp運算棧存放的一堆真實寄存器值,移動到vm context區,一個vPop移動一個值。
每一個藍橙黃組合,代表執行完一條vmp指令,這十幾個藍橙黃,全是同樣的vPop操作。在專門的VMProtect調試器中,就是這樣的。相應的藍橙黃handler彙編代碼,這裡就不列出了。
4、對被保護代碼"mov eax,0x77"的模擬
為什麼說VMProtect是棧式虛擬機呢?
實現一條mov操作也要通過VMProtect運算棧完成,77 --> vmp棧 --> eax
所以mov eax,0x77對應的vmp代碼是:
vPush 0x77
vPop vR13
5、最後十幾個藍橙黃
全是同樣的vPush操作:
將context區的vmp虛擬寄存器值,移動到vmp運算棧中。
6、最後一個vRet的作用
將壓入vmp運算棧中vmp虛擬寄存器值,更新到真實cpu寄存器中,
至此,退出虛擬機。
原文作者:愛吃菠菜
原文鏈接:https://bbs.pediy.com/thread-220689.htm
轉載請註明:轉自看雪學院
更多閱讀:
1、[原創] PEDIY-JD CTF 2018 Windows CrackMe 題目及設計思路
2、[原創]覺醒之戰Ⅰ:洞察HW程序員的腦洞
3、[原創]幾種常見的注入姿勢
4、[翻譯]StaDynA:解決Android APP安全分析中的動態代碼更新問題
推薦閱讀: