如何用OD的跟踪功能分析虚拟机保护
原文網(wǎng)址:https://www.52pojie.cn/thread-572327-1-1.html
?
| 新年,分享一份自己寫的文章 虛擬機保護已經(jīng)是現(xiàn)代保護殼不可缺少的一環(huán),雖然逆向方也發(fā)展出各種插件幫助分析,但只針對特定某款,通用性的方法卻不多見。我總在想,既然虛擬機的結構是固定的,如果有一款工具能夠記錄指令流,那么按圖索驥,也許能發(fā)展出一套通用的分析方法來。其實OD就有記錄指令流的功能,叫跟蹤(trace),也許是效果不好或者操作不便,用的人甚至知道的人不多。先介紹下怎么用。 OD的跟蹤功能原理很簡單,就是每一步都自動下單步斷點,然后記錄斷下來的指令信息。這項功能涉及到幾項設置,第一項是緩存大小,不難想象,跟蹤得到的這一些列的指令記錄是需要占地方存儲的,占多大可以設置,位置在調試選項(Debugging options)->跟蹤(Trace),如圖1。第一項就是緩存的大小,內(nèi)存允許的話,自然是多多益善,畢竟 緩存越大,允許記錄的信息越多。第二項是記錄的內(nèi)容,跟蹤會自動記錄地址模塊等信息,此外可以選擇是否記錄指令、ESP和標志位的信息。設置位置緊接著緩存大小,見圖2,可以按需勾選,本文只需要記錄指令即可。最后一項是在調試(DEBUG)菜單中打開Trace。 現(xiàn)在Trace已經(jīng)設置完畢了,按下Ctrl+F12,查看Trace窗口,應該已經(jīng)開始記錄執(zhí)行過的指令。否則請檢查前述設置和操作是否正確。 那么,虛擬機保護要怎么入手分析呢?前面我提到,虛擬機是有固定結構的,既然要分析,那對應的找到這些結構應該就可以了。傳統(tǒng)保護虛擬機的結構其實很簡單,大致可以看成一只章魚,有三個部分,分別是init(頭),Dispatch(身)和Handle(觸須),如圖3: Init主要完成虛擬機初始化工作,例如申請內(nèi)存填寫初始值之類,每次進入虛擬機,這個“頭部”通常只執(zhí)行一次。Dispatch是虛擬機的主體,可以看成一個主循環(huán),它是每一條虛擬機指令的開始之處,也是結束之處,負責讀取虛擬機指令,進入具體handle解釋等工作。Handle就是虛擬機的“指令”了,實際完成各項虛擬機指令的功能。 我曾寫過一篇《基于虛擬機的軟件保護技術.》較為詳細的介紹過虛擬機保護技術,對基本結構還不太熟的同學,此文會對上述概念有更詳細的說明。 現(xiàn)在,我們就要在具體的軟件中找這只“章魚”了。以一個CrackMe為例,首先清理所有斷點,打開Trace,Ctrl+F12跟蹤步過運行,看到程序跑起來了,F12暫停,看Trace的窗口如下(圖4): 記錄是從下往上看的,可以看出,在程序空間的最后一條支流,是00401534的一個call,調用了DialogBoxInDirectParamA,這是一個調出系統(tǒng)對話框的API,其中有一個參數(shù)DlgProc用來指明消息回調函數(shù)的位置,我們直接在反匯編窗口查看這個API,發(fā)現(xiàn)回調函數(shù)是0x401572(圖5): 0x401572處代碼不長,有好幾條Call,但大部分都是系統(tǒng)Call,只有一處調用了程序空間的函數(shù),這個函數(shù)就是虛擬機的入口。到這里,我們對虛擬機的分析的工作才剛剛開始。 首先對虛擬機的入口下斷,然后重新運行程序。目的是保證能夠正確找到init。現(xiàn)在應該端在虛擬機的入口處,如下圖: 這是個非常簡單的虛擬機,有經(jīng)驗的同學也許可以一眼就看出來圖6包含了Init和Dispatch分別在哪里。當然也可以用Trace快速找出虛擬機的各個結構。現(xiàn)在去掉斷點,打開Trace,Ctrl+F12跟蹤步過,這時程序會跑起來,多點擊幾下按鈕,目的是讓主要分支得到更充分的執(zhí)行(即增加獲得執(zhí)行的次數(shù)),然后F12暫停。 回到Trace窗口,對著任意一行程序空間的指令點擊右鍵,選擇模塊統(tǒng)計,結果如下圖: 統(tǒng)計是以代碼段來劃分的,第一欄顯示的是這段代碼在剛才的跟蹤執(zhí)行中執(zhí)行的次數(shù),第二欄顯示了某個代碼段的首地址。我們先找執(zhí)行了一次的指令首地址。可以找到第5行的地址就是虛擬機的入口地址,點擊在反匯編窗口跟隨,可以看到這段代碼是從0x00401060到0x004010B9,這就是init: [Asm]?純文本查看?復制代碼 ?
接著找Dispatch,剛才說過,它既是虛擬機指令的開始,又是結束,它得到的執(zhí)行次數(shù)一定也最多。可以看到第三行的0x004010B9,這個地址在虛擬機入口地址之后,執(zhí)行次數(shù)最多,同樣的辦法可以看到這段代碼的終止位置是0x004010D9: [Asm]?純文本查看?復制代碼 ?
最后是找這次執(zhí)行虛擬機用到的handle。這個不難,虛擬機入口地址之后的代碼段除了init和dispatch,其它都是handle,所有執(zhí)行過的handle都會在里面出現(xiàn)。當然了,某條handle的具體作用,以及沒有執(zhí)行過的handle,就只能靠人肉分析了。還有就是,就分析虛擬機保護來說,了解執(zhí)行了哪些handle,以及哪些handle更常用,這些信息都是十分有用的。 OK,把內(nèi)容直接貼出來了,順求一個新精華{:1_930:} ? |
如何用OD的跟蹤功能分析虛擬機保護.doc
?
113.55 KB, 下載次數(shù): 174, 下載積分: 吾愛幣 -1 CB
?
內(nèi)容和po出來的完全一樣,愿意捐的就贊助點唄
vmcrackme.zip
?
1.92 KB, 下載次數(shù): 135, 下載積分: 吾愛幣 -1 CB
?
所有權歸老K所有
總結
以上是生活随笔為你收集整理的如何用OD的跟踪功能分析虚拟机保护的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大一学科不挂科 速冲方法推荐(高数上+高
- 下一篇: 支持免费的PCB计算机辅助设计软件eag