VB反彙編特點彙總:秒破Crackme8-10
*本文作者:huluwa007,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
本文通過VB自寫自逆,搞清楚VB逆向特點、p-code、native-coed、變數結構特點、預設浮點、epb-0×34法則等,不僅秒破Crackme8-10,以後遇到VB就不會頭暈眼花了。
準備
網盤連結: https://pan.baidu.com/s/1j_38rOvm83zoyTcJxutwXw 提取碼: awdv
【環境和工具】
1. win7/xp虛擬機器環境 2. CrackMe008(Andrénalin.1.exe) 3. CrackMe009(Andrénalin.2.exe) 4. CrackMe010(Andrénalin.3.exe) 5. VB6寫的研究程式(pcode版) 6. VB6寫的研究程式(ncode版) 7. ollydbg 8. VB Decompiler
【學習層次】
1. 瞭解VB開發特點 2. 理解VB反彙編特點 3. 掌握VB反彙編技巧
VB自編自逆
這一段文章搞透後,不僅能秒破CrackMe8-10,以後在遇到VB就不會蒙圈了。
程式介面:
程式原始碼:
完整工程檔案和原始碼在網盤。
VB反彙編特點彙總
1. 兩種編譯
VB6.0之後的版本,在選擇編譯最終程式的時候,是由兩種選擇的,分別是:
p-code模式 native-code模式
如下圖:
p-code
虛擬碼,並不是真正編譯的機器碼,需要經過msvbvm60.dll的翻譯和解釋才能執行;
比較小;
VB特有;
字串很難搜尋;
OD幾乎無法分析,跟變態殼似的;
VB Decompiler可以直接逆出偽原始碼。
例如上方程式,用p-code編譯的版本,od中甚至連MsgBox斷點都不好下,各種繞的暈頭轉向。
然而,遇到p-code的,就直接上神器VB Decompiler吧,工具在網盤-常用工具裡面,如圖,可以直接翻譯偽原始碼:
native-code
和其他開發環境類似,直接編譯出真正的機器碼,cpu直接執行;
既然cpu可以直接認識,那麼od也就認識了;
OD可以逆向動態分析;
程式會比p-code大;
VB Decompiler也很好用,也是可以逆出偽原始碼。
如圖,在od中,字串搜尋和堆疊跟蹤符合正常預期。
VB Decompiler逆出偽原始碼:
2. native-code反彙編的變數結構特點
native-code編譯的VB程式是可以用OD正常動態除錯的,OD對其常用函式的識別也是很好的。但是對VB不熟的還是依然會茫然,其中一個原因就是變數結構問題。我們以自己寫的這個探索程式為例子,整數1乘以2,逆向看看VB的計算過程。
OD中斷在了即將進行計算之前,請仔細觀看下圖,識別相應的引數和暫存器和堆疊和記憶體資料,就可以看出端倪。
可以看出變數結構特性是:
暫存器接收變數的地址;
地址指向的是一個類似C++結構體一樣的結構;
其中首地址存放的是變數型別編號;
首地址+0×8,存放的才是實質的資料。
我總結了幾個常用的變數資料型別,編號對應如下:
編號 | 型別 | [首地址+0x8] |
---|---|---|
2 | int | 值 |
3 | long | 值 |
4 | 單精浮點 | 32位浮點值 |
5 | 雙精浮點 | 64位浮點值 |
8 | 字串 | 字串地址 |
11 | byte | 值 |
3. 變數未宣告型別,數值計算採用64位雙精
VB宣告變數,格式如下圖:
AS後面是接型別,也可以不寫AS,根據需要自動轉換,那麼當轉換位數值型別時,預設是64位雙精浮點型。我們依然利用這個乘法探索程式,逆向進行驗證,原始碼如下圖:
n1、n2、nRes三個變數;
均未指定型別;
Val是把字串轉換為數字;
其實不用val轉換,直接用字串向乘,VB在計算的時候也會轉。
為了反彙編看起來條線清晰方便,我們就提前轉一下。
程式操作如下圖:
2和3相乘,點選預設型別計算結果;
我們用OD逆向分析計算過程。
OD中逆向計算過程如下圖:
可見兩個乘數2和3,預設型別編號是5,即雙精浮點型。
切換記憶體顯示模式為64浮點後,如下圖:
可見,確實VB會把沒有宣告型別的數字型別變數,預設採用64位雙精浮點。
4. 另外兩個特性
VB字串預設編碼是unicode; VB反彙編中很多時候會在[ebp-0x34]這個堆疊地址中看到最終的計算的結果。
秒破CrackMe8-10
知道了VB反彙編的特點後,CrackMe8-10其實很簡單。若是直接用 VB Decompiler,那就更簡單了。但是還是推薦用OD去好好分析分析,畢竟CrackMe的終極目標還是學習。
三合一註冊機效果動圖:
crackme008
固定碼,SynTaX 2oo1 ,開發者都說了Very very easy!我們就直接pass了。
crackme009
1. 輸入使用者名稱123456,和偽碼654321
2. OD中研究演算法發現定義了迴圈,根據上文總結的VB的特點,可以輕易的得出結論,若是不知道這個特點,很容易跟看堆疊看的一臉懵逼。
迴圈體實質內容,我們用VB的另外一個特性就是[ebp-0x34]結果特性來分析,如下圖:
每執行一次迴圈內容,[ebp-0x34]值得動態變化如下圖:
可以看出,這個迴圈得實質就是”使用者名稱字元asc碼求和”,使用者名稱”123456″,即0×31+0×32+0×33+0×34+0×35+0×36 = 0×135再繼續往下,發現這個結果會去做一個乘法,如圖:
再繼續往下,相乘的結果,轉化為十進位制數字後進行字串格式化,並且第4位和第九位換成”-“,如下圖:
動態觀察,[ebp-0x34]的變化。
根據以上分析,我們寫出註冊機原始碼:
crackme010
crackme010,我們依然是可以用OD逆向,好好熟悉VB反彙編特點,這裡我們用另外一個神器VB Decompiler,網盤的常用工具裡面有VB Decompiler直接逆出偽原始碼。
翻譯為C++原始碼,注意這裡有個轉義符,如果一個”\”則被識別為轉義符,而”\”則被轉移為反斜槓”\” 如圖: