當前位置:
首頁 > 新聞 > 編程實現小型虛擬機保護並逆向分析及其保護

編程實現小型虛擬機保護並逆向分析及其保護

1.引言


虛擬機保護技術已經出現了10多年,目前已有較多、較為成熟的商業化虛擬機保護產品,如VMProtect、Themida等。這些產品實現的虛擬機過於複雜,而本文僅僅是逆向分析和編程實現小型虛擬機保護,這種小型虛擬機僅用於說明虛擬機保護這種技術,可以用於開發CrackMe,但與真正的虛擬機保護還有非常遠的路要走。


2017年看雪CTF大賽正在火熱征題中,防守組的各位參賽者隨手寫一個適用於自己CrackMe的虛擬機,相信可以如虎添翼。


GitHub確實是個好地方,寫代碼之前可以先去逛一逛。筆者原本打算自行寫一個小型虛擬機,不過在GitHub找到了非常理想的代碼,所以乾脆把這份代碼拿出來說一說。這份代碼出自NWMonster大神的CrackMe倉庫。


本文的後續按照如下方式組織:首先逆向分析一下這個CrackMe,進而分析一下源碼並實現自己的小型虛擬機,最後是一個小小的總結。

2.逆向分析


在逆向分析之前,了解一點關於小型虛擬機的程序結構還是很有幫助的。一般來講,一個小型的虛擬機保護結構圖如下:

編程實現小型虛擬機保護並逆向分析及其保護



上圖中,VM_code代表虛擬機可以解讀的位元組碼,VM_register為虛擬機使用的寄存器,在一次VM_loop中,虛擬機讀取VM_code,並根據讀取的內容選擇並執行相應的VM_handler。為了明確被虛擬機保護的代碼所實現的功能,我們需要了解每個VM_handler的含義,從而理解被隱藏的代碼。


需要注意的是,該流程圖並不適用於商業虛擬機保護軟體,商業的虛擬機保護往往更複雜一些。


通常情況下,可以使用OllyDbg (OD)的trace功能,找到虛擬機的VM_loop。但本次我們使用IDA完成分析,這主要因為IDA的圖形界面更加清晰明了。為了方便調試,筆者將源碼重新編譯為32位windows的debug版本。後文會把所有的材料都上傳到Github,需要的讀者可自行下載。


用IDA打開CrackMe,不難發現其207位元組的VM_code:

編程實現小型虛擬機保護並逆向分析及其保護


上圖中的VM_code被賦值給[eax + 20h],如下圖:

編程實現小型虛擬機保護並逆向分析及其保護



根據這些代碼,可以推測VM_register的結構如下:


Structure VM_register{+0x00 ??+0x04 ??+0x08 ??+0x0C ??+0x10 ??+0x14 ??+0x18 ??+0x1C ??+0x20 IP register}

編程實現小型虛擬機保護並逆向分析及其保護



數一下上圖中的方塊數量,可以推測這裡有大約23個VM_handler。下面開始根據VM_code的順序逐一分析這些VM_handler。VM_code的第一個位元組為0xDE,該位元組會使虛擬機執行VM_handler_defaultcase,如下圖所示:

編程實現小型虛擬機保護並逆向分析及其保護


而VM_handler_defaultcase的詳細內容如下:

編程實現小型虛擬機保護並逆向分析及其保護



上圖中,[this + 0x24]即為指令寄存器,因為VM_register是VM類中的第一個元素,其偽代碼如下:


所以,在0x20的基礎上又增加了0x4位元組的偏移。這段代碼並無實際功能,只增加了指令寄存器,故可理解為NOP指令。VM_code中的第2,3,4位元組同樣會令虛擬機執行VM_handler_defaultcase分支,故可以如下代碼重寫VM_code:


1 0xDE NOP2 0xAD NOP3 0xC0 NOP4 0xDE NOP

編程實現小型虛擬機保護並逆向分析及其保護



該段代碼的含義是:將後續0xF位元組的VM_code與0x66異或。暫不清楚其異或的目的為何。可以用如下方式表示該指令:


5 0x7C 0x2E 0x27 … 0x23 0x32 XOR the following 0xF bytes with 0x66

編程實現小型虛擬機保護並逆向分析及其保護



這個VM_handler的作用是明顯是入棧操作,即將後續4位元組的VM_code壓入虛擬機的棧,其[this + 20h]為棧指針。由此,可以進一步推斷出VM_register結構如下:


Structure VM_register{+0x00 ??+0x04 ??+0x08 ??+0x0C ??+0x10 ??+0x14 ??+0x18 ??+0x1C SP register+0x20 IP register}


該虛擬機指令可表示如下:


21 0x70 0x00 0x00 0x00 0x2F push 0x2F


到此為止,筆者已經分析了25位元組的VM_code和3個VM_handler以及一部分VM_register,後續內容還是留給感興趣的讀者。此外,其被虛擬機保護的代碼被還原為等價的C代碼也上傳到了Github,供讀者參考。


3.編程實現小型虛擬機


