首页> 中国专利> 嵌入在shell代码中的软件许可

嵌入在shell代码中的软件许可

摘要

本发明提供用于保护和验证初始应用程序许可的软件应用程序保护方法和系统。所述系统读取初始应用程序可执行文件,并且生成包涵初始应用程序的shelled应用程序和包括许可信息的shell。Shelled应用程序实现许可APIs,并且在初始应用程序和shell之间的shelled应用程序内建立安全通信。用于初始应用程序的许可仅由shelled应用程序验证。

著录项

  • 公开/公告号CN102576391A

    专利类型发明专利

  • 公开/公告日2012-07-11

    原文格式PDF

  • 申请/专利权人 SAFENET公司;

    申请/专利号CN200980161892.0

  • 发明设计人 程彼得;

    申请日2009-10-12

  • 分类号

  • 代理机构北京驰纳智财知识产权代理事务所(普通合伙);

  • 代理人谢亮

  • 地址 美国马里兰州贝尔坎普市千禧路4690

  • 入库时间 2023-12-18 06:04:22

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-12-08

    未缴年费专利权终止 IPC(主分类):G06F21/12 授权公告日:20150304 终止日期:20161012 申请日:20091012

    专利权的终止

  • 2015-03-04

    授权

    授权

  • 2012-11-14

    实质审查的生效 IPC(主分类):G06F21/00 申请日:20091012

    实质审查的生效

  • 2012-07-11

    公开

    公开

说明书

技术领域

本发明涉及保护从未经过授权的复制和/或执行软件的系统和方法,尤其是指,涉及一种系统和方法,通过包含嵌入的许可信息和/或通过安全通道和受保护的应用程序进行通信的shell代码来保护软件。

背景技术

对于软件供应商而言,软件盗版是一个持续存在的问题。许多阻止软件盗版的技术已经被开发,并且结合这些技术的产品被软件供应商使用以确保未授权的复制和/或使用他们的软件应用程序。

一种软件应用保护技术使用链接模块,所述链接模块需要开发者修改原始的应用程序代码来调用特定的功能,例如,用于许可条件的检查功能。另一种保护技术被称为Shelling。Shelling通常不需要改变应用程序代码。伴随着Shelling技术,shell产生进程读取原始的应用程序可执行文件并且产生修改的新的可执行文件作为所谓的被加外壳(Shelled)应用程序,所述Shelled应用程序包含封装原始应用程序的保护代码的”外层”。进一步地,当使用Shelling时,一个或更多的应用程序部分,例如可执行的代码、数据、输入表、资源等等,当生成shell代码时能够通过加密和/或压缩被保护,并且当被保护的应用程序运行时需要shell使得被保护的代码部分可用。

shell通常执行一个功能以确认用于应用程序的有效许可存在。例如,传统的基于shell的应用程序保护的解决方案通常将带有存储许可的shell代码的被保护的应用程序进行包装或从被保护的应用程序中分离出存储位置中的关键信息。许可信息可以被存储在注册表、数据库、文件、隐藏的磁盘扇区等等。提供一个或更多的应用程序编程接口(APIs)以访问许可信息,并且shell代码能够调用应用程序编程接口(APIs)以验证被保护的应用程序是否被正确地许可。

在Shelling中固有的一个漏洞是仅由保护的外层提供软件应用程序保护。因此,破解者可能能够通过破解唯一的保护外层以获得访问被保护的应用程序。当启动Shelled应用程序时,shell代码在原始的应用程序代码之前执行,并且shell代码执行通常在固定的可识别的模式中执行。破解者能够按照代码执行(例如,通过运行在调试器下的shelled程序),并且一旦代码执行序列被了解,破解者能够修改代码(例如,通过给shelled应用程序可执行文件打补丁)以绕过和/或禁用许可检查。

链接模块和Shelling也可以一起使用。例如,在一种情况中,shell代码能够被附加到被加密和/或被压缩的应用程序部分。当shelled应用程序第一次执行时,shell最初获得控制并且能够执行与安全相关的功能,例如检查应用程序的完整性、检查调试器的存在、解密和/或解压缩应用程序部分,并且在将控制传递给应用程序之前初始化应用程序进程,例如输入功能表和再定位表。原始的应用程序代码也能够被修改用于重定向一些系统应用程序编程接口(APIs)到shell代码中。然后,应用程序能够继续在控制被转移到应用程序之后与shell代码进行交互。此外,自我修改的代码功能能够根据shell被提供,例如,在运行时加密某些应用程序代码片段,并且shell代码能够在所述代码片段被执行之前解密那些代码片段,并且在它们运行后被再次加密。

然而,在使用Shelling的解决方案中,应用程序代码和Shelled应用程序的shell代码驻留在具有可识别地不同地址的存储器的不同部分。现有技术中,Shelling解决方案没有掩盖应用程序代码地址和shell代码地址之间的不同。因此,破解者可以能够解开受保护的应用程序代码并且确定哪些是shell部分的代码,及哪些是shell保护的应用程序的部分。如果是的话,破解者能够继续删除或修改shell代码和应用程序代码之间的链接。例如,在程序执行过程中,加密和解密代码能够通过使用无操作(NOP)指令被禁用,以取代解密和加密指令。

图1显示了传统的实现自我修改代码功能的示例。如上所示,打包工具使用两个宏来确定被保护的代码,SHELL_CRYPT_BEGIN和SHELL_CRYPT_END。在编译和打包之后,图2A和图2B显示了反汇编代码。

在应用程序被编译之后,生成保护shell代码并且生成Shelled应用程序可执行文件。然后,Shelled 应用程序可执行文件能够被破解者使用调试工具来检查,例如OllyDbg,例如,拆卸Shelled应用程序可执行文件,或二进制代码。OllyDbg是强调二进制代码分析的调试器。它能够跟踪注册表、确认程序、API调用、开关、表、常量和字符串,并且从目标文件和库中定位例程。这类的工具能够被用于逆向工程和破解程序。

图2A显示出这类反汇编代码的示例性片段。在每一行的开头显示程序地址,并且都具有格式0040XXXX。在地址004013A2的代码调用在地址004A6B81(代码的顶端行)处的代码来解密代码的后续行。在执行地址004013A2的代码之后,在图2B中显示被更改的代码。明显地,所谓地址004A6B81和004AADBB(在图2A和图2B中在第004013A2和004013BD行的调用语句中强调)被放置在和程序代码地址不同的地址部分,所述程序代码地址在,即地址0040XXXX处的每一行的代码的开头指示。破解者可能推测0040XXXX形式的地址位置属于应用程序代码地址空间,然而0040XXXX形式的地址位置属于shell代码地址空间。

在图3中示例了不同代码部分,其中不同块表示了位于不同地址空间的代码部分。如图所示,不同代码部分的地址空间具有可识别的界限。示例性地,在程序执行的过程中,shell代码能够根据需要解密和加密应用程序代码的部分,从而提高应用程序代码的安全性。即便如此,破解者可能能够分析程序,识别解密和加密shell进程的存在,并且移除在shell代码和应用程序代码之间的链接,例如,通过使用无操作(NOP)指令来取代加密指令。类似地,破解者可能能够识别检查进程的许可的存在,并且删除Shelled应用程序代码和存储在Shelled应用程序的外部的许可信息之间的链接。

因此,需要一种应用程序保护技术去抑制破解,使得对于破解者来说更困难地解除许可检查和/或修改在应用程序代码和shell代码之间的通信。

发明内容

本发明披露了在shell中嵌入应用程序软件许可信息,以及确保shell和Shelled应用程序中的应用程序代码之间的通信。在shell产生过程中,许可能够被嵌入在shell代码中。在shell中能够提供一组应用程序编程接口(APIs)并且应用程序能够被修改便于和应用程序编程接口(APIs)交互以访问许可信息。应用程序代码和shell代码能够使用安全通道以加强他们之间的通信链接的安全。

