標籤:

人肉跟蹤VMProtect入口至出口運行全過程(1)

一 、前言

跟vmp正面剛的起因是想自己實現一個ARM VMProtect的保護軟體,作者在查閱了大量資料以後還是不太理解 VMProtect 到底是怎麼實現的,

終於意識到沒有紮實分析過 VMProtect ,只停留在看別人分析的臆想階段,是不可能理解VMProtect的。所以下定決心耐心分析,追隨大佬們的腳印前行,也開始自己為技術瘋狂的年月。

二 、分析的樣本

是使用vmp v2.04 虛擬難度下的最快速度(所有都不勾選)設置,對一條mov eax,0x77指令加保護的最簡單樣本,從頭到尾跟蹤完這個樣本,就理解 VMProtect的入口出口,虛擬寄存器、虛擬棧。分析記錄無視了一些並非新手最應該關注的細節,分析過程不保證完全準確,甚至有一些錯誤,希望大家能理解。

三、附件的內容

pdf和rar中是本菜跟vmp初次正面交鋒全過程記錄,逐條人肉記錄了指令執行的每一次堆棧和寄存器變化,爭取追究每個細節,過程寫的詳細而羅嗦,比較費時間,不適合高手看,不適合沒時間的人看,適合想寫出vmp的新手看。

四 、沒精力的同學

可以看貼子中提煉後的重點內容和附件.xlsx。希望對寫vmp感興趣但一知半解的人有所幫助。

五 、另外

建議動手調試vmp樣本前,最好看過其他一些幾篇文章,對vmp有一個初步的認識。

1 、虛擬機保護技術淺談

bbs.pediy.com/thread-13

2 、VMP虛擬機加殼的原理學習

tuicool.com/articles/bI

3 、動手實現代碼虛擬機

mottoin.com/87374.html

4 、VMProtect2.04加殼程序從入門到精通

bbs.pediy.com/thread-12

六 、重點內容提煉

提煉了下重點內容,沒時間的同學直接看這個過程:

首先打開附件(點擊文末「閱讀原文」即可獲取附件)

" 用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寄存器中,

至此,退出虛擬機。

原文作者:愛吃菠菜

原文鏈接:bbs.pediy.com/thread-22

轉載請註明:轉自看雪學院

更多閱讀:

1、[原創] PEDIY-JD CTF 2018 Windows CrackMe 題目及設計思路

2、[原創]覺醒之戰Ⅰ:洞察HW程序員的腦洞

3、[原創]幾種常見的注入姿勢

4、[翻譯]StaDynA:解決Android APP安全分析中的動態代碼更新問題

推薦閱讀:

TAG:跟蹤 | 科技 |