从软件中提取部分代码至加密装置中的软件版权保护方法

文档序号:6649466阅读:191来源:国知局
专利名称:从软件中提取部分代码至加密装置中的软件版权保护方法
技术领域
本发明涉及一种软件版权保护方法,特别是一种经编译后所生成的含有指令代码的程序文件中提取部分代码至加密装置中的软件版权保护方法。
背景技术
程序文件指经编译后所生成的含有二进制指令代码的文件。本发明就是针对程序文件实施的软件版权保护的技术方案。
数据文件主要是指那些不含有指令代码的文件,如图片、文档、数据库文件等。
本文中提及的代码如无特别注释说明则仅指二进制指令代码。
源代码文件一般为文本格式,包括可被相应的编译器所识别用于描述程序流程及计算规则的字符串和标识符号,经过编译器处理可转换为程序文件。
多年来软件被盗版一直是困扰众多开发商的重大难题,所以许多开发商不得不在软件产品的开发过程中就投入精力去编制软件保护功能模块,尤其是那些售价相对较高,面向特定行业的专业软件产品。
但在一个产品的开发过程中投入精力去实现软件保护功能并非总能收到奇效,最终所能达到的保护效果并非总是与投入的精力成正比。毕竟与软件保护及加密相关的功能的开发需要以一定的实践经验为基础,根据软件产品的具体特点,制定软件保护方案,并在软件开发的初期就着手保护方案的量身设计。正是由于软件保护功能实现的复杂性的存在,所以大多开发商还是会选择一套现成的软件保护类产品,并在软件开发的后期结合到自己的产品中去。
在众多的软件保护方面的产品中,多年来软件加密锁产品仍然是为大家所熟悉且被普遍使用的软件保护产品。
加密锁也称加密狗,是一种带有独立CPU、RAM及非易失存储器的一种小型硬件装置,它可通过计算机的数据通讯接口与计算机连接,能够存储、管理数据,并可预置加密算法功能,同时也可后期自行定制部分算法功能。当一个软件产品结合了加密锁进行保护后,软件就无法离开加密锁而正常运行,这个软件产品就与加密锁硬件无形地绑定在了一起,软件就好象被这个装置锁住了似的,故称加密锁。
目前基于加密锁进行软件保护主要有两种方式一是结合加密锁厂商所提供的API接口,改造软件功能,在源代码中嵌入对加密锁功能的访问,使自己的软件与锁中的数据或算法相绑定。在程序运行期间尽可能地使程序的重要模块脱离加密锁后就无法正常运行,这样即使存放在硬盘上的程序文件及数据文件被复制了,只要加密锁没被复制,那么软件运行时必然仍需要加密锁的参与,因而软件也就无法被盗版。
缺点需要专业程序员来实施方案的开发,开发周期长,保护强度可控性低,强度受限于开发者的经验,开发经验越丰富的人所开发出的加密功能模块的保护强度会相对更高些。
二是利用加密锁厂商所提供的工具软件直接对开发环境所生成的程序文件进行操作,从而使这个文件结合上了保护功能模块,即外壳加密。
缺点同一外壳加密工具所保护的不同应用软件的破解过程存在一定的相似性,被保护的内容会在计算机的内存中重现。应用代码与后期外壳加密工具插入的代码联系松散,理论上通过时间的积累总能完整地进行分离并最终被破解。(即,相似性、重现性、松散性)外壳加密主要是指对一个已经由编译器所生成的含有指令码的程序文件的结构进行改造,使另一个或多个含有指令码的二进制文件片段能顺利地与这个文件相结合,形成一个新的程序文件。在原理上有些类似于计算机病毒技术,而如果这段后期插入的代码片段能起到防盗版作用,那么就是业内所俗称的加密锁外壳加密。本发明就是针对现有的加密锁外壳加密技术的一种改进。应用本发明所保护的不同应用软件的破解过程将会有很大的区别,所被保护的内容将不会出现在计算机的内存中。经过本发明所保护的应用软件被分解为计算机内运行部分及加密装置内运行部分,应用软件的正常执行与对应的存有应用程序一部分代码片段的加密装置紧密地相关联,所以相对于现有的外壳加密技术会更难于被破解。解决了以上提到的现有技术中的不足。
在软件保护技术的实际应用中,许多开发商都会认为加密模块的设计是非常麻烦的事情,因而有相当数目的软件保护方案都是在软件即将发布时才开始着手设计。这样的保护方案在设计上一般都过于粗糙,加密模块虽然最终可以与软件自身的功能代码编译到一起,但由于加密模块与原有的软件应用功能模块在逻辑上结合得不够紧密,软件也往往非常容易就被解密者分析清而被破解掉。而外壳加密技术的引入在一定程度上突破了这方面限制,软件的应用功能的开发与加密功能的实现完全可独立地进行,软件保护功能模块可由这一领域的专业公司去完成,这样不但可完全省去方案的设计过程,而且还有一定的安全强度,可以说是“事半功倍”。
现存外壳加密技术的基本工作原理示意图可参看附1。
如图1所示,某个软件项目中相关的源代码文件经过编译器和链接器的编译、链接过程后便生成了二进制的程序文件“APP”。而图1所示的代码块“BIN”代表软件保护及与验证相关的功能模块实现的代码。经过加壳工具对原来程序文件结构的分析,通过修改文件的头信息将两部分代码整合在一起,便形成了一个新的受保护的可执行文件。而这个新的程序文件在运行条件满足的情况下与受保护前的程序的外在行为表现是一样的,而在运行条件不满足时就无法正常运行。这样就使得原来的程序文件看起来好象穿了一层外衣一样,而大家更习惯于称其为外壳。在外壳加密技术中,外壳所起到的作用就是包裹于一个程序文件之上,使软件的非法使用者无法见到其原本信息(如代码或数据信息,软件正常使用时的功能表现等等)。有些工具在加壳过程中,根据程序文件格式的细节特点,会利用加壳工具对图1中的“APP”代码块的内容进行加密,从而使得原来的程序代码必须在“BIN”代码存在前提下才能被还原正常执行。这种做法使得加密强度得到进一步的提升,但从图1中我们也可以很容易看到,壳的功能代码在逻辑上与所被保护的程序文件的代码之间有着非常明显的分界线。虽然受保护的程序文件的代码从表面上看不到真实的内容,但在程序运行期间,加载到内存中的内容与受保护前的代码在内存中的内容几乎是完全相同的,这也正是现有的外壳加密技术的不安全所在。
从上面的分析中,我们了解到现有的外壳加密在技术上有着其先天的不足,主要是因为软件保护功能模块是后期与应用软件的主体功能代码相绑定的,且这种绑定只是简单地数据拼接,两部分代码没有过多的内在联系,这使得在利用破解工具进行分析时,还是很容易分辨出壳代码与原始的程序代码。壳的代码几乎与程序的原始代码功能没什么联系,并且壳的代码内容往往是相对固定的。正是由于这段代码与所被保护的软件功能代码的联系过于松散及相对固定的特性,使得与外壳加密的软件保护相关的破解总是具有一定的通用性。即基于同一款、同一版外壳加密工具保护的两个软件产品,只要其中一个产品被破解,那么对另一个产品的破解过程也大体上是极为相似。
另外,现有的外壳加密技术实际上更多的只是对程序文件在磁盘上的内容的保护,而程序正常运行时,必然要在某一刻在计算机的内存中还原其真实内容,而在发生还原操作的那一瞬间便使得被壳所保护的程序代码完全曝光于内存之中,而将这些还原到内存中的代码进行捕获,便有可能很完整地恢复被壳所保护的程序的原来面貌。所以程序文件内容在内存中的重现性也是现有的外壳保护技术无法回避的一个问题。
上面论述了现有的外壳加密技术中不可回避的几问题
◇同一款壳所保护的不同程序的破解过程的相似性。
◇被壳所保护的程序的代码在内存中的重现性。
◇壳的功能代码与被保护的程序联系松散性。