可以理解的是,无论是上述的一般性描述还是下面的详细的描述都是示例性的和解释性的,旨在进一步地提供本发明的保护范围。

附图说明

附图被用于提供对本发明进一步地理解,并且示出了本发明的优选实施例和说明的特征。所述附图和具体实施方式一起用于解释本发明的原理,所附的权利要求书定义了本发明的保护范围。

在图中。

图1显示用于初始化生成保护的shell的代码。

图2A和图2B显示shelled应用程序代码的修改以作为shelled应用程序可执行文件。

图3显示在shelled应用程序的代码段之间的边界,以及在shelled应用程序中执行加密和解密操作。

图4为显示出用于实现本发明所披露的系统和方法的示例性硬件环境的框图。

图5为显示出用于保护软件应用程序的示例性shelling过程的流程图。

图6为显示出如何执行受图5中示出的shelling过程保护的软件应用程序的流程图。

图7显示在shelled应用程序的shell代码和应用程序代码之间建立安全通道。

图8示出了示例性的许可限制元素。

图9示出了示例性的限制类型和描述。

图10示出了示例性的shell许可应用程序编程接口(API)功能。

具体实施方式

图4显示了一个能够被用于实现本发明所披露的系统和方法的示例性的计算机系统400。计算机402包括一个处理器404和一个存储器,例如随机存取存储器(RAM)406。可操作地,计算机402连接到一个显示器422,所述显示器422显示例如windows在图形用户界面(GUI)418B上显示给用户的图像。计算机402可被连接到其它设备,例如键盘414、鼠标416、打印机428等等。本领域技术人员将认识到上述组件、外设和其它设备的任意组合,可与计算机402一起被使用。

一般来说,计算机402在存储于存储器406中的操作系统408的控制下操作,并且和用户连接以接收输入和指令,以及通过图形用户界面(GUI)模块418A显示结果。虽然GUI模块418A被描述为一个独立的模块,但是执行GUI功能的指令能够被驻留或分布在操作系统408、计算机程序410中或者在具有特殊用途的存储器和处理器上被实施。计算机402也实现了编译器412,所述编译器412允许初始地用编程语言,例如C、C++、Visual Basic、Delphi、或其它编程语言描述的应用程序410被编译(翻译)为处理器404可读的代码。在完成后,编译过的应用程序410使用由编译器412生成的关系和逻辑访问和操作存储在计算机402的存储器406中的数据。可选择地,计算机402包括一个通讯设备440,例如调制解调器、网卡、或其它用于与外部设备430如其它计算机,存储设备等通讯的设备。

在一个实施例中,指令执行操作系统408,计算机程序410,和编译器412切实地体现在计算机可读的存储介质中,例如,数据存储设备420,所述数据存储设备能够包括一个或多个固定的或可移除的数据存储设备,例如一个硬盘驱动器、一个光盘驱动器、闪存驱动器、磁带驱动器等等。进一步地,操作系统408和计算机程序410包括一些指令,当由计算机402读取和执行这些指令时,导致计算机402去执行必要的步骤以实现和/或使用本发明所披露的系统和方法。计算机程序410和/或操作系统408指令可能也被切实地体现在存储器406、数据存储设备420、和/或外部设备430,因此,根据本发明所披露的系统和方法产生计算机程序产品或制造的方案。例如,本文所使用的术语“制造的方案”、“程序存储设备”和“计算机程序产品”旨在包括来自任何计算机可读设备或者存储介质计算机程序访问。

图5示出了示例性的计算机实现的软件应用程序保护系统和shelling过程。启动代码发生器505生成启动代码504。未受保护的初始应用程序可执行代码500、应用程序许可信息502和启动代码504被提供给shelled应用程序发生器506。Shelled 应用程序发生器506由此生成新的受保护的可执行文件作为shelled 应用程序508。启动代码能够被合并到shell和嵌入在shell中的许可信息中。带有嵌入的许可信息和应用程序可执行文件的shell被合并,以便形成shelled应用程序508,所述shelled应用程序508即包括shell代码510又包括应用程序代码512。在一个实施例中,应用程序可执行文件在shelling过程中能够被加密引擎507加密,因此,shelled应用程序包括一个作为应用程序代码512的应用程序可执行文件的加密版本。许可信息也能够被加密引擎507加密,因此shelled应用程序包涵嵌入在shell代码510内的许可信息的加密版本。

