计算机软件保护方法

文档序号:6410484阅读:294来源:国知局
专利名称:计算机软件保护方法
一种计算机软件保护方法,涉及计算机安全,具体涉及软件开发与保护的技术领域。
计算机病毒的传播为害,是计算机软件保护面临的一个严峻问题。已有的保护方法大多是以某种保护机制作为运行环境,对软件进行监控诊断,如发明专利“存储信息保护机构”(中国专利号90101742.6),这类方法因系统环境的多样化和不断更新而难以普遍实施;或者是用某个专用的扫毒软件对其他软件的代码文件进行扫描,根据已知病毒的特征识别和清除病毒,如Microsoft公司的DOS6.20中的程序MSAV.EXE,这类方法因其固有的局限及病毒的诡异多变,往往错检或漏检病毒。另一类方法是建立自我保护机制,如已公开的发明“微机病毒防治的软件自保护方法”(公开号CN1068205A)。该发明提出,以附着在原软件上的程序段作保护性外壳,记录文件长度和运行入口特征参数于其中,该程序段先于软件原文运行,根据记录的与现时的特征参数之差异而检测出病毒并进行消除。但是,该发明存在明显的缺陷其一,在软件广泛流通及盗版猖獗的现实背景下,软件之“原”是值得怀疑的,故附加外壳带有风险;其二,该发明所明确提出的特征参数——文件长度和运行入口并不能充分反映文件的特征,也就动摇了该发明的实用基础,因为,完全能够设计出这样的病毒,它无需改变文件长度和运行入口却仍然可以寄生于文件之中;其三,该发明清除文件病毒的措施实际上基于这样的假设,即病毒总是附加在文件的末尾,然而遗憾的是,这一假设并不成立。
软件保护的更一般性的问题,是防止软件被篡改。除了病毒的篡改之外,还有诸如偷换版权申明、改变语言文字、修改程序代码等人为的篡改,甚至因存储体的随机故障或物理损坏造成意外的篡改,都是违背版权人意愿而需加以阻止的。
本发明的目的,是为阻止计算机软件被篡改,提供一种普遍行之有效的保护方法。
计算机软件的实体是存储文件,因此,保护软件实质上就是保护其文件。一个软件的组成至少包括一个程序文件,可能还包括一个以上数据文件。保护软件的关键是保护程序文件和重要数据文件。
首先,本发明引入软件指纹的概念。软件指纹具体而言就是其文件指纹,是以称之为特征值的简单数值或小数据块,来完整地代表或反映文件内容作为连续的字节数据序列所固有的静态特征。就指纹特征而言,软件的程序文件和数据文件并无区别,改变文件的任意字节都将导致文件指纹特征的改变。显然,指纹特征乃统计特征,系按照一定的算法计算获得。算法可以是多种多样的,只不过不同的算法之间实用效果或有差别。对文件的字节数据作累加计算便是一种简单的算法,其累加和又称为检查和,可作为一种文件指纹(尽管还比较粗糙)的特征值。本发明的实施例还将给出一个高效而实用的算法。
其次,本发明引入软件纯正的概念。一个软件是纯正的,如果其程序文件和重要数据文件是纯正的。一个文件是纯正的,如果其内容与本来的内容完全一致。纯正的文件未被篡改,被篡改的文件则不纯正。保证文件纯正的彻底办法是将现时的文件与原来的文本在内容上逐个字节加以比较,但这种原始的办法并不实用。本发明采用量化的办法,通过检测并比较文件现时的指纹特征与原先的指纹特征来鉴别文件是否纯正特征值相同则是,特征值不同则否。保护软件的纯正即保障了软件的完整性和正确性。
基于软件指纹和软件纯正的概念与思路,能够得出结论软件被篡改之必要条件,是其现时的指纹特征与原先的指纹特征不同;软件未被篡改之充分条件,是其现时的指纹特征与原先的指纹特征相同。这正是本发明的基础。
软件被篡改并不可怕,因为有办法加以恢复;可怕的是软件在被篡改之后盲目继续运行,因为由此可能造成的损失是难以估量的。本发明的目标效果,不是试图保证软件不会被篡改,而是力图保证软件本身在被篡改之后能够及时地自行发现并且阻止篡改行为的扩散。
本发明的方法包括以下两个基本步骤第一步,在软件中加入保护代码序列。具体加在程序文件中。保护代码序列在执行时将完成下列四项功能1、识别本文件和其他所保护对象文件的确切目录路径;2、按照预定的算法计算文件指纹的当前(即运行时的)特征值;3、将同一文件指纹的当前特征值与原已提取并记录的特征值进行比较鉴别;4、若发现文件指纹的特征值已改变,即判断文件已被篡改,则按照既定拒绝策略处理。
保护代码序列的基本用途,是监护其所处的程序文件,此外,也可以监护其他文件尤其是重要的数据文件。识别文件路径是必要的,是为检测文件指纹做准备。拒绝策略是容易理解和制定的,如以声音或文字示警、自动退出或由操作员选择决定,等等。
加入保护代码序列的办法,可以从外部“附加”,但本发明特别推荐,宜将保护功能作为软件应具备的必要功能或性能,从而将保护代码序列作为软件代码整体的一部分,在软件的开发期间一体化统筹编码。
保护代码序列存在于程序文件之中。若软件包括多个程序文件,则可将保护代码序列的主体集中存储于一个文件,而将这些程序文件中的保护代码序列简化为调用保护代码序列主体的入口指令序列。保护代码序列的主体还可以规范化,使之蕴含于诸如操作系统、汉字系统、数据库管理系统等运行环境之中。
加入保护代码序列,其静态位置即在文件中的存储位置并不重要,重要的是其动态位置即在程序运行路径上的激活位置。通常应安排在程序运行之初执行,或者在重要的处理操作之前执行,也可以在程序运行一段时间之后(如临结束时)执行。为了达到更好的保护效果,可以在程序运行路径上多次激活执行保护代码序列。
保护代码序列的激活机制,最简单的是顺序执行,通常是调用功能函数或子程序,也可以调用中断功能,甚至装载执行专用程序。
第二步,预先提取并记录软件指纹。在认定软件是完整的和正确的之后,比如在软件开发期间当完成了软件的编码和测试之后,使用一个外部软件工具,提取对象软件的指纹并记录于对象软件内部的文件中。
提取软件指纹,是对软件中预定保护的程序文件和重要数据文件分别提取指纹,即对文件内容预定保护范围内的连续字节数据序列,按照预定的算法进行统计计算获取特征值。所述预定保护范围通常是文件的全长,若某些程序文件在运行时需正常回写其自身,则将文件的回写区域作为变化域而予以忽略。特定情况下,所述预定保护范围可以是分段连续的。所述预定保护范围与保护代码序列所监护的文件范围保持一致。程序文件中的指令代码的操作语义被完全忽略,而作为纯数据提取软件指纹。所采用的算法与保护代码中的算法是相同的或互补的,两者的计算结果即文件指纹特征值是可以比较的。
提取的软件指纹特征值记录于软件内部的文件之中,具体位置是预定的,能够被保护代码序列在执行时正确读取。对于单一程序文件的软件,指纹特征值就记录于该文件之中;对于多文件的软件,各保护对象文件的指纹特征值既可分散纪录于各文件,也可集中记录于一个文件中。
上述两个步骤是不难实现的,完全可以贯彻于软件的开发过程中。为了提高效率、形成规范,不妨将保护代码序列的主体标准化,放入源程序库或目标程序库共享使用,并制作一个用于提取并记录软件指纹的开发工具,一劳永逸。进而,甚至可以设计出新的编译程序和开发系统,使其具备这样的功能,即自动生成软件保护代码与软件指纹。
软件被篡改在现实中在所难免,本发明的作用就在于,能够在软件被篡改后的首次运行时即准确发现被篡改的事实,并阻止其盲目继续运行,从而避免造成意外的损失,也便于从容地采取恢复措施。本发明并不试图直接从被篡改的软件自动恢复,因为如此恢复的操作并非总是可靠的,有时甚至是有害的。实际上,恢复被篡改的软件的最直接、简单而有效的办法,是用纯正的软件副本拷贝覆盖之。而借助于本发明,软件的纯正总是能够保障的。
本发明的应用,能使软件具备自我免疫能力,从而能够有效阻截计算机病毒的传播途径。此外,也有助于保护软件版权,使开发商受益。实施本发明,所需增加的软件开发成本微乎其微,而所产生的积极效果将是十分显著的。可以设想,假如众多的软件开发商承担起自己的软件保护责任,假如大量流行的系统软件和应用软件都能独善其身、自我保护,则病毒便无机可乘,广大用户的计算机使用将更加安全。


