VB程序逆向
1、VB介紹
Visual Basic 是一種具有良好圖形用戶界面的程序設計語言。
Visual的意思是“可視的”,也就是直觀的編程方法,在編程時不需要編寫大量代碼去描述界面元素的外觀和位置,只需把預先建立的對象拖放到窗體上。Basic是指BASIC語言,VB使用了BASIC語言作為代碼。
VB采用面向對象和事件驅動的程序設計機制,這種機制下,VB程序往往是多線程的,在分析過程中定位主線程和事件處理過程尤為重要。
在編譯方式上,VB既有直接編譯生成的可執行程序,也有間接編譯生成的可執行程序,不同的編譯方式有不同的分析方法。直接編譯又被稱為自然編譯(Native-Compile),是編譯器將高級語言轉化為匯編代碼,并經鏈接生成exe程序的過程;間接編譯又被稱為偽編譯(Pcode-Compile),偽編譯是編譯器將高級語言轉換為某種語言后,將其解釋、執行此代碼的一段程序一同鏈接,生成exe程序。
Native和Pcode的比較
Native自然編譯
自然編譯的VB程序,直接生成x86匯編代碼,可以直接使用OD、IDA進行分析。
但是需要注意的是,VB函數的調用遵循 stdcall 原則,即函數入口參數按從右到左的順序入棧,并由被調用的函數在返回前清理傳送參數的內存棧。而且VB程序不是直接調用Windows API函數,而是調用VB庫里的函數。如圖所示的是某個VB樣本的導入函數情況,所有導入函數都來自于msvbvm*.dll。
VB的程序中會有大量對控件屬性的操作,這些操作往往是通過虛函數實現的。所以在OD動態調試時,會發現有大量call [ecx+*]形式的調用,可以通過查表迅速定位其調用的函數
Pcode偽編譯
運行時依賴解釋器將偽代碼翻譯為匯編代碼再執行。
如圖所示,是Pcode編譯的VB程序反匯編得到的結果的片段,可以看到Pcode編譯得到的是Pcode匯編代碼,而不是直接得到x86匯編代碼。
?Pcode編譯的VB程序,在執行時會調用msvbvm*.dll首先對Pcode匯編進行解釋,翻譯成x86匯編代碼,然后才能由CPU執行。如果使用OD跟蹤Pcode編譯的VB程序,很容易迷失在偽代碼解釋引擎中。
編譯方式識別
1、用die可以直接識別
2、導入函數數量上的比較,Native編譯的程序往往有比Pcode編譯的程序更多的導入函數:
3、匯編代碼比較,Native編譯直接反匯編為x86匯編語言,Pcode編譯反匯編為Pcode偽匯編代碼:
?
2、分析工具和技巧
VB Decompiler目前是VB程序逆向分析最強大的功能,支持VB5/6,同時支持Native和Pcode編譯的程序。
此軟件使用也很簡單,直接將VB程序拖拽進VBDe即可,該軟件能將VB窗體的事件處理過程識別出來,還能顯示對應的反匯編和反編譯代碼:
?
VB Decompiler是一款靜態分析工具,沒有辦法動態調試。如果是Native程序,可以結合OD進行動態調試,如果是Pcode程序,就需要使用WKTVBDebugger。
WKTVBDebugger是一款古老的軟件,也是Pcode程序最好用的調試軟件。此軟件的具體使用可以參考https://www.52pojie.cn/thread-33119-1-1.html。
?
此軟件在使用中,有幾個方面要注意:
①待分析的VB程序需要和復制到 WKTVBDebugger 安裝目錄里調試,即與 Loader.exe 同一目錄;
②需要將安裝目錄的 WKTVBDE.dll 文件復制到系統目錄里;
③需要將 MSVBVM60.DLL 替換成 2003 年以前版本。
VB程序真正入口
如圖所示,VB程序的ENTRY POINT進入后第一個指令是push指令,如果我們從這里開始分析,就會進入編譯器的代碼中,浪費大量的分析時間,所以我們需要定位VB程序真正的入口。
?
push xxxxxxxx壓入的實際上是一個指針,指向VBHEADER的結構。此結構體的解析如下:
?
我們需要重點關注VBHEADER結構體中的成員pSubMain,這才是VB程序真正的入口。
在本例中,入口地址是0x4327b0,接下來我們可以下段直接運行到這里,然后再進行分析:
?
總結
- 上一篇: 面试2年经验的Java程序员面试题部分带
- 下一篇: rubyonrails安装