图6是shelled应用程序508的执行流程图。在模块602中,启动shelled应用程序508的执行,并且在模块604中执行shell代码510。在shell510中的启动代码初始化一个或多个操作以便确定应用程序可执行文件的执行是否被授权。在一个实施例中,授权过程包括允许应用程序去检查一个或多个有效的许可条件606。在模块608和616中显示,如果受保护的可执行文件的执行并没有被授权(例如,许可信息是无法访问的和/或shell提供一个关于许可信息的请求的错误响应),shelled应用程序508的执行停止。在模块614中显示,如果许可信息被验证通过,那么执行应用程序代码512。在模块610中显示,如果需要的话,也能够执行其它操作,例如重定位数据链接库(DLLs)、设立所需的导入表。在模块612中显示,如果加密产生了可执行应用程序代码,和/或解密应用程序代码512。

图7显示了shelled应用程序700,所述shelled应用程序700中的应用程序代码702访问嵌入在shell代码706中的许可信息704。如前所述,在打包的过程中,也就是在shelled应用程序700生成的过程中,许可信息704被嵌入在shell代码706中。Shell许可库708能够被提供给shell706,包括一组由应用程序702使用以访问许可信息704的API组。在执行shelling过程之前,软件安全模块,被简称为调用安全检查,能够被插入到应用程序702中以便和shell706进行通信,例如生成与许可信息相关的请求。在应用程序内的软件安全模块组构成了安全客户端库710。当运行shelled应用程序700时,其启动能处理来自应用程序的与许可相关的请求的通讯服务线程712。应用程序702使用安全客户端库710以生成对请求许可信息704的API的调用。通讯服务线程712访问在shell许可库708内的shell许可API,如需要满足请求的话,其访问和返回许可信息704。

在应用程序702和shell706之间发送与许可相关的请求、响应、和其他消息。安全通道714可以由在应用程序702和shell706之间的通信服务线程进行设置。例如,安全客户端的库710可能包括一个或更多用于安全通信的软件安全模块。所述shelled应用程序700可以包括一个伪随机数生成器,以及所述安全客户端的库710和/或所述通信服务线程712可以由此生成随机的一次性会话密钥用于通过安全通道714在应用程序和shell之间通信的安全消息。所述消息可以使用任何合适的进程间通信(IPC)方法,例如命名管道、TCP/IP协议、邮箱等等。

在一个示范性实施例中,许可信息能够包括多种类型的一个或更多的特征,每个特征包括一个或更多的元素。示例性地,特征类型能够包括数据、椭圆曲线加密(ECC)、高级加密标准(AES)以及限制特征。也可以使用附加的或其它的特征类型。

关于数据特征类型,应用程序开发者能够做到,例如,由应用程序为用户存储数据到数据特征元素,并且应用程序能够调用API以便读取存储的数据,例如下面描述的示例性SCL_FeatureRead API和其它的示例性的API。ECC特征能够包括ECC私钥,并且,例如,能够使用椭圆曲线签名方案,例如ECCSH,被用于签署消息内容。应用程序能够调用API,例如SCL_FeatureSign,以签名消息数据,并且然后调用另一个API,例如SCL_ FeatureVerify,以验证应用程序内的签名结果。类似地,AES特征能够包括AES算法的密钥,并且应用程序能够调用例如SCL_FeatureQuery的API以获得响应,所述响应和存储在应用程序内的以前的响应相比较。应用程序也能够调用API,例如SCL_FeatureEncrypt 和 SCL_FeatureDecrypt,用于分别加密和/或解密应用程序数据。最后,限制特征提供许可限制,例如必须为应用程序的运行或使用某些应用程序功能之前满足的限制。应用程序代码能够调用shell许可API以访问嵌入到shell代码内的许可信息。