发明内容
本发明克服了上述缺陷,提供了一种既能保证应用软件开发商简化自己的软件保护方案的设计,而同时又能提升软件版权保护安全强度的从程序文件中提取部分代码至加密装置中的软件版权保护方法。
本发明解决其技术问题所采取的技术方案是将程序文件的代码分解为两部分,一部分代码在计算机中运行,另一部分在加密装置中运行,其步骤如下(1)程序编码分析引擎用于从所要保护的程序文件中分解出多个代码区块;(2)代码加密引擎用于将分解出的代码区块转换到加密装置中;(3)文件处理用于将访问所述代码区块所需的与加密装置的通讯功能绑缚到所要保护的程序文件上。
所述步骤1)中还可包括一个模拟执行过程,用于在将分解出的代码块移至加密装置之前,在计算机中进行模拟仿真运行,如果模拟过程失败,则重新执行步骤1),如模拟过程成功,则执行步骤2)。
所述模拟执行过程中还可包括一个资源消耗的分析过程,用于判断代码块资源消耗是否合理。
所述步骤3)中的文件处理引擎,将提取的代码块与被保护的文件之间可通过调用建立对应关系,插入转向加密装置功能访问的附加代码调用序列。
所述步骤3)中文件处理过程,还可包括将原程序文件的剩余部分的代码之间的提取过代码块之后的空洞进行填充过程。
提取代码方式可为(a)随机方式选取,软件开发商可设定提取的代码块数量变化的范围,及每个代码块大小的变化范围用于控制代码块选取操作的随机性。
(b)自动选取,提供调用频度分析结果,由软件开发商决定选择调用频度合适的代码块。
(c)软件开发商指定代码块开始及结束的位置。
所述加密装置可为用于软件版权保护的具有安全存储功能的加密装置,包括加密锁、加密卡、加密盒。
本发明通过将程序文件中的代码分解为两部分,将提取出的至少一个代码块在计算机中运行,其余部分在加密装置中运行,使得软件开发商在软件产品的开发过程中不必投入过多的精力去编制软件保护程序,在提升加密的安全强度的同时并没有增加应用软件开发商的负担,只需将所要保护的软件产品的程序文件的部分代码分解成块,再存入加密装置中。存有程序文件部分代码的加密装置具有了所被保护的程序文件的功能,加密装置与所被保护的程序文件完全联系在了一起,从而解决了传统外壳加密当中后期所绑定的壳代码与应用的代码结合得不够紧密的问题,使得外壳的破解难度得到了提升。同时解决了外壳加密的破解方法在理论上具有一定通用性的问题,这就使得外壳加密的安全强度能基本上接近源代码编写方式实现的加密保护。


