专利名称:一种软件保护方法
技术领域:
本发明涉及软件保护领域,特别是涉及一种通过还原恢复和代码位置随机变化保 护软件的方法。
背景技术:
随着信息技术的发展,软件产业越来越受到人们的重视,软件产业在计算机工业 中占有很重要的比例。一般情况下,为了开发成功一个系统软件或者应用软件,软件开发厂 商需要投入巨大的时间和精力,其中往往需要动用大量的人力和物力。但是,巨大的付出并 不总是意味着巨大的回报。软件开发出来之后,一方面盗版者通过调试器可以轻易地去除 软件的保护措施,然后就可以无限制地免费使用软件的功能。令一方面,在软件运行的过程 中,一些病毒会篡改软件的可执行指令序列,导致软件功能受损或者暗藏恶意代码,用户体 验下降。这些影响会给软件开发商造成巨大的损失,打击了开发者的积极性,最终严重阻碍 了软件产业的健康发展。为了打击盗版和对抗病毒,业界先后出现了一系列的软件保护技术。最有代表性 的是软 件的认证技术。软件认证的一般流程如图1所示在软件启动的时候,软件的认证模 块会读取软件的授权信息,如果软件授权信息不匹配或者不存在,那么软件就会停止运行。 这些授权信息一般由软件厂商发送给用户,有序列号,数字签名,根据用户信息生成的授权 文件等形式。由于仅仅在软件启动的时候进行授权认证,所以盗版者一旦跳过这一步认证,那 么软件的授权信息将彻底失效。为了克服这一个缺陷,业界也发明了相应的解决方法。其 中一种典型的方法就是在软件运行的过程中定时检查软件的授权信息,如果发现授权信息 不匹配,那么就停止软件的运行。这样,即使软件启动时候的认证步骤被跳过,软件在某个 时候依然会停止运行。另外一种方法就是在软件的不同位置插入认证功能。当运行到这些 位置的时候,认证功能模块就会发生作用。这样,即使软件启动位置的认证步骤被跳过,软 件运行过程中运行到这些认证功能模块的时候依然可以认证授权是否合法。以上这些方法在软件保护方面发挥了很重要的作用。但是这些方法有一个缺陷, 就是不能抵抗破解者利用调试器对软件进行破解。此外,随着软件技术的发展,病毒技术也有很大的发展。病毒能够在软件运行的过 程中寄生在软件内部。病毒可以不修改磁盘中保存的文件,所以反病毒软件在扫描这些可 执行文件的过程中将会一无所获。在软件运行的过程中,如果受到病毒的感染,而应用软件 本身往往不具备清除病毒的能力,那么一直到应用软件终止之前,病毒都会依附在应用软 件之中。
发明内容
本发明所要解决的技术问题在于一种软件保护方法,提高破解者破解软件的难 度,同时提供软件对抗病毒感染的免疫能力,以此增加软件的安全性能,保护软件开发者的权益。
本发明解决技术问题的技术方案是一种软件保护方法,包括以下步骤(1)在WINDOWS下可执行软件启动的时候,保留一份软件的原始拷贝,用于软件运 行过程中所受损害的恢复;(2)建立一个重定位信息表,该重定位信息表记录了原软件重定位表的信息, 并且根据区段的划分,记录不同区段之间的指令跳转信息;指令跳转信息数据项包括 sSection、dSection、sbase 禾口 dbase ;其中 sSection 是原区段编号,dSection 是目标区段 编号,sbase是程序的需重定位的目标地址区段的原地址,dbase是程序的需重定位的目标 地址;将该指令跳转信息添加到重定位信息表中;该重定位信息表记录了原软件重定位表 的信息和代码扰乱之后的重定位信息;(3)启动随机数产生器A ;利用随机数产生器A计算一个时间长度Tlen ;启动随机 数产生器B,利用随机数产生器B计算一组位置数据positionDathpositionData是(1,2, 3,…,η)的一个数据排列,η为位置数据中位置的个数,该组位置数据就是程序指令扰乱之 后存放的新位置信息;(4)启动一个定时器Timer,该定时器的定时长度是所述Tlen;定时器Timer实现 在随机的一段时间Tlen内进行一次程序指令的扰乱;(5)当定时器Timer到达预定时间长度Tlen,定时器Timer触发一个定时事件;当 定时事件发生,进入步骤(6);(6)根据步骤(3)产生的位置数据positionData,把软件原始拷贝的不同区段复 制到所述positionData记录的位置;(7)根据步骤(2)得到的重定位信息表执行重定位操作,如编译器编译的转移地 址是address,可执行文件头的基址是fbase,程序实际加载的基址是mbase,则重定位修 正的最终地址值是address+mbase-fbase+dbase-sbase ;定向本软件进程的指令指针寄存 器;返回步骤(3)。所述步骤(1)保留一份软件的原始拷贝是通过搜索WINDOWS下可执行软件头标志 “MZ”,确定该软件的起始地址,读取和文件长度,使用memcpy函数保留一份该软件的原始 拷贝。所述步骤(3)中Tlen的产生方法随机数产生器A产生随机数randomNum,根据 应用场合选择一个数m,则Tlen = random% m m = 10所述步骤(3)中的一组位置数据positionDat 为(2,1,4,3,5,8,7,6)。所述步骤(6)中假如原始代码不同区段的位置分布是(1,2,3,4),positionData 的信息是(2,1,4,3),那么就把区段2复制到原区段1的位置,把区段1复制到原区段2的 位置,把区段3复制到原区段4的位置,把区段4复制到原区段3的位置。本发明与现有的软件保护技术相比,具有以下的优点1.从动态的角度出发提高了盗版者破解软件的难度。现有的软件保护技术基于 软件的授权信息认证,这些方法只是从密码学方面提供破解难度,而没有从软件可执行指 令方面考虑保护软件。而实际上破解者所拥有的最强大的手段是可执行指令层面的破解技 术。本发明从可执行指令层面出发,随机动态改变软件代码的分布,使得代码的位置无法预测,提高了软件破解的难度,达到了软件保护的目的;2.提供了软件自我修复的免疫能力。软件在运行的过程中会在一段随机的时间内 对当前代码进行复制覆盖,覆盖后的内容是软件某个区段的原始代码,所以即使当前代码 被破解者修改,或者受到病毒感染,也会恢复到初始的健康状态,从而使得软件破解失效, 病毒感染无效。
图1是一种现有技术的软件保护方法流程图;图2是本发明中将软件文件划分成不同的区段示意图;图3是本发明所记录的不同区段的跳转关系示意图;图4是本发明重新排列区段后执行重定位处理示意图;图5是在原软件增加一个代码区段处理流程示意图。
具体实施例方式下面结合实施例对本发明作进一步的说明,但本发明要求保护的范围并不局限于 实施例表示的范围实施例1 应用于现存软件的反破解现在互联网上存在大量的应用软件。这些软件很多都是较早之前就已经开发出 来。由于缺乏保护意识和相应的安全技术,这些软件在编写的过程中并没有采取足够的安 全措施,导致它们没有得到很好的保护。为了加入保护措施,可以采取这样一种措施重新 编写或者修改并重新编译这些软件的源代码。但是由于开发者,设备和资金等种种原因,这 样做的代价是十分巨大的,因此这种方案可行性不高。但是另一方面,因为软件的保护涉及 软件开发者的利益,如果一个软件能够轻易盗版,那么软件开发者的利益就会受损,这样就 会打击软件开发的积极性,长期下来会对软件产业造成严重危害。更好的软件保护方法是在现存软件的基础上加入保护措施,而无需得到和修改 软件的源代码。本发明应用到现存软件中,可以增加软件保护功能,提高软件破解的难度, 从而防止软件破解,保护软件开发者的利益。如图1-5,本发明软件免疫方法应用于现存软件中,包括以下步骤(1)如图5所示,将本发明的软件免疫方法编写成成可执行的程序,该可执行的程 序定义为软件保护功能模块;在原软件增加一个可执行代码区段,把软件保护功能模块保 存到该可执行代码区段;将原软件的代码入口点修改为此新增的可执行代码区段;(2)在WINDOWS下可执行软件启动的时候,保留一份软件的原始拷贝,用于软件运 行过程中所受损害的恢复;(3)建立一个重定位信息表,该重定位信息表记录了原软件重定位表的信息,并 且根据区段的划分,记录 不同区段之间的指令跳转信息。指令跳转信息数据项的格式是 (sSection, dSection, sbase, dbase) ;sSection 是原区段编号,dSection 是目标区段编号, sbase是程序的需重定位的目标地址区段的原地址,dbase是程序的需重定位的目标地址。 把这些指令跳转信息添加到重定位信息表中,该重定位信息表就记录了原软件重定位表的 信息和代码扰乱之后的重定位信息。第(8)步重定位操作使用了该重定位信息表。
(4)启动随机数产生器A ;利用随机数产生器A计算一个时间长度Tlen ;Tlen的产 生方法是A产生随机数randomNum,根据应用场合选择一个数m,例如m = 10,则Tl en = random% m ;启动随机数产生器B,利用随机数产生器B计算一组位置数据positionData, positionData 是(1,2,3, ...,n)的一个排列,例如 positionData 的一次数据可能是(2,1, 4,3,…,η),这组位置数据就是程序指令扰乱之后存放的新位置信息;(5)启动一个定时器Timer,此定时器的定时长度是Tlen ;Timer可以实现定时功 能,在随机的一段时间内进行一次程序指令的扰乱;(6)当定时器Timer到达预定时间长度Tlen,它将会触发一个定时事件;当定时事 件发生,进入步骤(7);(7)根据(4)产生的位置数据positionData把软件原始拷贝的不同区段复制到 positionData记录的位置;例如假如原始代码的位置分布是(1,2,3,4),positionData的 信息是(2,1,4,3),那么就把区段2复制到原区段1的位置,把区段1复制到原区段2的位 置,把区段3复制到原区段4的位置,把区段4复制到原区段3的位置;(8)根据(3)得到的重定位信息表执行重定位操作。重定位操作的过程是这样的, 假如编译器编译的转移地址是address,可执行文件头的基址是fbase,程序实际加载的基 址是mbase,则重定位修正的最终地址值是address+mbase-fbase+ dbase_sbase ;定向本软 件进程的指令指针寄存器;返回步骤(4)。实施例2 应用于软件开发中防止逆向工程本发明是一种软件免疫保护方法。如果在软件开发的过程中使用本方法,那么不 仅实施难度更加小,而且保护效果也应该会更好。本发明的原理在于随机变更受保护代码的分布,通过受保护代码的不可预料的调 度来实现软件代码的保护。由于受调度的代码块是可以自定义的,所以在软件开发的过程 中就可以配置规定受保护的机密代码。如果这些代码的重定位信息非常少,那么后期的处 理就会非常简单。另外,代码调度算法也是可以自定义的,因此尽可以设计复杂巧妙的调度 算法,增强保护强度。最后,在软件开发中使用本发明中的方法,可以省略保护功能代码的 插入,做到自然嵌入。本发明应用于软件开发过程中,可以增加软件保护功能,提高软件破解的难度,从 而防止软件破解,保护软件开发者的利益。在软件开发中使用本发明中的方法的步骤(1)为保护功能代码设置一个独立的可执行代码区段(可选);保护功能代码置于 软件代码入口点,这样软件保护功能在程序开始执行的时候就发挥作用;也可以在程序运 行之后单独使用一个线程执行保护功能代码;(2)在WINDOWS下可执行软件启动的时候,保留一份软件的原始拷贝,用于软件运 行过程中所受损害的恢复;(3)建立一个重定位信息表,该重定位信息表记录了原软件重定位表的信息,并 且根据区段的划分,记录不同区段之间的指令跳转信息。指令跳转信息数据项的格式是 (sSection, dSection, sbase, dbase) ;sSection 是原区段编号,dSection 是目标区段编号, sbase是程序的需重定位的目标地址区段的原地址,dbase是程序的需重定位的目标地址。 把这些指令跳转信息添加到重定位信息表中,该重定位信息表就记录了原软件重定位表的 信息和代码扰乱之后的重定位信息。第(8)步重定位操作使用了该重定位信息表。
(4)启动随机数产生器A ;利用随机数产生器A计算一个时间长度Tlen ;Tlen的 产生方法是A产生随机数randomNum,根据应用场合选择一个数m,例如m = 10,则Tlen = random% m ;启动随机数产生器B,利用随机数产生器B计算一组位置数据positionData, positionData 是(1,2,3, ...,n)的一个排列,例如 positionData 的一次数据可能是(2,1, 4,3,…,η),这组位置数据就是程序指令扰乱之后存放的新位置信息;(5)启动一个定时器Timer,此定时器的定时长度是Tlen ;Timer可以实现定时功 能,在随机的一段时间内进行一次程序指令的扰乱;(6)当定时器Timer到达预定时间长度Tlen,它将会触发一个定时事件;当定时事 件发生,进入步骤(7);(7)根据(4)产生的位置数据positionData把软件原始拷贝的不同区段复制到 positionData记录的位置;例如假如原始代码的位置分布是(1,2,3,4),positionData的 信息是(2,1,4,3),那么就把区段2复制到原区段1的位置,把区段1复制到原区段2的位 置,把区段3复制到原区段4的位置,把区段4复制到原区段3的位置; (8)根据(3)得到的重定位信息表执行重定位操作。重定位操作的过程是这样的, 假如编译器编译的转移地址是address,可执行文件头的基址是fbase,程序实际加载的基 址是mbase,则重定位修正的最终地址值是address+mbase-fbase+dbase_sbase ;定向本软 件进程的指令指针寄存器;返回步骤(4)。在实际的运行过程中,如果程序遭受病毒篡改或者破坏,由于步骤(7)的复制覆 盖操作,病毒的篡改或者破坏作用将会无效,达到软件免疫的作用;如果软件遭遇破解者的 调试分析,那么由于步骤⑷ ⑵的操作,破解者无法得到稳定一致的可执行代码,破解 难度大大加大;如果软件被破解者打上热补丁,由于步骤(7)的复制覆盖操作,破解将会无 效,达到软件免疫的作用。
权利要求
1. 一种软件保护方法,其特征在于,包括以下步骤(1)在WINDOWS下可执行软件启动的时候,保留一份软件的原始拷贝,用于软件运行过 程中所受损害的恢复;(2)建立一个重定位信息表,该重定位信息表记录原软件重定位表的信息,并且根据 区段的划分,记录不同区段之间的指令跳转信息;指令跳转信息数据项包括sSection、 dSection、sbase禾口 dbase ;其中sSection是原区段编号,dSection是目标区段编号,sbase 是程序的需重定位的目标地址区段的原地址,dbase是程序的需重定位的目标地址;将该 指令跳转信息添加到重定位信息表中;使重定位信息表记录原软件重定位表的信息和代码 扰乱之后的重定位信息;(3)启动随机数产生器A;利用随机数产生器A计算一个时间长度Tlen;启动随机数 产生器B,利用随机数产生器B计算一组位置数据positionData,positionData是(1,2, 3,…,η)的一个数据排列,η为位置数据中位置的个数,该组位置数据为程序指令扰乱之后 存放的新位置信息;(4)启动一个定时器Timer,该定时器的定时长度是所述Tlen;定时器Timer实现在随 机的一段时间Tlen内进行一次程序指令的扰乱;(5)当定时器Timer到达预定时间长度Tlen,定时器Timer触发一个定时事件;当定时 事件发生,进入步骤(6);(6)根据步骤(3)产生的位置数据positionData,把软件原始拷贝的不同区段复制到 所述positionData记录的位置;(7)根据步骤(2)得到的重定位信息表执行重定位操作,若编译器编译的转移地址是 address,可执行文件头的基址是fbase,程序实际加载的基址是mbase,则重定位修正的最 终地址值是address+mbase-fbase+dbase-sbase ;定向本软件进程的指令指针寄存器;返 回步骤⑶。
2.根据权利要求1所述的软件保护方法,其特征在于,所述步骤(1)保留一份软件的原 始拷贝是通过搜索WINDOWS下可执行软件头标志“MZ”,确定该软件的起始地址,读取和文 件长度,使用memcpy函数保留一份该软件的原始拷贝。
3.根据权利要求1所述的软件免疫方法,其特征在于,所述步骤(3)中Tlen的产 生方法随机数产生器A产生随机数randomNum,根据应用场合选择一个数m,则Tlen = random % mm = 10。
4.根据权利要求1所述的软件保护方法,其特征在于,所述步骤(3)中的一组位置数 据 positionDat 为(2,1,4,3,5,8,7,6)。
5.根据权利要求1所述的软件保护方法,其特征在于,所述步骤(6)中假如原始代码不 同区段的位置分布是(1,2,3,4), positionData的信息是(2,1,4,3),那么就把区段2复制 到原区段1的位置,把区段1复制到原区段2的位置,把区段3复制到原区段4的位置,把 区段4复制到原区段3的位置。
全文摘要
本发明公开了一种软件保护方法。软件启动时,保留一份软件的原始拷贝;建立一个重定位信息表;启动两个随机数产生器;利用随机数产生器计算时间长度和位置数据;判断前述定时器是否到达预定时间,如果是,则根据位置变化数据扰乱代码的分布,把软件原始拷贝的不同区段复制到不同的位置,执行重定位操作。
文档编号G06F21/22GK102004885SQ20101053221
公开日2011年4月6日 申请日期2010年10月30日 优先权日2010年10月30日
发明者李拥军, 潘炳镇, 谢嵘, 黄格仕 申请人:华南理工大学