在一个示范性实施例中,这类许可信息可能被嵌入到在shell代码和应用程序代码之间通信的消息内以作为类型-长度-值(TLV)元素,最多达256字节的长度,在数据通信协议内被使用。每个这类元素包括仅一个许可信息块,或“限制特征”。TLV元素包括至少三种字段种类:类型、长度和数值。类型字段是数字代码,表示元素所代表的许可信息的种类。长度字段表示元素的大小或者字节内的数值字段。数值字段是可变大小的字段,其包括许可限制特征信息。

在每个许可限制元素中也存在其它字段。图8示出了一个示范性许可限制元素的字段。除了上述的类型、长度和价值字段,每个元素包括一个特征识别字段和一个检查标记字段。特征识别字段识别元素所代表的信息源。检查标记字段被用来检查数据的完整性。嵌入在shell代码中的许可信息可能被加密存储,并当被访问时解密。

图9列出了示范性的特征类型和识别、以及相关的功能描述,能够被作为许可限制使用。如图所示,显示了三种类型的限制:锁限制、环境限制和试用限制。如果限制未满足的话,每个限制能够被用来阻止应用程序启动或执行某些功能。锁限制涉及应用程序或其用户正在运行的计算机,例如用户名称,或运行shelled应用程序的计算机中的网卡的网卡介质访问控制(MAC)地址,或处理器ID,或磁盘序列号等等。环境限制涉及shelled应用程序正被运行的操作环境,例如是否检测调试器的存在。试用限制涉及在试验试用期shelled应用程序的限制使用。图9中列出的限制是为了示范性的目的,也能够使用其它限制类型、识别以及描述。

如前面图7所述,shell许可库708包括一组由应用程序702使用以用于访问许可信息704的API组。图10A和10B提供示例性的示范例API的名称和格式,由应用程序调用示范性API以便访问嵌入在shell代码中的许可信息。在API的名称说明中,“SCL”是安全客户端库的一个简单缩写。

SCL_OpenLicense—这个API被用于创建在shelled应用程序内的shell代码和应用程序代码之间的安全通道,并且得到许可句柄。如果其成功返回,后续通讯包可以通过安全通道被传达。如果许可具有不能满足的限制特征,一个错误信息将被返还。

SCL_FeatureQuery—这个API被用于产生基于高级加密标准(AES)特征识别和查询的数据的加密的响应。

SCL_FeatureRead—这个API被用于通过数据特征读取存储的数据。

SCL_FeatureEncrypt—这个API被用于加密基于高级加密标准(AES)特征识别的提供的明文数据。

SCL_FeatureDecrypt—这个API被用于解密基于高级加密标准(AES)特征识别的提供的密码数据。

SCL_FeatureVerify—这个API被用于验证使用基于ECC特征识别的ECC特征公钥的数字签名内容。

SCL_FeatureSign—这个API被用于签署使用基于ECC特征识别的算法的内容。

SCL_CloseLicense—这个API被用于关闭安全通道和施放许可句柄。

本发明所披露的系统和方法的一个优点在于,为了测试的目的,在打包过程之前能够提供虚拟的shell许可。虚拟shell许可是一种能够模拟所有shell许可功能的服务。在调试和开发的过程中,库能够访问这个服务器,并且在添加shell之后,在应用程序中的库能够访问shell代码中的许可。在一个示范性实施例中,本发明所披露的系统和方法能够被用于使得每个shelled应用程序实例是独一无二的,例如,通过各种压缩或者加密方法和/或组合。使用一个或多个与供应商相关的要素,例如供应商ID或应用程序名称,也能够加密许可信息。许可信息也能够被一个或多个非对称算法签名。

除了上述所述的示范性实施例,各种其它的修改和变化也未超过本发明所涵盖的范围。因此,需要指出的是,本发明包括所有类似的修改和变化涵盖在本发明所附的权利要求和他们等同范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号