图1是本发明的构成示意。软件1至少是一个程序文件,一般是由一个以上程序文件和若干(零个或一个以上)数据文件组成的文件集合。保护代码序列2存储在软件1的程序文件中,是在软件1的开发期间一体化编码的。保护代码序列2的一种变体,是简化为调用保护代码序列主体的指令序列,而保护代码序列主体则存储于别的文件,甚至蕴含于软件1所赖以运行的系统环境之中。软件指纹3是分别对软件1中各具体保护对象文件的既定保护范围内的连续字节序列,计算所得的一组统计特征值。外部软件工具4被用来提取软件1的软件指纹3,并写入软件1的文件中。有向直线上标记的字符,R表示读所指向的对象,W表示写所指向的对象。
图2是本发明的保护代码序列的执行流程。其中,“提取当前文件指纹”包括了打开文件、读取字节数据、按预定算法统计计算指纹特征值及关闭文件等诸项必要操作,“比较文件指纹”即比较文件的当前指纹特征值与原先记录的指纹特征值,“正常返回”意味着软件继续运行,“拒绝执行”即按既定策略处置软件被篡改的情况。
以下给出本发明的一个实施例,适用于DOS环境下单一程序文件情形。至于多程序文件及包括数据文件的情形,不难参照此例实施。
采用计算循环冗余码(CRC)算法来提取文件指纹。生成多项式取16位CRC-CCITT,即X16+X12+X5+1,文件字节数据的16位CRC值即作为文件指纹的特征值。CRC技术已在通信领域广泛应用,有关理论和长期实践均证明其检错效果非常理想。故以CRC值来表征文件指纹是十分恰当的。
保护代码序列是在设计程序时加入的,以功能函数的方式编制。主程序的第一条指令立即调用该功能函数,执行下列操作1、从程序段前缀(PSP)偏移128处开始的命令行(首字节为行长)参数中,取第一个参数串作为本程序文件的确切目录路径;2、打开文件并取文件全长,读入全部数据,扣除最后一个字(2字节)计算CRC值,然后关闭文件;3、将所得CRC值与文件最后一个字值(原CRC值)比较;4、两个CRC值若相等则正常返回,若不等则提示程序已被篡改,然后结束运行。
另外设计一个文件名为CT.EXE的工具程序,完成如下功能1、从程序段前缀(PSP)偏移128处开始的命令行(首字节为行长)参数中,跳过第一个参数串(即程序本身的目录路径),取第二个参数串作为给定的对象文件的确切目录路径;2、打开文件并取文件全长,读入全部数据,计算CRC值;3、移动文件指针至末尾,写入CRC值,使文件增长2字节;4、关闭文件。
上述程序段前缀(PSP)是由DOS系统在装载程序运行时创建的,其偏移128处开始的命令行参数亦由系统填入,可被程序在运行时读取。
假定一个包含保护代码序列的新程序文件名为PG.EXE,则使用工具程序CT.EXE,在DOS命令行执行CT PG.EXE即完成对程序PG.EXE预先提取和记录软件指纹的操作,程序PG.EXE于是便具备了自我保护的能力。
权利要求
1.一种计算机软件保护方法,是使软件包含保护代码序列,而且预先提取软件指纹记录之,所述保护代码序列在软件运行时被执行,通过检查比较当前的软件指纹和所记录的软件指纹来鉴别软件本身的纯正,并阻止软件在被篡改之后继续运行,所述保护方法的特征是所述保护代码序列是在软件开发期间作为软件功能代码整体的一部分而生成的;所述软件指纹为统计特征,是将软件本身的具体文件的全文或其中部分内容的连续字节序列作为数据,按照预定的算法计算获得并以数据的形式记录的。
2.一种计算机软件,其中包含保护代码序列,所述保护代码序列执行时检测软件指纹,其特征是,所述保护代码序列用于为别的软件提供功能调用,或为别的软件生成保护代码序列。
3.根据权利要求1的计算机软件保护方法,其特征是,所述保护代码序列和预先提取的软件指纹由程序语言编译器或软件开发系统自动生成。
4.根据权利要求1的计算机软件保护方法,其特征是,所述保护代码序列包含于其所直接保护的文件之中。
5.根据权利要求1的计算机软件保护方法,其特征是,所述保护代码序列的主体存在于其所直接保护的文件之外。
6.根据权利要求1的计算机软件保护方法,其特征是,所述保护代码序列的主体蕴含于系统运行环境之中。
7.根据权利要求1的计算机软件保护方法,其特征是,所述预先提取的软件指纹记录在保护代码序列所处同一文件之中。
8.根据权利要求1的计算机软件保护方法,其特征是,所述预先提取的软件指纹记录在保护代码序列所处文件之外。
9.根据权利要求1的计算机软件保护方法,其特征是,所述预先提取的软件指纹,是对软件的两个以上文件所分别提取的指纹,集中记录在一个文件中。
10.根据权利要求2的计算机软件,其特征是,具备为别的软件生成软件指纹的功能。
全文摘要
计算机软件保护方法,涉及计算机安全,具体涉及软件开发与保护。基于软件指纹和软件纯正的概念与思路,提出软件被篡改之必要条件及未被篡改之充分条件;检测指纹鉴别纯正,确保软件及时自行发现其被篡改并阻止篡改扩散。步骤包括在软件(1)中加入保护代码序列(2)及用工具(4)预先提取记录软件指纹(3),其特征在于保护代码序列在软件开发期间生成且软件指纹为统计特征。本发明使软件具备自免疫能力,可有效阻截病毒传播。
文档编号G06F17/00GK1155700SQ9611282
公开日1997年7月30日 申请日期1996年9月8日 优先权日1996年9月8日
发明者杨筑平, 周跃平 申请人:周跃平
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1