基于VB引擎反汇编技术的软件破解方法及防范策略
2015-09-16周显春
周显春
基于VB引擎反汇编技术的软件破解方法及防范策略
周显春
(三亚学院,三亚572022)
通过分析基于反汇编技术对保护软件的破解步骤,提出一些增加软件破解难度的方法。这些方法在一定程度上弥补现在保护技术的不足,从而使得破解软件增加难度,加强软件的保护。
软件保护;VB;反汇编;软件破解技术
1 Visual Basic文件的基本特征
VB5之前都是典型的解释语言(VB3、VB4),使用专用的VB反编译器很容易对exe、dll.ocx等文件的反汇编。VB5和VB6则不同,采用不同的编译模式,分为自然编译(Native-Complie)和伪编译(Pcode-Compile)两种。前者通过VB编译器将高级语言转换成目标程序(OBJ),然后通过连接程序(LINK)生成可执行程序(exe)。后者则先使用编译器把高级语言转换成某种通过虚拟机能够在本地机器能够解释、执行的代码。这种编译方式与Java、PowerBuilder等的编译实质是相同。使用P Code的好处是能够跨平台使用。
VB文件都使用MSVBVM60.dll,Oleaut32.dll。如果要深入研究VB,可以用使用静态反汇编软件IDA对其反汇编,掌握常用函数的使用方法。在MSVBVM60.dll中包含的函数名总是用_vba或rtc开头,而Oleaut32. dll则以var开头。函数的参数一般采用_stdcall方式,按照函数名从右到左理解。
2 反汇编技术介绍
对可执行文件进行分析的方法主要分为两种:静态分析法和动态分析法。
2.1静态分析法
静态分析法是在不执行代码的情况下,对代码进行分析的方法。它是通过文件的外部特征,获取文件的类型、大小、PE头等信息。此外,使用反汇编工具,例如:IDA,或者VB的专用反汇编器VB Decompiler Pro,现在的版本是9.9。在后面的案例中,使用VB Decompiler Pro,理由是它是基于VB引擎,使用方法简单、效果好。当然,仅仅依靠静态分析还不足以解决复杂的问题,但是这些信息可以作为动态分析的重要资料,对加快动态分析的进程非常有用。
2.2动态分析法
动态分析法是在程序执行的过程中对代码进行分析的一种方法,它是采用调试技术来分析程序的内部结构与动作原理。现在最常用的动态反汇编工具有: OllDb、WinDbg、X64_dbg。其中OllDbg只能对32位的可执行文件进行动态分析,权限的等级为Ring 3,Windbg在Windows平台下,强大的用户态和内核态调试工具,WinDbg不仅可以调试应用程序,还可以进行Kernel Debug,权限等级为Ring 0,缺点是图形化功能简单,命令功能强大,不容易入门。x64_dbg可以看作是OllDb的继续开源开发,可以调试64位应用程序,现在功能还不是很强大。
3 软件破解的方法
在大多数情况下,破解应用程序的方法是先通过静态分析方法收集代码的有用的信息,然后进行动态分析。为了更好地理解破解的过程,为下一步的软件知识产权保护打下扎实的基础,下面举例进行说明。
由于下面需要破解的应用程序是VB的32位程序,文件名abex'crackme#2,因此静态分析采用VB的专用反汇编器VB Decompiler Pro,动态分析采用OllD-bg。
在进行分析之前,最好执行要被破解的软件,了解其大致功能。主界面如图1所示。
图1 软件运行界面
首先用VB Decompiler Pro打开abex'crackme#2. exe文件,完成静态反汇编。可以获得如下有用信息: 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
……(其余代码省略)
通过这些信息,可以知道该程序执行后情况有充分的了解,有一个对话框,对话框上有两个标签、文本框,三个按钮等详细信息,与没有破解之前运行时的主界面完全一致。其中,最重要是获得三个按钮的反汇编的伪代码,以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处的代码是输入文本框信息正确时的提示信息。切换到汇编窗口,查看提示信息产生之前,核对输入用户名和序列号正确与否的代码,根据这些信息,可以采用两种方法进行破解。
第一种方法,获取用户名和序列号的关系。查看地址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
由此可知,真正核对信息真伪的地址为:loc_00403329,其2个参数地址在其上方。要获得正确的序列号,只要知道这两个参数的值就可以了。获得如此重要信息之后,使用Ollydbg打开abex'crackme#2. exe,goto 00403329。如下图2。
图2 信息核对函数的汇编代码
查看上图,在地址00403329处设置断点,开始动态调试。在第一个文本框中随意输入36548,第二个文本框中输入123456987,单击check按钮,当程序执行到断点后,可以获得参数的地址及值,如图3~4。
图3 信息核对函数的参数
由上图可知,当输入用户名为36548时,序列号为979A9998。
图4 信息核对函数的参数实际值
第二种方法,绕过用户名和序列号核对的过程,直接显示提示信息。查询与信息核对有关的汇编代码。
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
由以上代码可知,如果核对信息不正确,就会执行地址:loc_00403332,即修改此处代码为NOP,就可以破解。在Ollydbg中,goto 00403332,修改为NOP,如下图5~6。
图5 信息核对不相符的转移汇编代码
图6 修改后的汇编代码
采用同样的方法,可以破解该软件的加密方法,关键代码地址为:loc_0040318B~loc_0040329A。
4 软件保护技术
虽然基于软件的加密壳保护和基于硬件的加密锁保护都是不错的软件保护技术,但是这些方法太过于流行,许多人对其有深入的了解,反而容易被破解。因此,根据自己软件的特点实现自己的独特保护方法才是最好的。例如:采用试用版和正式版分开的方法。试用版不具有正式版的核心功能,不是简单的屏蔽,而是没有相应的代码。加密方法不要过于简单,创立文件的副本,进行文件完整性检查[1],加壳、VM保护、网络验证、加密锁、反调试跟踪[2],等等。
针对本文所采用的破解方法,可以进一步完善自己的软件。如,为了防范自己的软件被第一种破解方法破解,可以对核心源代码进行加密,使之成为密文,加密的方法可以采用比较成熟的密码学算法,为了防范自己的软件被第二种破解方法,既可以对核心的代码进行加密,也可以对核心代码进行完整性检查,这些措施都可以很容易做到。
5 结语
破解已有软件,并不是为了商业目的。软件安全是信息安全的重要组成部分,它涉及到软件的加密、解密、逆向分析、漏洞分析、病毒分析等。掌握与软件安全相关的知识,既可以通过获取别人软件开发的思想、精髓,提高自己的软件开发能力,也可以通过掌握相关的知识,来增强自己软件的反汇编能力。道高一尺魔高一丈,软件的逆向分析与反逆向分析应该是一个永恒话题。
[1]陈闯.基于反汇编技术的软件破解及其应对方法[J].毕节学院学报,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-),男,湖南汉寿人,硕士研究生,讲师,网络工程师,研究方向为计算机网络技术
2015-03-12
2015-04-01