图1为现有加密技术的工作原理示意2为本发明中的工作原理示意3为本发明中的整体工作流程4为本发明中程序编码分析引擎的工作流程5为本发明中代码加密引擎的工作流程6为本发明中文件处理模块的工作流程7为本发明中指令模拟过程的工作流程图具体实施方式
本发明是根据密码学原理将所要保护的应用程序文件的指令代码信息进行分解,提取相对适合的比例的指令代码到加密装置中,破坏所要保护的程序文件中代码信息在计算机中的可视完整性。既要保证代码信息量不能过大,不超过加密装置的处理能力,同时又要保证所分解并提取出来的数据信息不会被解密者利用提取后剩余的代码信息所逆向推导出来。对于同一个程序文件进行加密时,所提取的每个代码块越大,并且每次提取的代码块的数量越多则安全性会相对越高。至于每个代码块的具体大小、变化范围及代码块的数量的随机值可由开发商根据自己应用的资源需求情况自行设定,也可以设定默认的数值范围,从而增强代码块选取的随机度的可控性。
本发明的基本思想就是将原来在计算机上运行的程序文件的代码分解成两部分,通过提取一部分代码段转移到加密装置中去运行,其余部分代码仍然在计算机上运行。被分解后的两个部分相辅相成,当两部分实体同时存在时,其外在的行为表现与加密前的一个完整应用程序的功能保持一致,但如果缺少加密装置中的代码时应用程序则完全无法象程序加密前一样正常工作。其实现原理如图2中所示,将原来的程序文件“APP”205通过一个程序编码分析引擎从所要保护的程序文件中分解出若干个大小合适的代码区块201,提取分解出的代码区块通过代码加密引擎转换到加密装置202中形成图中的201。在被移去部分代码的程序203的空洞位置204通过文件处理模块与代码区块201之间建立对应关系,保证在程序运行的过程中仍为完整的应用程序。对于不同功能的应用程序,程序文件本身的代码内容必然会有所不同。本发明是在程序文件中随机选取不定数量的代码区块提取到加密装置中,或由用户指定的频度提取代码区块,每个要被提取的代码块的起始与结束位置都有着不确定因素,因而移入加密装置中的内容可以有着非常复杂的组合,这样就使得每次加密所移入加密装置中的数据均会有所不同,从而完全回避了现有的外壳加密技术存在的破解过程的相似性的问题。对于不同的应用程序,及同一个程序文件不同时间进行加密时,所分解出的代码区块内容都会有所变化,那么理论上对于本发明所处理过的程序实施破解的过程都会有着一定的差异性。另外本发明还可设定对使用频度较高或指定的重要的函数起始位置进行代码提取保护,这样在保证不同的程序文件间的保护不但存在差异性,而且保护更有针对性。因而结合本发明所保护的软件不会存在现有外壳加密技术的破解过程的相似性。
在本发明中,加密装置202可采用基于智能卡体系的加密锁技术,智能卡具有很强的抗逻辑及物理攻击的特性,一直被广范地应用于金融领域。而现今高端的加密锁产品早已结合了智能卡,这类产品已进入实用的商业领域多年,基于智能卡体系的加密锁技术已在实践中证实运行得非常良好,存储于加密锁中的数据或代码无论是采取什么样的方式进行攻击都是非常因难的,这就为本发明基于智能卡实现的产品在理论上及实践方面都奠定了非常安全的基石。具体采用什么形式的加密装置作为存储代码的实体可根据对版权保护的安全强度的需求来决定,方案的安全强度与具体硬件的安全强度有联系,但本发明的基本思想适用于所有的可用于信息安全存储的与软件版权相关的加密装置。
其具体实现步骤如图3中所示,当开始步骤301后,将被保护的程序文件由步骤302装载后,经过对原程序文件的检测和扫描,通过步骤303显示程序文件的保护代码段长、数据段长在内的信息,用户可通过步骤304对参数进行设定,如代码块选取的方式,提取代码块数量的变化范围、代码块大小的变化范围,位置选取的方式,之后开始执行对代码块的提取过程。由步骤305程序编码分析引擎对程序进行分解,由步骤306代码加密引擎,针对不同的加密装置,将提取的代码块转换成对应的加密格式,通过步骤307将上述代码块存入加密装置中,通过步骤308填补提取点空隙并与加密装置中代码相对应。最后通过步骤309判断对设定代码块的个数是否都已完成,如果都完成则通过步骤310结束。
如图4中所示为程序编码分析引擎的工作流程图,从图4中我们可以看到代码的分解必须根据指令模拟的结果来进行,毕竟加密装置中的硬件资源是远远无法与计算机的资源相比的,选择长度及资源消耗适度的代码块进行分解是非常必要的,所以在真正将代码块转换到加密装置中之前引入一个仿真过程将非常有利于提高整个工具的可靠性及稳定性的。通过步骤401将提取的每个代码块在计算机中进行步骤402模拟执行,在步骤403中判断模拟是否成功,如果成功则执行步骤404分解代码后退出,如果未成功则直接退出,从而保证提取的代码块的有效性。如图7中所示,为指令模拟的工作流程图,在步骤701取指令之后,通过步骤702、703对指令的解码和执行,并由步骤704分析资源消耗,从而选取最适合的代码块进行下一步的加密转换操作。
图5中所示代码加密引擎主要是完成代码块数据与加密锁的交互过程。虽然利用程序编码分析引擎可以直接分解出所要保护的代码块,但这些代码块不可能直接存放在加密锁中就可随意调用。他们原有代码被提取处与锁内存放的代码块必然有一种调用执行的对应关系,如图2中所示本实施例一共提取了5个代码块201,而在加密过程完成之后,在加密装置中也对应存放了5个装置内的代码块201。那么当程序执行到这5个被提取过代码块的任何一个位置的时候,都必须能索引到所转移到装置中的对应代码块,即在位置1处执行时能索引到块1,同理在位置5处执行时能索引到块5。代码加密引擎就是负责建立这种对应关系,并生成相应的用于检索的加密装置内的代码块的数据索引信息,经由步骤501读取出已由步骤404分解的代码块数量,本实施例中N=5,再通过步骤502建立数据索引信息,使程序在运行过程中能够顺利地调用已提取的代码块程序执行命令,再经步骤503将代码块存入所述加密装置中,再通过步骤504判断每个代码块的加密都已执行完毕后退出。
如图6中所示为文件处理模块工作过程,这一过程主要负责通过步骤601将被保护的功能代码绑缚到所要保护的程序文件上。本发明的文件处理模块为了配合实现代码加密引擎的将程序代码转移到加密装置中去的这项功能,它要在代码分解过程之后,将原来程序文件的剩余部分的代码之间的提取过代码块之后的空洞由步骤602进行适当的填充,插入转向加密装置功能访问的附加代码调用序列。而在运行期间这些所插入的代码要保证进入加密装置调用前保护当前程序运行的现场。当执行过程从对加密装置功能调用返回后还要恢复现场,并通过步骤603将加密装置内返回的信息拼装成相适应的结构压入当前的程序执行栈中,从而使得与被移走的代码相邻的代码感觉不到原有的这段代码被移走。
所述代码填充可采用多种方式,其中所示的机器码为并非与特定平台相关的伪代码,旨在说明代码填充原理及流程,不是本发明的具体实现效果。如下文所提到的CALL key代表对加密装置的功能调用,其上相邻的PUSH指令代表了调用加密装置的功能所需的参数信息,实际的实现要远比图示的情况复杂得多,这里不过于详细地分析所有情况下的具体的实现细节。
实例a为一个将要被提取的软件代码片段,在没有进行提取代码操作时代码的执行应该依次从L1、L2、...、L8。
…L1PUSH AXL2PUSH BXL3MOV BX,CXL4ADD AX,BXL5XOR AX,DXL6ADD CX,AXL7PUSH BXL8PUSH AX…实例b为一个已被提取产生空洞的代码片段。
…L1PUSH AXL2PUSH BX------------L7PUSH BXL8PUSH AX…实例c示意了一个直接在代码空洞处加入对加密装置功能调用,并将其余空隙L5、L6处用NOP指令补齐处理情况,补齐后程序运行到L3时将开始执行与调用加密装置功能的相关操作,返回到L5、L6时,所执行的NOP指令不会破环当前执行的上下情况保证程序顺次执行到L7、L8处。
…L1PUSH AXL2PUSH BXL3PUSH nL4CALL keyL5NOPL6NOPL7PUSH BXL8PUSH AX…实例d示意了一个直接在空洞处加入对加密装置功能调用,并加入了一定量的随机字节(DB Rand),在L5处直接跳转到了L7绕过所插入的随机字节,仍使得在添补了对加密装置的功能调用代码后的执行过程与提取及插入代码之前的执行效果完全一致。
…L1PUSH AXL2PUSH BXL3PUSH n
L4CALL keyL5JMP L7L6DB RandL7PUSH BXL8PUSH AX…实例e示意了结合上下文指令,加入混淆逻辑的指令(MULAX,BX、ADD DX,AX),并随后加入对加密装置功能调用代码,虽然增加了一些所要替换的代码块中原本不存在的指令,但执行的结果仍与被提取前保持一致,此时被提取处的代码的原本面貌更难于被解密者猜出。
…L1PUSH AXL2PUSH BXL3MUL AX,BXL4ADD DX,AXL5DB RandL6CALL keyL7PUSH BXL8PUSH AX…实例f示意了用两个对加密装置功能调用(Call key)来替代原来的若干条指令的处理方法。
…L1PUSH AXL2PUSH BXL3PUSH n1L4CALL keyL5PUSH n2L6CALL keyL7PUSH BXL8PUSH AX…本发明从根本上解决了传统外壳加密当中后期所绑定的壳代码与应用的代码结合得不够紧密的问题,使得外壳的破解难度得到了提升。同时解决了外壳加密的破解方法在理论上具有一定通用性的问题,这就使得外壳加密的安全强度能基本上接近源代码编写方式实现的加密保护。重要的是本发明是在提升加密的安全强度的同时并没有增加应用软件开发商的负担,只需做的就是简单地输入所需的相应参数,便将软件版权保护功能结合到他们将要发行的软件产品当中。
以上对本发明所提供的从程序文件中提取部分代码至加密装置中的软件版权保护方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述。以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.一种从程序文件中提取部分代码至加密装置中的软件版权保护方法,其特征在于将编译后的程序文件中的代码分解为两部分,其中分解出的代码块在加密装置中运行,其余部分代码在计算机中运行。
2.根据权力要求1所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,其步骤如下1)程序编码分析引擎用于从所要保护的程序文件中分解出多个代码区块;2)代码加密引擎用于将分解出的代码区块转换到加密装置中;3)文件处理用于将访问所述代码区块所需的与加密装置通讯的功能绑缚到所要保护的程序文件上。
3.根据权利要求2所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,其特征在于所述步骤1)中还包括一个模拟执行过程,用于在将分解出的代码块移至加密装置之前,在计算机中进行模拟仿真运行,如果模拟过程失败,则重新执行步骤1),如模拟过程成功,则执行步骤2)。
4.根据权利要求2或3所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,其特征在于所述模拟执行过程中还包括一个资源消耗的分析过程,用于判断代码块资源消耗是否合理。
5.根据权利要求2或3所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,其特征在于所述步骤3)中的文件处理引擎,将提取的代码块与被保护的文件之间通过调用建立对应关系,插入转向加密装置功能访问的附加代码调用序列。
6.根据权利要求2或3所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,其特征在于所述步骤3)中文件处理过程,还包括将原程序文件的剩余部分的代码之间的提取过代码块之后的空洞进行填充过程。
7.根据权利要求1或2或3所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,所述代码块的提取由以下几种方式选取(a)随机方式选取,软件开发商可设定提取的代码块数量变化的范围,及每个代码块大小的变化范围用于控制代码块选取操作的随机性。(b)自动选取,提供调用频度分析结果,由软件开发商决定选择调用频度合适的代码块。(c)软件开发商指定代码块开始及结束的位置。
8.根据权利要求1或2或3所述的从程序文件中提取部分代码至加密装置中的软件版权保护方法,其特征在于所述加密装置为用于软件版权保护的具有安全存储功能的加密装置,包括加密锁、加密卡、加密盒。
全文摘要
本发明涉及一种软件版权保护方法,特别是一种从程序文件中提取部分代码至加密装置中的软件版权保护方法。本发明通过将编译后的程序文件中的代码分解,其中分解出的部分代码块在加密装置中运行,其余部分代码在计算机中运行,使软件开发商在软件产品的开发过程中不必投入过多的精力编制软件保护功能模块,在提升加密的安全强度的同时并没有增加应用软件开发商的负担,只需将所要保护的软件产品的程序文件部分代码分解成块,再存入加密装置中,从而解决了传统外壳加密中后期所绑定的壳代码与应用代码结合不够紧密的问题,和外壳加密的破解方法在理论上具有一定通用性的问题,使得外壳加密的安全强度能基本上接近源代码编写方式实现的加密保护。
文档编号G06F1/00GK1749915SQ200510109229
公开日2006年3月22日 申请日期2005年10月19日 优先权日2005年10月19日
发明者陆舟, 于华章 申请人:北京飞天诚信科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1