周顯春
基于VB引擎反匯編技術(shù)的軟件破解方法及防范策略
周顯春
(三亞學(xué)院,三亞572022)
通過(guò)分析基于反匯編技術(shù)對(duì)保護(hù)軟件的破解步驟,提出一些增加軟件破解難度的方法。這些方法在一定程度上彌補(bǔ)現(xiàn)在保護(hù)技術(shù)的不足,從而使得破解軟件增加難度,加強(qiáng)軟件的保護(hù)。
軟件保護(hù);VB;反匯編;軟件破解技術(shù)
VB5之前都是典型的解釋語(yǔ)言(VB3、VB4),使用專用的VB反編譯器很容易對(duì)exe、dll.ocx等文件的反匯編。VB5和VB6則不同,采用不同的編譯模式,分為自然編譯(Native-Complie)和偽編譯(Pcode-Compile)兩種。前者通過(guò)VB編譯器將高級(jí)語(yǔ)言轉(zhuǎn)換成目標(biāo)程序(OBJ),然后通過(guò)連接程序(LINK)生成可執(zhí)行程序(exe)。后者則先使用編譯器把高級(jí)語(yǔ)言轉(zhuǎn)換成某種通過(guò)虛擬機(jī)能夠在本地機(jī)器能夠解釋、執(zhí)行的代碼。這種編譯方式與Java、PowerBuilder等的編譯實(shí)質(zhì)是相同。使用P Code的好處是能夠跨平臺(tái)使用。
VB文件都使用MSVBVM60.dll,Oleaut32.dll。如果要深入研究VB,可以用使用靜態(tài)反匯編軟件IDA對(duì)其反匯編,掌握常用函數(shù)的使用方法。在MSVBVM60.dll中包含的函數(shù)名總是用_vba或rtc開(kāi)頭,而Oleaut32. dll則以var開(kāi)頭。函數(shù)的參數(shù)一般采用_stdcall方式,按照函數(shù)名從右到左理解。
對(duì)可執(zhí)行文件進(jìn)行分析的方法主要分為兩種:靜態(tài)分析法和動(dòng)態(tài)分析法。
2.1靜態(tài)分析法
靜態(tài)分析法是在不執(zhí)行代碼的情況下,對(duì)代碼進(jìn)行分析的方法。它是通過(guò)文件的外部特征,獲取文件的類型、大小、PE頭等信息。此外,使用反匯編工具,例如:IDA,或者VB的專用反匯編器VB Decompiler Pro,現(xiàn)在的版本是9.9。在后面的案例中,使用VB Decompiler Pro,理由是它是基于VB引擎,使用方法簡(jiǎn)單、效果好。當(dāng)然,僅僅依靠靜態(tài)分析還不足以解決復(fù)雜的問(wèn)題,但是這些信息可以作為動(dòng)態(tài)分析的重要資料,對(duì)加快動(dòng)態(tài)分析的進(jìn)程非常有用。
2.2動(dòng)態(tài)分析法
動(dòng)態(tài)分析法是在程序執(zhí)行的過(guò)程中對(duì)代碼進(jìn)行分析的一種方法,它是采用調(diào)試技術(shù)來(lái)分析程序的內(nèi)部結(jié)構(gòu)與動(dòng)作原理?,F(xiàn)在最常用的動(dòng)態(tài)反匯編工具有: OllDb、WinDbg、X64_dbg。其中OllDbg只能對(duì)32位的可執(zhí)行文件進(jìn)行動(dòng)態(tài)分析,權(quán)限的等級(jí)為Ring 3,Windbg在Windows平臺(tái)下,強(qiáng)大的用戶態(tài)和內(nèi)核態(tài)調(diào)試工具,WinDbg不僅可以調(diào)試應(yīng)用程序,還可以進(jìn)行Kernel Debug,權(quán)限等級(jí)為Ring 0,缺點(diǎn)是圖形化功能簡(jiǎn)單,命令功能強(qiáng)大,不容易入門。x64_dbg可以看作是OllDb的繼續(xù)開(kāi)源開(kāi)發(fā),可以調(diào)試64位應(yīng)用程序,現(xiàn)在功能還不是很強(qiáng)大。
在大多數(shù)情況下,破解應(yīng)用程序的方法是先通過(guò)靜態(tài)分析方法收集代碼的有用的信息,然后進(jìn)行動(dòng)態(tài)分析。為了更好地理解破解的過(guò)程,為下一步的軟件知識(shí)產(chǎn)權(quán)保護(hù)打下扎實(shí)的基礎(chǔ),下面舉例進(jìn)行說(shuō)明。
由于下面需要破解的應(yīng)用程序是VB的32位程序,文件名abex'crackme#2,因此靜態(tài)分析采用VB的專用反匯編器VB Decompiler Pro,動(dòng)態(tài)分析采用OllD-bg。
在進(jìn)行分析之前,最好執(zhí)行要被破解的軟件,了解其大致功能。主界面如圖1所示。
圖1 軟件運(yùn)行界面
首先用VB Decompiler Pro打開(kāi)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
……(其余代碼省略)
通過(guò)這些信息,可以知道該程序執(zhí)行后情況有充分的了解,有一個(gè)對(duì)話框,對(duì)話框上有兩個(gè)標(biāo)簽、文本框,三個(gè)按鈕等詳細(xì)信息,與沒(méi)有破解之前運(yùn)行時(shí)的主界面完全一致。其中,最重要是獲得三個(gè)按鈕的反匯編的偽代碼,以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
查看獲得反匯編的偽代碼,結(jié)合先前對(duì)未注冊(cè)軟件的運(yùn)行情況就很容易就知道loc_004033DD處的代碼是輸入文本框信息正確時(shí)的提示信息。切換到匯編窗口,查看提示信息產(chǎn)生之前,核對(duì)輸入用戶名和序列號(hào)正確與否的代碼,根據(jù)這些信息,可以采用兩種方法進(jìn)行破解。
第一種方法,獲取用戶名和序列號(hào)的關(guān)系。查看地址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
由此可知,真正核對(duì)信息真?zhèn)蔚牡刂窞椋簂oc_00403329,其2個(gè)參數(shù)地址在其上方。要獲得正確的序列號(hào),只要知道這兩個(gè)參數(shù)的值就可以了。獲得如此重要信息之后,使用Ollydbg打開(kāi)abex'crackme#2. exe,goto 00403329。如下圖2。
圖2 信息核對(duì)函數(shù)的匯編代碼
查看上圖,在地址00403329處設(shè)置斷點(diǎn),開(kāi)始動(dòng)態(tài)調(diào)試。在第一個(gè)文本框中隨意輸入36548,第二個(gè)文本框中輸入123456987,單擊check按鈕,當(dāng)程序執(zhí)行到斷點(diǎn)后,可以獲得參數(shù)的地址及值,如圖3~4。
圖3 信息核對(duì)函數(shù)的參數(shù)
由上圖可知,當(dāng)輸入用戶名為36548時(shí),序列號(hào)為979A9998。
圖4 信息核對(duì)函數(shù)的參數(shù)實(shí)際值
第二種方法,繞過(guò)用戶名和序列號(hào)核對(duì)的過(guò)程,直接顯示提示信息。查詢與信息核對(duì)有關(guān)的匯編代碼。
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
由以上代碼可知,如果核對(duì)信息不正確,就會(huì)執(zhí)行地址:loc_00403332,即修改此處代碼為NOP,就可以破解。在Ollydbg中,goto 00403332,修改為NOP,如下圖5~6。
圖5 信息核對(duì)不相符的轉(zhuǎn)移匯編代碼
圖6 修改后的匯編代碼
采用同樣的方法,可以破解該軟件的加密方法,關(guān)鍵代碼地址為:loc_0040318B~loc_0040329A。
雖然基于軟件的加密殼保護(hù)和基于硬件的加密鎖保護(hù)都是不錯(cuò)的軟件保護(hù)技術(shù),但是這些方法太過(guò)于流行,許多人對(duì)其有深入的了解,反而容易被破解。因此,根據(jù)自己軟件的特點(diǎn)實(shí)現(xiàn)自己的獨(dú)特保護(hù)方法才是最好的。例如:采用試用版和正式版分開(kāi)的方法。試用版不具有正式版的核心功能,不是簡(jiǎn)單的屏蔽,而是沒(méi)有相應(yīng)的代碼。加密方法不要過(guò)于簡(jiǎn)單,創(chuàng)立文件的副本,進(jìn)行文件完整性檢查[1],加殼、VM保護(hù)、網(wǎng)絡(luò)驗(yàn)證、加密鎖、反調(diào)試跟蹤[2],等等。
針對(duì)本文所采用的破解方法,可以進(jìn)一步完善自己的軟件。如,為了防范自己的軟件被第一種破解方法破解,可以對(duì)核心源代碼進(jìn)行加密,使之成為密文,加密的方法可以采用比較成熟的密碼學(xué)算法,為了防范自己的軟件被第二種破解方法,既可以對(duì)核心的代碼進(jìn)行加密,也可以對(duì)核心代碼進(jìn)行完整性檢查,這些措施都可以很容易做到。
破解已有軟件,并不是為了商業(yè)目的。軟件安全是信息安全的重要組成部分,它涉及到軟件的加密、解密、逆向分析、漏洞分析、病毒分析等。掌握與軟件安全相關(guān)的知識(shí),既可以通過(guò)獲取別人軟件開(kāi)發(fā)的思想、精髓,提高自己的軟件開(kāi)發(fā)能力,也可以通過(guò)掌握相關(guān)的知識(shí),來(lái)增強(qiáng)自己軟件的反匯編能力。道高一尺魔高一丈,軟件的逆向分析與反逆向分析應(yīng)該是一個(gè)永恒話題。
[1]陳闖.基于反匯編技術(shù)的軟件破解及其應(yīng)對(duì)方法[J].畢節(jié)學(xué)院學(xué)報(bào),2008,26(4)
[2]李承遠(yuǎn).武傳海譯.逆向工程核心原理.人民郵電出版社,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)絡(luò)工程師,研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)技術(shù)
2015-03-12
2015-04-01