周顯春
基于VB引擎反匯編技術的軟件破解方法及防范策略
周顯春
(三亞學院,三亞572022)
通過分析基于反匯編技術對保護軟件的破解步驟,提出一些增加軟件破解難度的方法。這些方法在一定程度上彌補現(xiàn)在保護技術的不足,從而使得破解軟件增加難度,加強軟件的保護。
軟件保護;VB;反匯編;軟件破解技術
VB5之前都是典型的解釋語言(VB3、VB4),使用專用的VB反編譯器很容易對exe、dll.ocx等文件的反匯編。VB5和VB6則不同,采用不同的編譯模式,分為自然編譯(Native-Complie)和偽編譯(Pcode-Compile)兩種。前者通過VB編譯器將高級語言轉換成目標程序(OBJ),然后通過連接程序(LINK)生成可執(zhí)行程序(exe)。后者則先使用編譯器把高級語言轉換成某種通過虛擬機能夠在本地機器能夠解釋、執(zhí)行的代碼。這種編譯方式與Java、PowerBuilder等的編譯實質是相同。使用P Code的好處是能夠跨平臺使用。
VB文件都使用MSVBVM60.dll,Oleaut32.dll。如果要深入研究VB,可以用使用靜態(tài)反匯編軟件IDA對其反匯編,掌握常用函數(shù)的使用方法。在MSVBVM60.dll中包含的函數(shù)名總是用_vba或rtc開頭,而Oleaut32. dll則以var開頭。函數(shù)的參數(shù)一般采用_stdcall方式,按照函數(shù)名從右到左理解。
對可執(zhí)行文件進行分析的方法主要分為兩種:靜態(tài)分析法和動態(tài)分析法。
2.1靜態(tài)分析法
靜態(tài)分析法是在不執(zhí)行代碼的情況下,對代碼進行分析的方法。它是通過文件的外部特征,獲取文件的類型、大小、PE頭等信息。此外,使用反匯編工具,例如:IDA,或者VB的專用反匯編器VB Decompiler Pro,現(xiàn)在的版本是9.9。在后面的案例中,使用VB Decompiler Pro,理由是它是基于VB引擎,使用方法簡單、效果好。當然,僅僅依靠靜態(tài)分析還不足以解決復雜的問題,但是這些信息可以作為動態(tài)分析的重要資料,對加快動態(tài)分析的進程非常有用。
2.2動態(tài)分析法
動態(tài)分析法是在程序執(zhí)行的過程中對代碼進行分析的一種方法,它是采用調試技術來分析程序的內部結構與動作原理。現(xiàn)在最常用的動態(tài)反匯編工具有: OllDb、WinDbg、X64_dbg。其中OllDbg只能對32位的可執(zhí)行文件進行動態(tài)分析,權限的等級為Ring 3,Windbg在Windows平臺下,強大的用戶態(tài)和內核態(tài)調試工具,WinDbg不僅可以調試應用程序,還可以進行Kernel Debug,權限等級為Ring 0,缺點是圖形化功能簡單,命令功能強大,不容易入門。x64_dbg可以看作是OllDb的繼續(xù)開源開發(fā),可以調試64位應用程序,現(xiàn)在功能還不是很強大。
在大多數(shù)情況下,破解應用程序的方法是先通過靜態(tài)分析方法收集代碼的有用的信息,然后進行動態(tài)分析。為了更好地理解破解的過程,為下一步的軟件知識產(chǎn)權保護打下扎實的基礎,下面舉例進行說明。
由于下面需要破解的應用程序是VB的32位程序,文件名abex'crackme#2,因此靜態(tài)分析采用VB的專用反匯編器VB Decompiler Pro,動態(tài)分析采用OllD-bg。
在進行分析之前,最好執(zhí)行要被破解的軟件,了解其大致功能。主界面如圖1所示。
圖1 軟件運行界面
首先用VB Decompiler Pro打開abex'crackme#2. exe文件,完成靜態(tài)反匯編。可以獲得如下有用信息: VERSION 5.00
Begin VB.Form Form1
Caption="abex 2nd crackme"
BackColor=&H0&
ScaleMode=1
AutoRedraw=False
FontTransparent=True
BorderStyle=0'None
Icon="Form1.frx":0
LinkTopic="Form1"
ClientLeft=0
ClientTop=0
ClientWidth=4140
ClientHeight=2295
StartUpPosition=2'CenterScreen
Begin CommandButton Command3
Caption="&Check"
Left=3000
Top=600
Width=975
Height=375
TabIndex=7
End
……(其余代碼省略)
通過這些信息,可以知道該程序執(zhí)行后情況有充分的了解,有一個對話框,對話框上有兩個標簽、文本框,三個按鈕等詳細信息,與沒有破解之前運行時的主界面完全一致。其中,最重要是獲得三個按鈕的反匯編的偽代碼,以check按鈕為例:
Private Sub Command3_Click()'402ED0
loc_00402F98:var_88=Text1.Text
loc_00402FE2:var_74=var_88
loc_0040300F:var_9C=Len(var_74)
loc_00403026:If(var_9C〈4)=0 Then GoTo loc_004030F9
loc_00403066:var_E4="Error!"
loc_0040307E:var_D4="Please enter at least 4 chars as name!"
loc_004030D0:var_64=MsgBox("Please enter at least 4 chars as name!",0,"Error!",var_BC,var_CC)
loc_004030F9:'Referenced from:00403026
loc_00403119:var_9C=Len(var_74)
loc_00403130:If(var_9C〈4)〈〉0 Then GoTo loc_004034F3
loc_0040318B:For var_24=1 To 4 Step 1
loc_00403197:
loc_00403199:If var_134=0 Then GoTo loc_004032A5
loc_00403213:var_54=Asc(CStr(Mid(var_74,CLng(var_24), 1)))
loc_00403286:var_44=var_44&Hex(var_54+100)
loc_0040329A:Next var_24
loc_004032A0:GoTo loc_00403197
loc_004032A5:'Referenced from:00403199
loc_004032CB:var_88=Text2.Text
loc_00403313:var_34=var_88
loc_00403332:If(var_44=var_34)=0 Then GoTo loc_00403408
loc_004033DD:var_64=MsgBox("Yep,this key is right!",0, "Congratulations!",var_BC,var_CC)
loc_00403406:GoTo loc_00403413
loc_00403408:'Referenced from:00403332
loc_00403413:'Referenced from:00403406
loc_00403424:If(var_44=var_34)=0 Then GoTo loc_004034F1
loc_004034C8:var_84=MsgBox("Nope,this serial is wrong!",0,"Wrong serial!",10,10)
loc_004034F1:'Referenced from:00403424
loc_004034F3:'Referenced from:00403130
loc_004034FB:GoTo loc_0040353D
loc_0040353C:Exit Sub
loc_0040353D:'Referenced from:004034FB
End Sub
查看獲得反匯編的偽代碼,結合先前對未注冊軟件的運行情況就很容易就知道loc_004033DD處的代碼是輸入文本框信息正確時的提示信息。切換到匯編窗口,查看提示信息產(chǎn)生之前,核對輸入用戶名和序列號正確與否的代碼,根據(jù)這些信息,可以采用兩種方法進行破解。
第一種方法,獲取用戶名和序列號的關系。查看地址loc_00403329處的代碼:
loc_00403321:lea edx,var_44
loc_00403324:lea eax,var_34
loc_00403327:push edx
loc_00403328:push eax
loc_00403329:call[00401058h];@(%StkVar2=%StkVar1) '__vbaVarTstEq
loc_0040332F:test ax,ax
由此可知,真正核對信息真?zhèn)蔚牡刂窞椋簂oc_00403329,其2個參數(shù)地址在其上方。要獲得正確的序列號,只要知道這兩個參數(shù)的值就可以了。獲得如此重要信息之后,使用Ollydbg打開abex'crackme#2. exe,goto 00403329。如下圖2。
圖2 信息核對函數(shù)的匯編代碼
查看上圖,在地址00403329處設置斷點,開始動態(tài)調試。在第一個文本框中隨意輸入36548,第二個文本框中輸入123456987,單擊check按鈕,當程序執(zhí)行到斷點后,可以獲得參數(shù)的地址及值,如圖3~4。
圖3 信息核對函數(shù)的參數(shù)
由上圖可知,當輸入用戶名為36548時,序列號為979A9998。
圖4 信息核對函數(shù)的參數(shù)實際值
第二種方法,繞過用戶名和序列號核對的過程,直接顯示提示信息。查詢與信息核對有關的匯編代碼。
loc_00403327:push edx
loc_00403328:push eax
loc_00403329:call[00401058h];@(%StkVar2=%Stk-Var1)'__vbaVarTstEq
loc_0040332F:test ax,ax
loc_00403332:jz 00403408h
由以上代碼可知,如果核對信息不正確,就會執(zhí)行地址:loc_00403332,即修改此處代碼為NOP,就可以破解。在Ollydbg中,goto 00403332,修改為NOP,如下圖5~6。
圖5 信息核對不相符的轉移匯編代碼
圖6 修改后的匯編代碼
采用同樣的方法,可以破解該軟件的加密方法,關鍵代碼地址為:loc_0040318B~loc_0040329A。
雖然基于軟件的加密殼保護和基于硬件的加密鎖保護都是不錯的軟件保護技術,但是這些方法太過于流行,許多人對其有深入的了解,反而容易被破解。因此,根據(jù)自己軟件的特點實現(xiàn)自己的獨特保護方法才是最好的。例如:采用試用版和正式版分開的方法。試用版不具有正式版的核心功能,不是簡單的屏蔽,而是沒有相應的代碼。加密方法不要過于簡單,創(chuàng)立文件的副本,進行文件完整性檢查[1],加殼、VM保護、網(wǎng)絡驗證、加密鎖、反調試跟蹤[2],等等。
針對本文所采用的破解方法,可以進一步完善自己的軟件。如,為了防范自己的軟件被第一種破解方法破解,可以對核心源代碼進行加密,使之成為密文,加密的方法可以采用比較成熟的密碼學算法,為了防范自己的軟件被第二種破解方法,既可以對核心的代碼進行加密,也可以對核心代碼進行完整性檢查,這些措施都可以很容易做到。
破解已有軟件,并不是為了商業(yè)目的。軟件安全是信息安全的重要組成部分,它涉及到軟件的加密、解密、逆向分析、漏洞分析、病毒分析等。掌握與軟件安全相關的知識,既可以通過獲取別人軟件開發(fā)的思想、精髓,提高自己的軟件開發(fā)能力,也可以通過掌握相關的知識,來增強自己軟件的反匯編能力。道高一尺魔高一丈,軟件的逆向分析與反逆向分析應該是一個永恒話題。
[1]陳闖.基于反匯編技術的軟件破解及其應對方法[J].畢節(jié)學院學報,2008,26(4)
[2]李承遠.武傳海譯.逆向工程核心原理.人民郵電出版社,2014.5
Protection of Software;VB;Anti-Assemble;Crack Software Technology
Software Cracking Method and Prevention Strategies Based on VB Engine Disassembly Technology
ZHOU Xian-chun
(Sanya University,Sanya 57022)
Analyses the steps of cracking the protected software based on anti-assemble of VB,presents the methods,which make up for today's protection technology to a certain extent.Thus increases the degree of difficulty to crack software,strengthens the protection of the software.
1007-1423(2015)12-0058-04
10.3969/j.issn.1007-1423.2015.12.013
周顯春(1974-),男,湖南漢壽人,碩士研究生,講師,網(wǎng)絡工程師,研究方向為計算機網(wǎng)絡技術
2015-03-12
2015-04-01