根據已有的源代碼,可以很方便的構造小型虛擬機。首先來看一下該源代碼,虛擬機使用的VM_register結構如下圖:

編程實現小型虛擬機保護並逆向分析及其保護


其中,cf為標誌位,*db指向用戶輸入數據。虛擬機中的VM_loop是通過一個while-switch結構實現的:

編程實現小型虛擬機保護並逆向分析及其保護



上圖中的r.ip指向虛擬機的VM_code,該位元組碼被定義為一個位元組數組,如圖:

編程實現小型虛擬機保護並逆向分析及其保護



而完整的虛擬機類,即VM類如下圖:

編程實現小型虛擬機保護並逆向分析及其保護


其中,結構體REG即為VM_register,為VM類的第一個成員。虛擬機中的各個VM_handler也可以在該類中找到。在每次VM_loop中,虛擬機讀取 VM_code,並選擇執行響應的VM_handler。


基於這些已有代碼,構造一個定製的虛擬機變得非常簡單。可以使用已有的VM_handler和VM_register,也可以增加更多的VM_handler,並適當地增加一些混淆。增加混淆的VM_handler會使虛擬機保護更加難以分析。


在已有的框架之上,定製虛擬機的問題是變為設計一段VM_code用來實現所需目的即可。比如說,如果我們需要檢查用戶輸入是否為0x27位元組的16進位數字,則可以使用如下VM_code:


PUSHD, 0x00, 0x00, 0x00, 0x2f, POP, 0x30, MOVD, 0x00, //loop begin XOR, 0x22, CMP, 0x02, JZ, 0x33, INCD, PUSHD, 0x00, 0x00, 0x00, 0x46, POP, 0x10, CMP, 0x01, JG, 0x27, //error user-input < 『F』 ascII:0x46 PUSHD, 0x00, 0x00, 0x00, 0x30, POP, 0x10, CMP, 0x01, JL, 0x16, //error user-input > 『0』 ascII:0x30 PUSHD, 0x00, 0x00, 0x00, 0x39, POP, 0x10, CMP, 0x01, JL, 0x0b, //correct user-input < 』9』 ascII:0x39 PUSHD, 0x00, 0x00, 0x00, 0x41, POP, 0x01, CMP, 0x01, JL, 0x06, //error user-input < 『A』 ascII:0x41 XOR, 0x00, CMP, 0x00, JZ, 0x03, XOR, 0x00, //error out R0 = 0 END, LOOP, 0x3E, //loop end XOR, 0x00, //correct out R0 = 1 INC, 0x00, END,


這部分代碼是取自源文件中的VM_code,並加以相應的修改。在以上列表中,令用戶輸入的每一位與『F』, 『0』, 』9』, 』A』進行比較,從而判斷出是否為16進位數字。當全部滿足條件時,虛擬機運行結束後,R0寄存機為1,否則為0。


最後,用這段VM_code替換原先的代碼,調試運行確認沒有bug之後,就可以正常使用了。


4.小結


本文主要討論了小型虛擬機保護的相關內容,前一部分逆向分析了一個使用虛擬機保護的CrackMe,後一部分討論了如果定製一些被虛擬機保護的代碼。在分析虛擬機保護過程中,最主要的步驟是分析每一個VM_handler的作用,從而理解被保護的代碼含義;而在定製小型虛擬機保護是,關鍵是設計一段VM_code使之能夠順利完成其目的。文章中提到的所有材料可以在此鏈接下載到:https://github.com/zzz66686/simple-virtual-machine


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

一個雲本地文件包含漏洞,影響世界一流公司
在VBA中使用DLL改善宏的攻擊功能
電商安全行業再迎新風,第二屆唯品峰會成功舉辦
價值10000美元的Uber漏洞,可隨意重置任何賬戶的密碼

TAG:嘶吼RoarTalk |

您可能感興趣

電磁炮用可控硅要保護嗎?肯定有保護,具體材料屬於機密
敏感人群將如何實施保護技術
孫南翔:論作為消費者的數據主體及其數據保護機制
運動如何保護膝蓋的機能
瓦斯保護、差動保護介紹及保護壓板措施恢復前投入前測量方法
如何利用分段機制保護物聯網?
進博會設專門機構強化知識產權保護 上海將提供一流城市服務保障
計算機軟體保護的不同路徑及方法
歐盟隱私數據保護新規正式生效
建立動物保護區能否從根本上保護大型貓科動物?答案是否定的
傢具產品的IP保護策略
《編程模擬器》國家遺產保護系統金牌通關攻略
安全作業保護的樹立需求原則確保,以確保技能的施行!
程守宗:自動駕駛法案會保護人類實現無人駕駛願景
輔助保護證書期限可以為負值
西班牙兩公共機構合作研究區塊鏈技術,力求解決數字版權保護問題
強有力的保護傘
健康︱保護好我們身體的「發動機」——甲狀腺
關於網路信息的保護機制的合理性
「滅霸宇宙生態保護計劃」能實現嗎?