CN101216775A - 一种软件程序的保护方法、装置及系统 - Google Patents
一种软件程序的保护方法、装置及系统 Download PDFInfo
- Publication number
- CN101216775A CN101216775A CNA2008100559922A CN200810055992A CN101216775A CN 101216775 A CN101216775 A CN 101216775A CN A2008100559922 A CNA2008100559922 A CN A2008100559922A CN 200810055992 A CN200810055992 A CN 200810055992A CN 101216775 A CN101216775 A CN 101216775A
- Authority
- CN
- China
- Prior art keywords
- code
- virtual system
- virtual
- software
- instruction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Storage Device Security (AREA)
Abstract
本发明实施例中公开了一种软件程序的保护方法,该方法预先设置虚拟系统指令集,并构造能够运行所述虚拟系统指令集指令的软件虚拟系统,所述软件虚拟系统运行于计算机上,并为所述软件程序提供一部分运行环境,在执行软件程序之前,按照虚拟系统指令集将所述软件程序中需要保护的程序源代码转换为虚拟系统指令,得到包含虚拟系统代码段的目标代码;在执行所述目标代码时,对于虚拟系统代码段,由软件虚拟系统解释执行。本发明实施例中还提供了一种指令转换器和一种软件虚拟系统,采用本发明技术方案使得软件破解者难以实施反汇编或反编译等反向工程,从而有效保护了软件程序。
Description
技术领域
本发明涉及软件保护技术,具体来说涉及一种软件程序的保护方法、装置及系统。
背景技术
随着经济技术的飞速发展,软件作为辅助工具已经深入到了各行各业当中。软件程序是软件设计者和软件编程人员智慧的结晶,软件企业的生存和发展是软件产品充足供应的基础,因而,保护软件程序的版权,防止软件程序被盗版、被非法授权使用,具有很重要的现实意义。
传统的软件程序保护措施有:序列号保护、使用时间限制、软件加壳等;其具体实现就是:在软件程序中设置相应的功能模块,实现相应的保护功能,例如:防拷贝功能、加密功能、限制使用时间的功能等。破解者要达到破解软件程序的目的,通常采用以下两种方式:
第一种方式是静态分析技术,就是利用反编译或反汇编技术得到源程序清单,进而分析软件程序的流程,了解各个模块所完成的功能,从而通过修改软件程序来达到破解的目的。例如:可以通过修改某模块的判断条件,使相应模块的保护功能失效,从而达到破解的目的。下面简要介绍反编译和反汇编技术:
使用高级语言编写的软件程序需要按照运行该软件程序的计算机的主机系统指令集(也可称为机器语言指令集),转换为由一条一条的主机系统指令(也可称为机器语言指令)构成的机器语言代码才能被计算机识别并执行。通常,将转换前的软件程序称为源程序,将转换后得到的代码称为目标代码。
汇编语言是一种介于高级语言与机器语言之间的低级语言,它与机器语言相比具有便于记忆、符合人类语言表达习惯的特性,机器语言与汇编语言之间存在几乎一一对应的映射关系。由机器语言目标代码得到汇编语言程序的过程称为反汇编;由机器语言目标代码得到高级语言源程序的过程称为反编译。因此,只要获取到软件程序的机器语言目标代码,就能通过反汇编技术或反编译技术将其转化成便于破解者理解的汇编语言程序或高级语言源程序。
上述静态分析技术正是通过在软件程序执行之前,获取软件程序的机器语言目标代码,然后利用反编译和反汇编技术来达到破解的目的。
第二种方式是动态分析技术,即破解者利用调试工具跟踪软件的运行,了解软件关键算法的流程和功能,并通过取消软件程序的防拷贝或加密功能等,达到破解的目的。这种方式中最重要的工具就是调试器,例如:SoftICE,OllyDbg等。
一方面,目前的通用计算机体系中,不存在对静态分析技术和动态分析技术进行防范的技术;另一方面,现有技术中存在众多功能强大的、对应于目前通用的主机系统指令集的调试器及相应的使用手册,使得破解者能够非常容易地实施动态分析技术,而且,大部分软件开发人员对于主机系统指令比较熟悉,可以很方便地对软件程序进行分析,导致现有软件程序保护措施无法对软件程序提供真正有效的保护。
发明内容
有鉴于此,本发明提供一种软件程序保护的方法、装置及系统,以对软件程序的安全性提供有效的保护。
为达到上述目的,本发明实施例的技术方案具体是这样实现的:
一种软件程序保护方法,预先设置虚拟系统指令集,由虚拟系统指令集中的虚拟系统指令构成的代码段为虚拟系统代码段;并构造能够识别所述虚拟系统指令集的软件虚拟系统,所述软件虚拟系统运行于计算机上,所述软件虚拟系统是所述软件程序的运行环境,该方法还包括:
A、按照所述虚拟系统指令集将所述软件程序中需要保护的程序源代码转换为虚拟系统指令,得到包含虚拟系统代码段的目标代码;
B、在执行所述目标代码时,对于虚拟系统代码段,由所述软件虚拟系统将其按照所述计算机的主机系统指令集解析为机器语言指令并执行。
进一步地,在所述软件虚拟系统运行之前或运行过程中,可以包括:
判断所述软件虚拟系统是否已经与信息安全硬件设备绑定,如果已经绑定,则运行软件虚拟系统;否则,终止软件虚拟系统的运行。
所述步骤A可以包括:
A1、确定软件程序中需要保护的程序源代码;
A2、读取所述软件程序源代码,将所读取到的需要保护的程序源代码按照虚拟系统指令集转换为对应的虚拟系统指令,得到对应的虚拟系统代码段;将所读取到的除所述需要保护的程序源代码之外的程序源代码按照主机系统指令集转换为对应的机器语言指令,得到对应的机器语言代码段;
A3、得到由虚拟系统代码段和机器语言代码段构成的目标代码。
进一步地,在执行步骤A2所述将所读取到的需要保护的程序源代码按照虚拟系统指令集转换为对应的虚拟系统指令时,可以使用数据加密变换算法对所读取到的程序源代码中的数据进行加密变换;
在执行步骤B所述解析时,可以进一步使用与所述数据加密变换算法对应的数据解密变换算法对所述虚拟系统指令中的数据进行解密变换。
所述预先设置的虚拟系统指令集可以包括:自定义的指令集。
一种指令转换器,包括:
程序源代码读取模块,用于读取并判断程序源代码,将需要保护的程序源代码发送给虚拟指令转换模块;
虚拟指令转换模块,用于将来自于程序源代码读取模块的程序源代码转换为对应的虚拟系统指令,并发送给目标代码生成模块;
目标代码生成模块,用于将来自于虚拟指令转换模块的虚拟系统指令放在目标代码中与所述需要保护的程序源代码对应的目标代码的位置。
较佳地,所述程序源代码读取模块,还可以用于将除所述需要保护的程序源代码之外的程序源代码发送给机器指令转换模块;
所述指令转换器中进一步可以包括:机器指令转换模块,用于将来自于程序源代码读取模块的程序源代码转换为对应的机器语言指令,并发送给目标代码生成模块;
所述目标代码生成模块,还可以用于将来自于机器指令转换模块的机器语言指令放在目标代码中与所述除所述需要保护的程序源代码之外的程序源代码对应的目标代码的位置。
所述虚拟指令转换模块,还可以用于使用数据加密变换算法对来自于程序源代码读取模块的程序源代码中的数据进行加密变换。
一种软件虚拟系统,包括:
虚拟代码接口模块,用于读入包含虚拟系统代码段的目标代码,当识别到所述目标代码中的虚拟系统代码段时,通知虚拟代码执行模块;所述虚拟系统代码段为:由预先设置的虚拟系统指令集中的虚拟系统指令构成的代码段;
虚拟代码执行模块,用于根据虚拟代码接口模块的通知,从所述虚拟系统代码段中读入虚拟系统指令,按照运行所述软件虚拟系统的计算机的主机系统指令集将所述虚拟系统指令解析为机器语言指令,并执行所述解析得到的机器语言指令。
进一步地,所述软件虚拟系统中可以包括:
判断模块,用于在虚拟代码接口模块读入目标代码之前或虚拟代码执行模块的执行过程中,判断软件虚拟系统是否已经与信息安全硬件设备绑定,如果没有绑定则终止软件虚拟系统运行,如果已经绑定则由虚拟代码接口模块或虚拟代码执行模块继续执行。
所述虚拟代码接口模块,还可以用于将虚拟系统代码段的位置、大小通知虚拟代码执行模块中的代码读取子模块,并用于接收来自于代码执行子模块的执行结果;
代码读取子模块,可以用于根据虚拟代码接口模块通知的虚拟系统代码段的位置,从目标程序的相应位置读取虚拟系统指令,发送给代码解析子模块;并用于判断是否已读取完虚拟系统代码段的指令,在已读取完时,通知代码执行子模块;
代码解析子模块,可以用于按照运行所述软件虚拟系统的计算机的主机系统指令集将来自于代码读取子模块的虚拟系统指令解析为机器语言指令,并发送给代码执行子模块;
代码执行子模块,可以用于执行来自于代码解析子模块的机器语言指令,并根据来自于代码读取子模块的通知,向虚拟代码接口模块返回所述虚拟系统代码段的执行结果。
所述虚拟代码接口模块,还可以用于将数据变换算法、数据变换密钥通知代码解析子模块;
所述代码解析子模块,还可以用于根据虚拟代码接口模块通知的数据变换算法和数据变换密钥对来自于代码读取子模块的虚拟系统指令中的数据进行解密变换,并将解密变换后得到的数据发送给代码执行子模块。
由上述技术方案可见,本发明所提供的软件程序保护方案的实现过程是:预先设置虚拟系统指令集,并构造能够识别该虚拟系统指令集的软件虚拟系统为软件程序提供运行环境,然后将软件程序中需要保护的部分程序源代码按照所述虚拟系统指令集转换为虚拟系统指令,并在执行包含虚拟系统代码段的目标代码时,由所述软件虚拟系统将虚拟系统代码段转换为相应的机器语言指令执行。所述软件虚拟系统在运行前以及运行的过程中,还可以随时判断是否与信息安全硬件设备绑定,即:没有信息安全硬件设备,所述软件虚拟系统无法运行。如此,可以为软件程序提供另一层保护。
可见,在本发明技术方案中,软件程序中需要保护的部分程序源代码是先被转换成仅能被软件虚拟系统识别的虚拟系统指令,然后由软件虚拟系统转换成相应的机器语言指令执行的。如此,一方面,目标代码中包含虚拟系统代码段,而破解者并不知道本发明所采取的虚拟系统指令集,也就无从知道所述虚拟系统代码段与编写软件程序所采用的高级语言之间的对应关系,当破解者采用静态分析技术分析目标代码时,无法反汇编或反编译出正确的源程序;另一方面,虚拟系统代码段不是直接运行于实际硬件主机的CPU上,而是由软件虚拟系统转换为机器语言指令执行的,由于软件虚拟系统本身的地位也等同于一个软件程序,软件虚拟系统本身的执行过程也具有一定的复杂性,因此,如果想采用动态分析技术来破解被保护的软件程序,首先需要成功分析出本发明软件虚拟系统的执行流程,并从软件虚拟系统的执行流程区分出被保护软件程序的执行流程,其难度非常大;然后,还需要破解本发明预先设置的虚拟系统指令集,这大大增加了破解的难度;最后一方面,软件虚拟系统在运行前以及运行过程中,随时可以判断是否与信息安全硬件设备绑定,如果没有绑定则软件虚拟系统无法运行,因而没有信息安全硬件设备的破解者将无法使用软件虚拟系统,也就不可能对运行时的软件虚拟系统进行动态跟踪。
由此可见,采用本发明技术方案使得破解者很难对被保护软件程序实施反向工程,因此,可以较好地防备破解软件程序必须采用的两种途径,从而可以在很大程度上保护软件程序的安全性。
附图说明
图1为本发明软件程序的保护方法的流程示意图;
图2示出了图1所示步骤102中指令转换的流程示意图;
图3为本发明指令转换器的组成结构示意图;
图4为本发明软件虚拟系统的组成结构示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明作进一步详细说明。
本发明实施例的主要思想是:预先设置虚拟系统指令集,并构造能够识别该虚拟系统指令集的软件虚拟系统为软件程序提供运行环境,然后将软件程序中需要保护的部分程序按照所述虚拟系统指令集转换为虚拟系统指令,并在执行包含虚拟系统代码段的目标代码时,由所述软件虚拟系统将虚拟系统代码段转换为相应的机器语言指令执行。下面结合附图详细说明本发明技术方案的实现过程。
图1为本发明软件程序的保护方法的流程示意图。参见图1,该方法包括:
步骤101:预先设置虚拟系统指令集,并构造能够识别所述虚拟系统指令集的软件虚拟系统。
本发明所述虚拟系统指令集是一套指令的集合,与机器语言指令集等其他指令集类似,每一条指令均存在确切的语义,因此,该集合中的指令与高级语言程序中的指令之间存在一定的对应关系,相应地,该集合中的指令与机器语言指令之间也存在一定的对应关系。也就是说:
可以按照该虚拟系统指令集,将用高级语言编写的软件程序中的每一条或几条语句转换为对应的虚拟系统指令,这些转换后的虚拟系统指令组合在一起,就构成了与软件程序对应的虚拟系统代码。在本发明后续描述中,将由虚拟系统指令集中的虚拟系统指令构成的一段代码称为虚拟系统代码段。
当然,也可以按照主机系统指令集进行虚拟系统指令与主机系统指令之间的转换,即:将虚拟系统代码中的每一条或几条指令转换为对应的主机系统指令。
假设本发明所述软件程序和软件虚拟系统运行于目前最通用的计算机系统——x86系统下,那么,较佳地,可以自定义一套不同于x86主机系统指令集的指令集作为本发明所述虚拟系统指令集。当然也可以采用现有技术中已经存在、但是较为不通用的指令集,只要不同于运行软件程序和软件虚拟系统的计算机的主机系统指令集即可。现有技术中存在一些不如x86主机系统通用的计算机系统,相应地,存在一些不如x86主机系统指令集通用的指令集,针对这些主机系统指令集很难获取到通用的调试工具,因此,即使采用这些指令集作为本发明所述虚拟系统指令集,也能增加破解的难度。
本步骤所构造的软件虚拟系统是被保护软件程序的运行环境,也就是说:被保护软件程序并不是如通常情况那样,直接运行于主机CPU上,而是运行于软件虚拟系统中,其所有功能都将转化为软件虚拟系统的相应操作执行,因此,对主机CPU来说,只能感知到软件虚拟系统的执行,无法直接感知被保护软件程序的执行。本发明所述软件虚拟系统其实质上可以看作是运行于主操作系统之上的一个虚拟操作系统,其地位等同于运行于计算机上的普通软件程序。
所构造的软件虚拟系统需要能够识别本发明预先设置的虚拟系统指令集,如此,才能明确每一个虚拟系统指令的语义,并将其解析为相应的机器语言指令并执行。
步骤102:进行指令转换:按照预先设置的虚拟系统指令集将软件程序中需要保护的程序源代码转换为虚拟系统指令,得到包含虚拟系统代码段的目标代码。
本步骤中,将按照虚拟系统指令集转换软件程序中需要保护的部分或全部程序源代码,得到对应的虚拟系统代码段,并按照软件虚拟系统所在的计算机的主机系统指令集转换软件程序中除需要保护的程序源代码之外的程序源代码,得到对应的机器语言代码段,最终得到的目标代码中将包含虚拟系统代码段和机器语言代码段。
在执行所述代码转换的过程中,可以使用数据加密变换算法对程序源代码中的数据进行加密变换,相应的,在后续解析、执行时,需要使用相应的数据解密变换算法和解密密钥对虚拟系统指令中的数据进行解密变换。
可以构造相应的指令转换器来实现本步骤所述转换。该指令转换器可以作为与本发明所述软件虚拟系统配套的软件程序,独立运行于计算机上,也可以作为本发明所述软件虚拟系统的一个功能模块,运行于软件虚拟系统中。
步骤103:判断软件虚拟系统是否已经与信息安全硬件设备绑定,如果已经绑定,则运行软件虚拟系统,并继续执行步骤104;否则,软件虚拟系统无法运行,从而目标代码也无法执行,结束本方法流程。
本步骤所述信息安全硬件设备是指:实现了软件加密保护或身份认证等功能的硬件。本步骤所述判断软件虚拟系统是否已经与信息安全硬件设备绑定可以采用多种方式,例如:
可以由软件虚拟系统调用信息安全硬件设备的应用编程接口(API,Application Programming Interface)来检查信息安全硬件设备是否连接在主机上;
或者,也可以通过向信息安全硬件设备发送一些输入数据,看信息安全硬件设备能否根据一定的输入返回对应的输出,来判断软件虚拟系统是否绑定了安全硬件设备。
本步骤中判断软件虚拟系统是否已经与信息安全硬件设备绑定的操作不仅可以在执行目标代码之前运行,也可以在其他适当的时机进行,例如,可以在软件虚拟系统中定时、随机或采取其他方式确定的时机进行,即:可以在步骤104之前,或步骤104~步骤108之间的任何时刻执行本步骤所述判断。执行所述判断达到的效果是:如果没有绑定信息安全硬件设备,则软件虚拟系统无法运行或者其运行是不正确的。
以下通过步骤104~步骤108,详细描述目标代码在软件虚拟系统中的执行过程:
步骤104:判断当前指令是否是虚拟系统指令,如果是,表示已执行到目标代码中的虚拟系统代码段,继续执行步骤105;否则,表示执行的是目标代码中的机器语言代码段,直接执行当前指令,并针对当前指令的下一条指令执行所述步骤104。
步骤105:读取虚拟系统代码段中的当前虚拟系统指令。
步骤106:按照主机系统指令集将所读取到的虚拟系统指令解析为机器语言指令。
如前所述,虚拟系统指令集中的每一条指令均存在确切的语义,虚拟系统指令与机器语言指令之间存在一定的对应关系,而本发明提供的软件虚拟系统具备识别该虚拟系统指令集的功能,因而能够按照机器语言指令集将所读取到的虚拟系统指令解析为相应的机器语言指令。
如果在步骤102所述指令转换的过程中,对程序源代码中的数据进行了加密变换,那么在本步骤中,需要采用相应的数据解密变换算法和解密密钥对虚拟系统指令中的数据进行解密。
步骤107:执行机器语言指令。
在执行上述解析、执行的过程中,可以根据实际应用的需要对所述指令以顺序、并行或乱序等方式进行,这样可以进一步加大破解的难度。
步骤108:判断虚拟系统代码段是否执行完,如果尚未执行完,则将当前虚拟系统指令的下一条指令作为当前虚拟系统指令,返回执行步骤105;否则,继续执行步骤109。
步骤109:将虚拟系统代码段的执行结果返回。
本步骤中,如果整个目标代码已执行完,此时,可以将执行结果返回;否则,如果仅仅是本段虚拟系统代码段已执行完,可以将执行结果返回给后续的机器语言代码段作为输入参数使用,或者也可以将执行结果保存。
在目标代码尚未执行完的情况下,由于后续可能还存在虚拟系统代码段,因此,可以继续返回执行步骤104,直至执行完目标代码中的所有指令,得到执行结果,由软件虚拟系统将该执行结果返回,该执行结果就是软件程序的执行结果。
至此,结束本发明软件程序的保护方法的流程。
图2示出了图1所示步骤102中指令转换的流程示意图。参见图2,该指令转换过程包括:
步骤201:逐条或一次多条地读取软件程序中的源代码。
步骤202:判断所读取的软件程序源代码是否为需要保护的程序源代码,如果是,则继续执行步骤203;否则,继续执行步骤204。
步骤203:将所读取到的程序源代码按照虚拟系统指令集转换为虚拟系统指令,继续执行步骤205。
步骤204:将所读取到的除所述需要保护的程序源代码之外的程序源代码按照主机系统指令集转换为机器语言指令,继续执行步骤205。
步骤205:判断所述软件程序源代码是否已转换完,如果未转换完,则继续执行步骤201,读取软件程序源代码中的下一条或多条源代码;如果已转换完,则生成目标程序。
经过上述步骤201~步骤205的转换之后,已经将软件程序源代码转换成了由相应的虚拟系统代码段和机器语言代码段组成的目标程序。
至此,得到包含虚拟系统代码段、机器语言代码段,结束指令转换过程。
由上述实施例可见,在本发明提供的软件保护方法中,软件程序中需要保护的部分程序源代码是先被转换成仅能被软件虚拟系统识别的虚拟系统指令,然后由软件虚拟系统转换成相应的机器语言指令执行的。如此,一方面,目标代码中包含虚拟系统代码,而破解者并不知道本发明所采取的虚拟系统指令集,也就无从知道所述虚拟系统代码与软件程序语言之间的对应关系,当破解者采用静态分析技术分析目标代码时,无法反汇编或反编译出正确的源程序;另一方面,虚拟系统代码不是直接运行于实际硬件主机的CPU上,而是由软件虚拟系统转换为机器语言指令执行的,由于软件虚拟系统本身的地位也等同于一个软件程序,软件虚拟系统本身的执行过程也具有一定的复杂性,因此,如果想采用动态分析技术来破解被保护的软件程序,首先需要成功分析出本发明软件虚拟系统的执行流程,并从软件虚拟系统的执行流程区分出被保护软件程序的执行流程,其难度非常大;然后,还需要破解本发明预先设置的虚拟系统指令集,这大大增加了破解的难度。最后,软件虚拟系统在运行前以及运行的过程中,随时可以判断是否与信息安全硬件设备绑定,没有绑定则软件虚拟系统无法运行,因而没有信息安全硬件设备的破解者无法使用软件虚拟系统,也就不可能对运行时的软件虚拟系统进行动态跟踪。由此可见,采用本发明技术方案使得破解者很难对被保护软件程序实施反向工程,因此,可以较好地防备破解软件程序必须采用的两种途径,从而可以在很大程度上保护软件程序的安全性。
下面结合附图,对本发明提供的指令转换器及软件虚拟系统进行详细说明。
图3为本发明指令转换器的组成结构示意图。参见图3,该指令转换器包括:
程序源代码读取模块310,用于读取并判断程序源代码,将需要保护的程序源代码发送给虚拟指令转换模块320;
虚拟指令转换模块320,用于将来自于程序源代码读取模块的程序源代码转换为对应的虚拟系统指令,并发送给目标代码生成模块330;
目标代码生成模块330,用于将来自于虚拟指令转换模块320的虚拟系统指令放在目标代码中与所述需要保护的程序源代码对应的目标代码的位置。
图3所示指令转换器中还可以包括:机器指令转换模块340,用于将来自于程序源代码读取模块310的除需要保护的程序源代码之外的程序源代码转换为对应的机器语言指令,并发送给目标代码生成模块330;
此时,程序源代码读取模块310,还用于将除所述需要保护的程序源代码之外的程序源代码发送给机器指令转换模块340;
目标代码生成模块330,还用于将来自于机器指令转换模块340的机器语言指令放在目标代码中与所述除所述需要保护的程序源代码之外的程序源代码对应的目标代码的位置。
图3所示虚拟指令转换模块320,还可以用于使用数据加密变换算法对来自于程序源代码读取模块的程序中的数据进行加密变换。
图4为本发明软件虚拟系统的组成结构示意图。参见图4,该软件虚拟系统包括:
虚拟代码接口模块410,用于读入包含虚拟系统代码段的目标代码,当识别到所述目标代码中的虚拟系统代码段时,通知虚拟代码执行模块420;所述虚拟系统代码段为:由预先设置的虚拟系统指令集中的虚拟系统指令构成的代码段;
虚拟代码执行模块420,用于根据虚拟代码接口模块410的通知,从所述虚拟系统代码段中读入虚拟系统指令,按照运行所述软件虚拟系统的计算机的主机系统指令集将所述虚拟系统指令解析为机器语言指令,并执行所述解析得到的机器语言指令。
图4所示软件虚拟系统中可以进一步包括:判断模块,用于在虚拟代码接口模块410读入目标代码之前或虚拟代码执行模块420的执行过程中,判断软件虚拟系统是否已经与信息安全硬件设备绑定,如果没有绑定则中止软件虚拟系统运行,如果已经绑定则由虚拟代码接口模块410或虚拟代码执行模块420继续执行。
图4所示虚拟代码执行模块420中可以包括:代码读取子模块421、代码解析子模块422和代码执行子模块423,分别用于完成上述读入虚拟系统指令、将虚拟系统指令解析为机器语言指令和执行机器语言指令的操作。
图4所示虚拟代码接口模块410,还可以用于将虚拟系统代码段的位置、大小通知虚拟代码执行模块中的代码读取子模块421,并用于接收来自于代码执行子模块423的执行结果;
代码读取子模块421,用于根据虚拟代码接口模块410通知的虚拟系统代码段的位置,从目标程序的相应位置读取虚拟系统指令,发送给代码解析子模块422;并用于判断是否已读取完虚拟系统代码段的指令,在已读取完时,通知代码执行子模块423;
代码解析子模块422,用于按照运行所述软件虚拟系统的计算机的主机系统指令集将来自于代码读取子模块的虚拟系统指令解析为机器语言指令,并发送给代码执行子模块423;
代码执行子模块423,用于执行来自于代码解析子模块422的机器语言指令,并根据来自于代码读取子模块421的通知,向虚拟代码接口模块410返回所述虚拟系统代码段的执行结果。
如果在指令转换的过程中,对软件程序中的数据进行了加密变换,则图4所示虚拟代码接口模块410,还可以用于将数据变换算法、数据变换密钥通知代码解析子模块422;
所述代码解析子模块422,还用于根据虚拟代码接口模块410通知的数据变换算法和数据变换密钥对来自于代码读取子模块421的虚拟系统指令中的数据进行解密变换,并将解密变换后得到的数据发送给代码执行子模块423。
由上述实施例可见,利用本发明提供的指令转换器可以将软件程序中需要保护的部分程序源代码转换成仅能被软件虚拟系统识别的虚拟系统代码,然后由本发明软件虚拟系统将虚拟系统代码转换成相应的机器语言指令执行。如此,一方面,目标代码中包含虚拟系统代码,而破解者并不知道本发明所采取的虚拟系统指令集,也就无从知道所述虚拟系统代码与软件程序语言之间的对应关系,当破解者采用静态分析技术分析目标代码时,无法反汇编或反编译出正确的源程序;另一方面,虚拟系统代码不是直接运行于实际硬件主机的CPU上,而是由软件虚拟系统转换为机器语言指令执行的,由于软件虚拟系统本身的地位也等同于一个软件程序,软件虚拟系统本身的执行过程也具有一定的复杂性,因此,如果想采用动态分析技术来破解被保护的软件程序,首先需要成功分析出本发明软件虚拟系统的执行流程,并从软件虚拟系统的执行流程区分出被保护软件程序的执行流程,其难度非常大;然后,还需要破解本发明预先设置的虚拟系统指令集,这大大增加了破解的难度。最后一方面,软件虚拟系统在运行前以及运行的过程中,随时可以判断是否与信息安全硬件设备绑定,没有绑定则软件虚拟系统无法运行,因而没有信息安全硬件设备的破解者无法使用软件虚拟系统,也就不可能对运行时的软件虚拟系统进行动态跟踪。
由上述分析可见,采用本发明技术方案使得破解者很难对被保护软件程序实施反向工程,因此,可以较好地防备破解软件程序必须采用的两种途径,从而可以在很大程度上保护软件程序的安全性。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (12)
1.一种软件程序保护方法,其特征在于,预先设置虚拟系统指令集,由虚拟系统指令集中的虚拟系统指令构成的代码段为虚拟系统代码段;并构造能够识别所述虚拟系统指令集的软件虚拟系统,所述软件虚拟系统运行于计算机上,所述软件虚拟系统是所述软件程序的运行环境,该方法还包括:
A、按照所述虚拟系统指令集将所述软件程序中需要保护的程序源代码转换为虚拟系统指令,得到包含虚拟系统代码段的目标代码;
B、在执行所述目标代码时,对于虚拟系统代码段,由所述软件虚拟系统将其按照所述计算机的主机系统指令集解析为机器语言指令并执行。
2.根据权利要求1所述的方法,其特征在于,在所述软件虚拟系统运行之前或运行过程中,进一步包括:
判断所述软件虚拟系统是否已经与信息安全硬件设备绑定,如果已经绑定,则运行软件虚拟系统;否则,终止软件虚拟系统的运行。
3.根据权利要求1或2所述的方法,其特征在于,所述步骤A包括:
A1、确定软件程序中需要保护的程序源代码;
A2、读取所述软件程序源代码,将所读取到的需要保护的程序源代码按照虚拟系统指令集转换为对应的虚拟系统指令,得到对应的虚拟系统代码段;将所读取到的除所述需要保护的程序源代码之外的程序源代码按照主机系统指令集转换为对应的机器语言指令,得到对应的机器语言代码段;
A3、得到由虚拟系统代码段和机器语言代码段构成的目标代码。
4.根据权利要求3所述的方法,其特征在于,在执行步骤A2所述将所读取到的需要保护的程序源代码按照虚拟系统指令集转换为对应的虚拟系统指令时,进一步使用数据加密变换算法对所读取到的程序源代码中的数据进行加密变换;
在执行步骤B所述解析时,进一步使用与所述数据加密变换算法对应的数据解密变换算法对所述虚拟系统指令中的数据进行解密变换。
5.根据权利要求3所述的方法,其特征在于,所述预先设置的虚拟系统指令集包括:自定义的指令集。
6.一种指令转换器,其特征在于,包括:
程序源代码读取模块,用于读取并判断程序源代码,将需要保护的程序源代码发送给虚拟指令转换模块;
虚拟指令转换模块,用于将来自于程序源代码读取模块的程序源代码转换为对应的虚拟系统指令,并发送给目标代码生成模块;
目标代码生成模块,用于将来自于虚拟指令转换模块的虚拟系统指令放在目标代码中与所述需要保护的程序源代码对应的目标代码的位置。
7.根据权利要求6所述的指令转换器,其特征在于:
所述程序源代码读取模块,还用于将除所述需要保护的程序源代码之外的程序源代码发送给机器指令转换模块;
所述指令转换器中进一步包括:机器指令转换模块,用于将来自于程序源代码读取模块的程序源代码转换为对应的机器语言指令,并发送给目标代码生成模块;
所述目标代码生成模块,还用于将来自于机器指令转换模块的机器语言指令放在目标代码中与所述除所述需要保护的程序源代码之外的程序源代码对应的目标代码的位置。
8.根据权利要求6或7所述的指令转换器,其特征在于:
所述虚拟指令转换模块,还用于使用数据加密变换算法对来自于程序源代码读取模块的程序源代码中的数据进行加密变换。
9.一种软件虚拟系统,其特征在于,包括:
虚拟代码接口模块,用于读入包含虚拟系统代码段的目标代码,当识别到所述目标代码中的虚拟系统代码段时,通知虚拟代码执行模块;所述虚拟系统代码段为:由预先设置的虚拟系统指令集中的虚拟系统指令构成的代码段;
虚拟代码执行模块,用于根据虚拟代码接口模块的通知,从所述虚拟系统代码段中读入虚拟系统指令,按照运行所述软件虚拟系统的计算机的主机系统指令集将所述虚拟系统指令解析为机器语言指令,并执行所述解析得到的机器语言指令。
10.根据权利要求9所述的软件虚拟系统,其特征在于,所述软件虚拟系统中进一步包括:
判断模块,用于在虚拟代码接口模块读入目标代码之前或虚拟代码执行模块的执行过程中,判断软件虚拟系统是否已经与信息安全硬件设备绑定,如果没有绑定则终止软件虚拟系统运行,如果已经绑定则由虚拟代码接口模块或虚拟代码执行模块继续执行。
11.根据权利要求9或10所述的软件虚拟系统,其特征在于,所述虚拟代码接口模块,还用于将虚拟系统代码段的位置、大小通知虚拟代码执行模块中的代码读取子模块,并用于接收来自于代码执行子模块的执行结果;
代码读取子模块,用于根据虚拟代码接口模块通知的虚拟系统代码段的位置,从目标程序的相应位置读取虚拟系统指令,发送给代码解析子模块;并用于判断是否已读取完虚拟系统代码段的指令,在已读取完时,通知代码执行子模块;
代码解析子模块,用于按照运行所述软件虚拟系统的计算机的主机系统指令集将来自于代码读取子模块的虚拟系统指令解析为机器语言指令,并发送给代码执行子模块;
代码执行子模块,用于执行来自于代码解析子模块的机器语言指令,并根据来自于代码读取子模块的通知,向虚拟代码接口模块返回所述虚拟系统代码段的执行结果。
12.根据权利要求11所述的软件虚拟系统,其特征在于,所述虚拟代码接口模块,还用于将数据变换算法、数据变换密钥通知代码解析子模块;
所述代码解析子模块,还用于根据虚拟代码接口模块通知的数据变换算法和数据变换密钥对来自于代码读取子模块的虚拟系统指令中的数据进行解密变换,并将解密变换后得到的数据发送给代码执行子模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2008100559922A CN101216775A (zh) | 2008-01-03 | 2008-01-03 | 一种软件程序的保护方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2008100559922A CN101216775A (zh) | 2008-01-03 | 2008-01-03 | 一种软件程序的保护方法、装置及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101216775A true CN101216775A (zh) | 2008-07-09 |
Family
ID=39623214
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2008100559922A Pending CN101216775A (zh) | 2008-01-03 | 2008-01-03 | 一种软件程序的保护方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101216775A (zh) |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102136052A (zh) * | 2011-04-29 | 2011-07-27 | 北京深思洛克软件技术股份有限公司 | 一种软件的保护方法 |
CN102486820A (zh) * | 2010-12-03 | 2012-06-06 | 邹芬 | 一种软件保护的方法及系统 |
CN102521541A (zh) * | 2011-12-09 | 2012-06-27 | 台达电子企业管理(上海)有限公司 | 加密狗装置及其软件保护方法 |
CN102760072A (zh) * | 2012-05-12 | 2012-10-31 | 北京深思洛克软件技术股份有限公司 | 软件保护装置与计算机配合执行cpu指令的方法 |
CN102831342A (zh) * | 2012-07-28 | 2012-12-19 | 北京深思洛克软件技术股份有限公司 | 一种提高安卓系统中应用程序保护强度的方法 |
CN102939608A (zh) * | 2010-03-25 | 2013-02-20 | 埃德图加拿大公司 | 抗边通道和重复调用攻击的动态、可变定时操作路径的系统和方法 |
CN103443765A (zh) * | 2011-02-01 | 2013-12-11 | 耶德托公司 | 自适应混淆的虚拟机 |
CN103514027A (zh) * | 2013-11-12 | 2014-01-15 | 北京深思数盾科技有限公司 | 一种增强软件保护易用性的方法 |
CN103902858A (zh) * | 2013-12-25 | 2014-07-02 | 武汉安天信息技术有限责任公司 | 一种apk应用加固的方法及系统 |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN106961411A (zh) * | 2016-01-08 | 2017-07-18 | 上海木鸡网络科技有限公司 | 一种数据传输方法及系统 |
CN107688728A (zh) * | 2016-08-05 | 2018-02-13 | 上海木鸡网络科技有限公司 | 程序安全加密方法及装置 |
CN108027748A (zh) * | 2015-07-23 | 2018-05-11 | 国立大学法人东京工业大学 | 指令集模拟器及其模拟器生成方法 |
CN110825386A (zh) * | 2019-11-01 | 2020-02-21 | 腾讯科技(深圳)有限公司 | 代码的编译方法和装置、存储介质 |
CN113420266A (zh) * | 2021-06-21 | 2021-09-21 | 北京中天瑞合科技有限公司 | 一种计算机系统集成软件保护方法及其装置 |
CN114707124A (zh) * | 2022-03-22 | 2022-07-05 | 广东技术师范大学 | 基于代码虚拟化的.net平台代码保护方法和系统 |
CN115688708A (zh) * | 2023-01-03 | 2023-02-03 | 江西曼荼罗软件有限公司 | 一种适用多种操作系统的病历编辑器控制方法及系统 |
-
2008
- 2008-01-03 CN CNA2008100559922A patent/CN101216775A/zh active Pending
Cited By (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102939608A (zh) * | 2010-03-25 | 2013-02-20 | 埃德图加拿大公司 | 抗边通道和重复调用攻击的动态、可变定时操作路径的系统和方法 |
CN102486820A (zh) * | 2010-12-03 | 2012-06-06 | 邹芬 | 一种软件保护的方法及系统 |
CN103443765A (zh) * | 2011-02-01 | 2013-12-11 | 耶德托公司 | 自适应混淆的虚拟机 |
CN102136052A (zh) * | 2011-04-29 | 2011-07-27 | 北京深思洛克软件技术股份有限公司 | 一种软件的保护方法 |
CN102521541B (zh) * | 2011-12-09 | 2015-04-01 | 台达电子企业管理(上海)有限公司 | 加密狗装置及其软件保护方法 |
CN102521541A (zh) * | 2011-12-09 | 2012-06-27 | 台达电子企业管理(上海)有限公司 | 加密狗装置及其软件保护方法 |
CN102760072A (zh) * | 2012-05-12 | 2012-10-31 | 北京深思洛克软件技术股份有限公司 | 软件保护装置与计算机配合执行cpu指令的方法 |
CN102760072B (zh) * | 2012-05-12 | 2015-12-16 | 北京深思数盾科技有限公司 | 软件保护装置与计算机配合执行cpu指令的方法 |
CN102831342B (zh) * | 2012-07-28 | 2016-01-06 | 北京深思数盾科技有限公司 | 一种提高安卓系统中应用程序保护强度的方法 |
CN102831342A (zh) * | 2012-07-28 | 2012-12-19 | 北京深思洛克软件技术股份有限公司 | 一种提高安卓系统中应用程序保护强度的方法 |
CN103514027A (zh) * | 2013-11-12 | 2014-01-15 | 北京深思数盾科技有限公司 | 一种增强软件保护易用性的方法 |
CN103514027B (zh) * | 2013-11-12 | 2017-04-26 | 北京深思数盾科技股份有限公司 | 一种增强软件保护易用性的方法 |
CN103902858A (zh) * | 2013-12-25 | 2014-07-02 | 武汉安天信息技术有限责任公司 | 一种apk应用加固的方法及系统 |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN108027748A (zh) * | 2015-07-23 | 2018-05-11 | 国立大学法人东京工业大学 | 指令集模拟器及其模拟器生成方法 |
CN108027748B (zh) * | 2015-07-23 | 2019-09-10 | 国立大学法人东京工业大学 | 指令集模拟器及其模拟器生成方法 |
CN106961411B (zh) * | 2016-01-08 | 2020-11-27 | 上海木鸡网络科技有限公司 | 一种数据传输方法及系统 |
CN106961411A (zh) * | 2016-01-08 | 2017-07-18 | 上海木鸡网络科技有限公司 | 一种数据传输方法及系统 |
CN107688728A (zh) * | 2016-08-05 | 2018-02-13 | 上海木鸡网络科技有限公司 | 程序安全加密方法及装置 |
CN110825386A (zh) * | 2019-11-01 | 2020-02-21 | 腾讯科技(深圳)有限公司 | 代码的编译方法和装置、存储介质 |
CN110825386B (zh) * | 2019-11-01 | 2023-07-14 | 腾讯科技(深圳)有限公司 | 代码的编译方法和装置、存储介质 |
CN113420266A (zh) * | 2021-06-21 | 2021-09-21 | 北京中天瑞合科技有限公司 | 一种计算机系统集成软件保护方法及其装置 |
CN114707124A (zh) * | 2022-03-22 | 2022-07-05 | 广东技术师范大学 | 基于代码虚拟化的.net平台代码保护方法和系统 |
CN115688708A (zh) * | 2023-01-03 | 2023-02-03 | 江西曼荼罗软件有限公司 | 一种适用多种操作系统的病历编辑器控制方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101216775A (zh) | 一种软件程序的保护方法、装置及系统 | |
US10176324B2 (en) | System, method and computer program product for protecting software via continuous anti-tampering and obfuscation transforms | |
CN101393521B (zh) | Windows应用程序内部固化数据的提取系统 | |
CN101568927B (zh) | 混淆计算机程序代码 | |
Tamada et al. | Design and evaluation of birthmarks for detecting theft of java programs. | |
CA2447451C (en) | Information security method and system | |
US7584364B2 (en) | Overlapped code obfuscation | |
El-Khalil et al. | Hydan: Hiding information in program binaries | |
JP6227772B2 (ja) | 動的ライブラリを保護する方法及び装置 | |
EP2388730A1 (en) | Method for generating software code | |
WO2010077000A2 (ko) | 소프트웨어 분리 실행 방법, 장치 및 컴퓨터로 읽을 수 있는 기록매체 | |
CN104091100A (zh) | 一种基于编译中间结果的软件保护方法 | |
CN101477610A (zh) | 源码和目标码联合嵌入的软件水印方法 | |
Falcarin et al. | Exploiting code mobility for dynamic binary obfuscation | |
CN103020495A (zh) | 一种嵌入式软件防盗版加密方法 | |
CN102136052A (zh) | 一种软件的保护方法 | |
Balachandran et al. | Software protection with obfuscation and encryption | |
Ghosh et al. | A secure and robust approach to software tamper resistance | |
CN108182358B (zh) | 文件保护方法、装置、计算设备及计算机存储介质 | |
CN105653908A (zh) | 一种隐式反调试保护方法 | |
Xue et al. | Exploiting code diversity to enhance code virtualization protection | |
Tanimoto et al. | Risk Assessment Quantification of Ambient Service | |
Gautam et al. | A novel software protection approach for code obfuscation to enhance software security | |
CN105095698A (zh) | 基于最近执行的程序代码的程序代码模糊处理 | |
US9239913B2 (en) | Method for obfuscating a computer program |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Open date: 20080709 |