用于为软件加水印的系统和方法与流程

文档序号:24305660发布日期:2021-03-17 00:58阅读:209来源:国知局
用于为软件加水印的系统和方法与流程

本公开涉及由计算机实现的用于为软件加水印的系统、方法和存储介质。



背景技术:

计算机软件被用来控制无数的过程,例如在商业和娱乐领域中。认识到以它的所有各种形式的计算机软件市场是非常大的,并且每天都在不断增长。在工业化国家,几乎没有企业在其日常运营中不直接或间接依赖于计算机和软件。强大的通信网络、诸如因特网的扩展使得交换、复制和分发软件变得容易。

软件程序通常用编程语言编写,并以某种方式进行处理,例如被编译以调谐成可执行实体或被解释。例如,软件程序可以存储为包含某些高级编程语言中源代码的文本文件,或者包含汇编代码的文本文件,所述文件需要由链接器修改并由加载器加载以便成为可执行文件。因此,如本文中使用的术语“软件”指代可执行代码和/或某种可执行的或可调用的行为提供实体,其最终由某种编程语言中的代码转换成某种可执行的或可解释的形式或由这样的代码调用的其他数据,诸如静态或共享库而导致。

数字水印是一种通过其将标记秘密嵌入到诸如音频、视频或图像数据之类的数字内容中的过程。标记通常用于标识数字内容的所有权或跟踪数字内容的分发。数字水印通常仅在特定条件下是可感知的,即,在使用水印检测算法之后。期望水印是“鲁棒的”,即,它们不能容易地被移除并且被攻击者移除。数字水印在检测数字内容(诸如视频或音频内容)的未授权分发或其他盗版方面是有用的。例如,水印可以特定于设备和/或分发渠道。当发现未授权的内容时,可以读取水印以查明负责未授权分发的分发设备或分发渠道。

为数字内容加水印的概念和益处可以延伸到软件。标记可以类似地插入到软件中,并且当发现未授权的软件时,人们可以类似地学习负责的分发设备或渠道。然而,为可执行软件加水印具有巨大的挑战。虽然图像的微小失真可以是可接受的,但对软件的任何改变都不得影响软件的功能。已知的软件跟踪是通过记录哈希代码或代码签名,或者可能地通过将可标识的字符串或其他垃圾数据注入可执行代码来实现的。例如,“apracticalmethodforwatermarkingjavaprograms”(第24届计算机软件与应用会议(compsac2000),台北台湾2000年10月)教导了可以将版权声明插入到java类文件中。其他技术、诸如代码相似性检测和剽窃检测器也是已知的。然而,目前用于跟踪软件的技术不够稳健,不足以作为有效的水印。例如,当前技术中的水印容易被移除,不经受诸如编译过程的进一步处理,和/或在执行时可能干扰计算机程序代码的功能。



技术实现要素:

本公开的一个方面涉及一种由计算机实现配置的用于使能软件跟踪的系统。该系统可以包括由机器可读指令配置的一个或多个硬件处理器。(一个或多个)处理器可以被配置为接收对应于计算机程序的标记输入代码。(一个或多个)处理器可以被配置为标识标记输入代码的位置,其可以以保留计算机程序功能的方式被修改。(一个或多个)处理器可以被配置为将至少一个代码变换应用于标记输入代码。所述至少一个代码变换中的每一个都可以具有特定的固有常数。(一个或多个)处理器可以被配置为从特定的固有常数将导出常数导出,并将包括导出常数的变换注入到标记输入代码中。(一个或多个)处理器可以被配置为从特定的固有常数将导出常数导出,将以上步骤的结果作为标记代码保存在计算机可读介质上。(一个或多个)处理器可以被配置为将包括计算机可读介质上的导出常数列表的元数据保存在与标记代码分离的文件中。元数据可以用于确定其他计算机程序代码是否是从标记代码导出的。

本公开的另一方面涉及一种由计算机实现的用于使能软件跟踪的方法。该方法可以包括接收对应于计算机程序的标记输入代码。该方法可以包括标识标记输入代码的位置,其可以以保留计算机程序功能的方式被修改。该方法可以包括将至少一个代码变换应用于标记输入代码。所述至少一个代码变换中的每一个都可以具有特定的固有常数。该方法可以包括从特定固有常数将导出常数导出,并将包括导出常数的变换注入到标记输入代码中。该方法可以包括从特定固有常数将导出常数导出,将以上步骤的结果作为标记代码保存在计算机可读介质上。该方法可以包括将包括计算机可读介质上的导出常数列表的元数据保存在与标记代码分离的文件中。元数据可以用于确定其他计算机程序代码是否是从标记代码导出的。

本公开的又一方面涉及其上体现有指令的非瞬态计算机可读存储介质,所述指令可由一个或多个处理器执行,以执行由计算机实现的用于使能软件跟踪的方法。该方法可以包括接收对应于计算机程序的标记输入代码。该方法可以包括标识标记输入代码的位置,其可以以保留计算机程序功能的方式被修改。该方法可以包括将至少一个代码变换应用于标记输入代码。所述至少一个代码变换中的每一个都可以具有特定的固有常数。该方法可以包括从特定的固有常数将导出常数导出,将包括导出常数的变换注入到标记输入代码中。该方法可以包括从特定固有常数将导出常数导出,将以上步骤的结果作为标记代码保存在计算机可读介质上。该方法可以包括将包括计算机可读介质上的导出常数列表的元数据保存在与标记代码分离的文件中。元数据可以用于确定其他计算机程序代码是否是从标记代码导出的。

本公开的又一方面涉及一种由计算机实现的用于检测软件中的水印的系统,该系统包括:一个或多个硬件处理器,其由机器可读指令配置为:接收对应于计算机程序的至少一部分的标记代码,其中该标记代码是通过以下各项来创建的:标识标记输入代码的位置,其可以以保留计算机程序功能的方式被修改,将至少一个代码变换应用于标记输入代码,所述至少一个代码变换中的每一个具有特定的固有常数,从特定的固有常数将导出常数导出;以及将包括导出常数的变换作为水印数据注入到标记输入代码中。扫描标记代码以寻找与水印数据相关联的特定模式。

通过参考附图考虑以下描述和所附权利要求,本技术的这些和其他特征和特性,以及相关结构元件的操作方法和功能以及部件的组合和制造的经济性将变得更明显,所有这些都形成了本说明书的一部分,其中相同的参考数字指定各图中的对应部分。然而,应当清楚地理解,附图仅用于说明和描述的目的,并且不意图作为对本发明的限制的定义。如在说明书和权利要求书中所使用的,单数形式的“一”、“一个”和“该”包括复数指代物,除非上下文另有明确指示。

附图说明

图1是根据一个或多个实现方式的由计算机实现的用于使能为软件加水印和软件跟踪的系统的示意表示。

图2是根据一个或多个实现方式的由计算机实现的用于使能为软件加水印的方法的流程图。

图3是根据一个或多个实现方式的示意性数据流图解。

图4是根据一个或多个实现方式的示意性数据流图解。

图5是根据一个或多个实现方式的由计算机实现的检测系统的操作的方法的流程图。

图6是盲检测机制的示意性数据流图解。

图7是非盲检测机制的示意性数据流图解。

图8是代码扫描示例的示意图。

具体实施方式

软件通常提供给一方或以其他方式使软件对一方可用,该方的目标可能与其提供者的目标不一致,甚至完全抵触。例如,一方可能希望消除分布式软件或硬件-软件系统中的程序逻辑,意图防止未经授权的使用或在不具有支付情况下的使用,或者可能希望防止软件中的计费功能记录使用的全范围,以便减少或消除用户对提供者的支付,或者可能希望窃取版权信息进行非法再分发。

公知的,通过使软件代码的组织混淆或使软件代码的组织更混乱并且因此更难以修改来防止对软件的攻击。如本文中使用的术语“混淆”是指在不改变结果所得可执行代码的功能的情况下,向源代码添加元素,以使可执行代码的变量、数据或控制流更难理解。

在相对简单的混淆示例中,变量名可以用随机字符串替换。例如,变量名“securitycode”的每次出现都可以用字符串“1xcd385mxc”替换,使得攻击者更难以标识变量。已知各种机制通过屏蔽软件或者致使防止篡改来保护软件。例如,通过增加软件各部分的相互依赖性,可能致使软件在修改下非常脆弱。此外,软件可能部署致使正常调试器不起作用的机制。此外,软件可以部署完整性验证机制,该完整性验证机制通过周期性地对代码进行校验和检查,并在发生校验和不匹配时发出篡改诊断,或者用原始代码替换修改后的代码(代码修复),来检查当前执行的软件是否处于其提供者意图的形式。此外,一种称为级联的特定种类的数据流网络可以交织在整个代码中,试图大大增加代码内相互依赖性的密度。该保护还可以采取代码站点到软件功能片段的多对多映射的形式。此外,借助于多维空间中的几何变换,可以致使数据寻址相互依赖,并且随着时间推移而变化,从而导致更模糊和脆弱的寻址代码。

用于增强安全性的代码转换软件的示例是公知的。例如,题为“systemandmethodofinterlockingtoprotectsoftware-mediateprogramanddevicebehaviors”的美国专利8,161,463、题为“systemandmethodforobscuringbit-wiseandtwo'scomplementintegercomputationsinsoftware”的美国专利7,966,499以及题为“tamperresistantsoftwareencoding”的美国专利6,594,761全部教导了以增加软件安全性的方式对软件部分进行代码转换的系统和方法。

当程序数学经受代码变换时,这些方法中的每一个导致将元素注入到代码中,所述元素诸如是大量相对不同的常数。结果是导出常数,基本上是原始应用数学中的常数连同代码变换固有常数的数学组合被创建。所公开的实现方式可以利用这些导出常数来进行水印目的。虽然导出常数可以由混淆过程产生,但导出常数也可以是不意图进行混淆的过程的结果。

本文中描述的水印应用于代码,其在本文中称为“标记输入代码”。标记输入代码可以是源代码的形式,或一些所导出的二进制表示,包括但不限于所谓的中间表示,一直到二进制可执行形式。标记输入代码被处理以标识程序代码和数据可以以保留功能的方式被修改的位置,并执行那些修改。修改引起代码中出现新的常数。新的常数与代码纠缠在一起,并且可以在标记代码中形成水印的基础。可以扫描候选代码来进行水印检测。本文中描述的水印很难从标记代码中移除,因为在不改变程序的功能的情况下不可以改变或删除常数。换言之,水印与代码“纠缠”在一起。

图1图示了根据一个或多个实现方式的由计算机实现的用于使能通过水印跟踪软件的系统100。在一些实现方式中,系统100可以包括一个或多个服务器102。(一个或多个)服务器102可以被配置为通过诸如因特网的网络与一个或多个分发平台104通信。用户可以经由(一个或多个)客户端计算平台(未图示)或通过其他用户界面设备来访问系统100。

(一个或多个)服务器102可以由(一个或多个)计算机处理器128执行的机器可读指令106来配置。机器可读指令106可以包括一个或多个指令模块。指令模块可以包括计算机程序模块。指令模块可以包括输入代码接收模块108、位置标识模块110、代码变换应用模块112、常数导出模块114、元数据保存模块116、值约束模块118、处理模块120、元数据更新模块122和/或其他指令模块中的一个或多个。

输入代码接收模块108可以被配置为接收对应于可执行计算机程序的标记输入代码。例如,作为非限制性示例,标记输入代码可以是源代码、llv位代码、二进制代码或诸如javascript的可解释代码之一。标记输入代码可以是以可执行的形式,或者可以在执行之前需要进一步处理。在一些实现方式中,进一步处理可以包括编译、优化、链接和/或解释标记代码。

位置标识模块110可以被配置为标识标记输入代码的位置,其可以以保留对应于标记输入代码的计算机程序的功能的方式被修改。代码变换应用模块112可以被配置为将至少一个代码变换应用于标记输入代码。所述至少一个代码变换中的每一个可以具有特定的固有常数。常数导出模块114可以被配置为从特定的固有常数将导出常数导出。代码变换应用模块112然后将导出常数注入到标记输入代码中。代码变换应用模块112和常数导出模块114彼此关联地工作。常数导出模块确定要注入的导出常数,并且代码变换模块112连同附加的可执行指令一起注入导出常数。导出常数从根本上与变换本身联系在一起,在不破坏变换并因此改变代码的功能的情况下非常难以移除它们。以上步骤的结果可以作为标记代码保存在计算机可读介质上。

导出常数可以是标记输入代码中的常数和固有常数的数学组合。导出常数可以用作水印,并且元数据可以连同检测算法一起使用,以确定其他候选计算机程序代码是否是从标记代码的至少一部分导出的。作为非限制性示例,标识、应用、导出和/或注入的步骤可以是混淆过程的部分,该混淆过程致使计算机程序在不对代码的功能产生不利影响的情况下更难理解。

作为非限制性示例,检测算法可以扫描其他计算机程序代码以用于指定百分比的导出常数的存在,在候选计算机程序代码的一部分内扫描标记代码的对应部分中的常数,扫描候选计算机程序代码以用于被标识为来自跨所有类似大小的组块的相同函数的导出常数,扫描候选计算机程序代码以用于距已经找到的导出常数一定距离内的导出常数,扫描候选计算机程序代码以用于具有特定属性的导出常数,和/或扫描候选计算机程序代码以用于与导出常数最接近的匹配。应用变换可以包括变换控制流,其包括基于将虚拟变量设置为不同的随机值以及导出常数是随机值,引入关于流的开关语句。

应用代码变换可以包括变换枚举值,并且导出常数是替代枚举值。作为非限制性示例,检测算法可以应用于目标代码静态库、共享库和/或可执行文件。标记代码的部分可以是标记代码的小数部分。检测算法可以检测其他计算机程序代码中水印的小部分。注意,在图1中,检测系统124被示为不同于(一个或多个)服务器102,并且通过网络耦合到(一个或多个)服务器102。然而,检测系统124可以是(一个或多个)服务器102的部分。此外,检测系统124不需要通过网络耦合到(一个或多个)服务器102。检测系统124在下面关于图5-8更详细地描述。

在一个实现方式中,位置标识模块110在接收的标记输入代码中寻找数学计算(例如,加法、乘法、xor、比较),并且代码变换应用模块112修改相关联数据和对该数据的操作二者的表示,将原始表示变换成替代形式。作为示例,可以使用以下代码变换过程中的一个或多个来变换操作z=x+y:

-将输入数据x变换为替代形式x'=a*x+b,其中a和b是在有限环2n之上随机选择的常数,其中n是x的位的大小;

-将输入数据y变换为y'=c*y+d;

-将输出数据z变换为z'=e*z+f;

-将加法z=x+y变换为z'=gx'+hy'+j,其中g、h和j是导出常数,被计算为:

g=e*a-1

h=e*c-1

j=f-e*a-1*b-e*c-1*d。

常数a至f可能出现在代码中或可能不出现在代码中,但常数g、h和j将由常数导出模块114添加、即注入到代码中,以在变换的空间中执行操作。这些变换的直接结果将是修改标记输入代码,并向代码中注入许多不同的常数来创建标记代码。此外,这些常数在很大程度上不受约束——在上面的示例中,a、c和e必须是奇数,而b、d和f可以自由选择。对于32位值的运算,对于g和h存在231种可能性,并且对于j存在232种可能性。

本发明的实现方式可以修改其他位置,并且也可以以其他方式产生大的不同常数。例如,控制流展平技术可以用作变换,以基于将虚拟变量设置为不同的随机值来引入关于流的开关语句。特定的值选择可以作为常数嵌入到代码中。此外,还可以注入替代/变换枚举常数。作为此的一个示例,“”通常将给出on=0和off=1的值,但这可以变换为on=0x718234923和off=0xa124。

元数据保存模块116可以被配置为将包括计算机可读介质上的导出常数列表的标记元数据保存在与标记代码分离的文件中。元数据可以保存在电子存储装置126和/或检测系统124的存储器中。元数据可以用于确定其他计算机程序代码是否是从标记代码中导出的,如下面参考图5-8所讨论的。对于每个导出常数,元数据可以进一步包括导出常数的值和与导出常数相关的上下文信息。作为非限制性示例,上下文信息可以包括指示导出常数是出现在函数内还是出现在全局数据中的信息、导出常数出现在其中的编译单元、导出常数与其他导出常数的预期接近度和/或导出常数的可能替代表示。

值约束模块118可以被配置为约束导出常数的值。例如,可以施加最小恒定比率(每y字节代码x个常数)。作为另一个示例,作为在水印中存储附加信息的一种方式,可以对常数施加附加约束。例如,约束条件可以是至少50%的常数可被3整除(与随机的33%相反)。处理模块120可以被配置为进一步处理标记代码以产生二进制可执行文件。进一步处理可以是编译、链接或如上指出的其他过程。

元数据更新模块122可以被配置为在存储元数据之后更新元数据。更新可以包括从导出常数列表移除至少一个导出常数和/或添加与至少一个导出常数相关的上下文信息。如下所述,更新可以被配置为促进水印检测。更新元数据以移除常数的原因可能包括:

在代码的该表示中不能找到常数(例如,通过优化移除的常数);

常数在代码的该表示中出现得太频繁了;和/或

常数不满足标识的约束标准(太小,不可被3整除,等等)。

来自后期新的或改变的上下文信息可以包括:

关于功能位置的更新信息(例如,编译器可以将函数内嵌到其他函数中);

常数出现在目标文件的哪个区段(代码区段、bss区段等);

关于与其他常数接近度的新的或修改的信息;和/或

该常数出现在链接的可执行文件中的哪个区段。

可以在每个阶段创建单独的标记元数据文件,或者可以更新原始标记元数据文件。如果期望对不同的代码表示(例如,github上找到的源代码)执行水印检测,则前者方法可以是有益的。后者有益于降低存储要求。标记元数据可以专门命名。例如,元数据可以被命名为源代码标记元数据、编译后标记元数据或二进制可执行标记元数据。标记代码可以被分类为标记目标文件、标记二进制可执行文件等。如果存在最小恒定比率作为约束,则它可以在任何阶段强制执行,从而引起标记软件的拒绝,并且如果标记代码不满足约束,则重新开始对标记输入代码的水印处理。

(一个或多个)服务器102可以包括电子存储装置126、一个或多个处理器128和/或其他组件。(一个或多个)服务器102可以包括通信线路或端口,以使能与网络和/或其他计算平台的信息交换。图1中(一个或多个)服务器102的图示不意图是限制性的。(一个或多个)服务器102可以包括多个硬件、软件和/或固件组件,它们一起操作来提供在本文中归于(一个或多个)服务器102的功能。例如,(一个或多个)服务器102可以由作为(一个或多个)服务器102一起操作的计算平台的云来实现。

(一个或多个)服务器102、(一个或多个)分发平台104和/或检测系统124可以经由一个或多个电子通信链路可操作地链接。例如,这样的电子通信链路可以至少部分地经由诸如因特网和/或其他网络的网络来建立。将领会,这不意图是限制性的,并且本公开的范围包括其中(一个或多个)服务器102、(一个或多个)分发平台104和/或检测系统124可以经由一些其他通信介质可操作地链接或者根本不被链接的实现方式。

检测系统124可以包括被配置为执行计算机程序模块的一个或多个处理器。作为非限制性示例,检测系统124可以包括一个或多个服务器或其他计算设备。

电子存储装置126可以包括以电子方式存储信息的非暂时性存储介质。电子存储装置126的电子存储介质可以包括一个或两个系统存储装置,其被整体地(即,基本上不可移除)与(一个或多个)服务器102一起被提供,和/或可移除存储装置,该可移除存储装置可经由例如端口(例如,usb端口、火线端口等)或者驱动器(例如,磁盘驱动器等)可移除地连接到(一个或多个)服务器102。电子存储装置126可以包括以下中的一个或多个:光学可读存储介质(例如,光盘等)、磁可读存储介质(例如,磁带、磁性硬盘、软驱等)、基于电荷的存储介质(例如,eeprom、ram等)、固态存储介质(例如,闪存驱动器等)和/或其他电子可读存储介质。电子存储装置126可以包括一个或多个虚拟存储资源(例如,云存储、虚拟专用网和/或其他虚拟存储资源)。电子存储器126可以存储软件算法、由(一个或多个)处理器128确定的信息、从(一个或多个)服务器102接收的信息和/或使得(一个或多个)服务器102能够如本文所述那样起作用的其他信息。

(一个或多个)处理器128可以被配置为在(一个或多个)服务器102中提供信息处理能力。这样,(一个或多个)处理器128可以包括数字处理器、模拟处理器、设计成处理信息的数字电路、设计成处理信息的模拟电路、状态机和/或用于以电子方式处理信息的其他机构中的一个或多个。尽管(一个或多个)处理器128在图1中示出为单个的实体,但这仅是为了说明的目的。在一些实现方式中,(一个或多个)处理器128可以包括多个处理单元。这些处理单元可以物理上位于相同设备内,或者(一个或多个)处理器128可以表示协同操作的多个设备的处理功能。(一个或多个)处理器128可以被配置为执行模块108、110、112、114、116、118、120和/或122和/或其他模块。(一个或多个)处理器128可以被配置为通过软件;硬件;固件;软件、硬件和/或固件的某种组合;和/或用于配置(一个或多个)处理器128上的处理能力的其他机构执行模块108、110、112、114、116、118、120和/或122和/或其他模块。如本文中所使用的,术语“模块”可以指代执行归于该模块的功能的任何组件或组件集。这可以包括在执行处理器可读指令期间的一个或多个物理处理器、处理器可读指令、电路、硬件、存储介质或任何其他组件。

应当领会,尽管模块108、110、112、114、116、118、120和/或122在图1中图示为在单个处理单元内实现,但在其中(一个或多个)处理器128包括多个处理单元的实现方式中,模块108、110、112、114、116、118、120和/或122中的一个或多个可以远离其他模块来实现。下面描述的由不同模块108、110、112、114、116、118、120和/或122提供的功能的描述是为了说明的目的,并且不意图是限制性的,因为模块108、110、112、114、116、118、120和/或122中的任何一个可以提供比所描述的更多或更少的功能。例如,模块108、110、112、114、116、118、120和/或122中的一个或多个可以被消除,并且其部分或全部功能可以由模块108、110、112、114、116、118、120和/或122中的其他模块提供。作为另一个示例,(一个或多个)处理器128可以被配置为执行一个或多个附加模块,所述附加模块可以执行下面归于模块108、110、112、114、116、118、120和/或122之一的一些或全部功能。

图2图示了根据一个或多个实现方式的用于为软件加水印的方法200。下面呈现的方法200的操作意图是说明性的。在一些实现方式中,方法200可以用一个或多个未描述的附加操作来完成,和/或不用所讨论的一个或多个操作来完成。附加地,其中方法200的操作在图2中图示并且在下面描述的次序不意图是限制性的。

在一些实现方式中,方法200可以在一个或多个处理设备(例如,数字处理器、模拟处理器、设计用于处理信息的数字电路、设计用于处理信息的模拟电路、状态机和/或用于以电子方式处理信息的其他机构)中实现。一个或多个处理设备可以包括响应于以电子方式存储在电子存储介质上的指令来执行方法200的一些或所有操作的一个或多个设备。一个或多个处理设备可以包括通过硬件、固件和/或软件配置的一个或多个设备,其被专门设计用于执行方法200的一个或多个操作。

操作202可以包括接收对应于计算机程序的标记输入代码。根据一个或多个实现方式,操作202可以由被机器可读指令配置的一个或多个硬件处理器来执行,所述机器可读指令包括与标记输入代码接收模块108相同或相似的模块。

操作204可以包括标识标记输入代码的位置,其可以以保留计算机程序功能的方式被修改。根据一个或多个实现方式,操作204可以由被机器可读指令配置的一个或多个硬件处理器来执行,所述机器可读指令包括与位置标识模块110相同或相似的模块。

操作206可以包括将至少一个代码变换应用于标记输入代码。所述至少一个代码变换中的每一个都可以具有特定的固有常数。根据一个或多个实现方式,操作206可以由被机器可读指令配置的一个或多个硬件处理器来执行,所述机器可读指令包括与代码变换应用模块112相同或相似的模块。

操作208可以包括从特定固有常数将导出常数导出,将导出常数注入到标记输入代码中。根据一个或多个实现方式,操作208可以由被机器可读指令配置的一个或多个硬件处理器来执行,所述机器可读指令包括与常数导出模块114相同或相似的模块。

操作210可以包括将以上步骤的结果作为标记代码保存在计算机可读介质上。根据一个或多个实现方式,操作210可以由被机器可读指令配置的一个或多个硬件处理器来执行,所述机器可读指令包括与常数导出模块114相同或相似的模块。

操作212可以包括将包括计算机可读介质上的导出常数列表的元数据保存在与标记代码分离的文件中。元数据可以用于确定其他计算机程序代码是否是从标记代码导出的。根据一个或多个实现方式,操作212可以由被机器可读指令配置的一个或多个硬件处理器来执行,所述机器可读指令包括与元数据保存模块116相同或相似的模块。

水印检测可以由检测系统124(图1)完成并且可以在软件上以多种形式完成,诸如源代码、包括但不限于“中间表示”的所导出的二进制表示、目标代码、静态库,一直到二进制可执行形式,包括可执行文件和共享库。被扫描以检测水印的软件被称为“候选软件”。候选软件可以是已经被不恰当地使用或分发的软件,或者被怀疑是从被标记的软件所导出的软件。可能存在单个候选软件段,或者存在很多候选软件段。使用检测算法评估候选软件,并且输出可以是“找到水印”或“没有找到水印”。

检测算法的基本格式可以非常简单——在候选软件中搜索常数。搜索可以逐字节、逐单词或以另一方式进行;可以是顺续的或随机的;可能查看所有候选软件,或者仅查看一个部分;可能感知格式,或不感知格式。

可以向检测系统124提供一段或多段上述的标记元数据,并将在候选软件中寻找特定水印或相关联图案。元数据可以是与候选软件的特定形式相关的特定形式(例如,当查看源代码表示时标记元数据的源代码)。检测系统124执行检测算法,并根据需要单独或与电子存储装置126相组合地访问标记元数据。

图3图示了公开的实现方式的数据流。标记输入代码作为输入被提供给标记系统,诸如(一个或多个)服务器102。不断的插入导致如上所述的标记代码和元数据。标记代码被直接或间接提供给分发平台104。元数据可以被提供给检测系统124,用于以下面描述的方式使用。

图4图示了所公开的实现方式的数据流,其中代码在标记后经受进一步处理。如以上公开的,进一步处理可以是编译、链接或产生可执行代码的其他处理。标记输入代码作为输入被提供给标记系统,诸如(一个或多个)服务器102。不断的插入导致如上所述的标记代码和元数据。标记代码然后经受进一步处理、例如编译和链接,以创建直接或间接提供给分发平台104的可执行文件。例如,以上述方式更新元数据,并且经过滤的元数据被提供给检测系统124,以供以下面描述的方式使用。如以上指出的,过滤可以包括基于在标记后完成的处理来移除常数或元数据的其他操纵。

图5图示了检测系统124在高水平下操作的方法500。在步骤502中,接收候选代码,即,使得对检测系统124可用。同样,候选代码可以是整个应用或者仅是应用的部分,并且可以采取如以上指出的各种形式。在步骤504中,根据检测算法扫描候选代码。下面更详细地讨论检测算法的示例。在步骤506中,基于检测算法,确定水印是否存在。当然,水印的存在是候选代码是标记代码的拷贝或从标记代码导出的证据。

“盲”检测算法是一种基于特定规则扫描候选软件的算法,无需直接访问标记元数据以用于比较。换言之,它不是将候选软件与任何其他软件进行比较,它简单地是在寻找预定的模式。向非盲检测器提供一段或多段标记元数据,并将基于元数据在候选软件中寻找特定水印。任何一种检测机制都可以与本发明结合使用。在非盲检测中,可以使用与软件采取的特定形式相关的特定形式的元数据(例如,当查看源代码表示时,源代码标记元数据)。替代地,可以使用通用元数据。在非盲检测中,输出可以细化为“未找到水印”或“找到水印xyz”,其命名被匹配的特定标记或标记软件段。

图6图示了盲检测算法的数据流。在图6中,作为至检测系统124的输入,候选软件根据寻找指定的模式的一个或多个检测算法经受扫描。输出是检测结果。

图7图示了非盲检测算法的数据流。在图7中,候选软件作为至检测系统124的输入,根据一个或多个检测算法经受扫描。检测算法可以访问上述的标记元数据,以寻找由元数据指示的指定的常数和/或模式。输出是检测结果。注意,在图7中,元数据被示出为存储在检测系统124内。然而,元数据可以存储在别处并由检测系统124访问。

可以使用各种检测算法,并且算法可以范围从非常简单到更复杂。检测算法的非限制性示例包括:

从标记元数据扫描一定百分比的常数的存在;

在候选软件的一部分内扫描在标记软件的对应部分中的常数;

扫描被标识为来自跨候选软件的所有相似大小的组块的相同函数的常数;

扫描在距已经找到的常数一定距离内的常数,扫描具有特定属性(例如,可被3整除)的常数;和

扫描与常数的最接近匹配(例如,常数±1,-常数),以检测篡改水印的基本手段。

在一个实现方式中,检测系统124包括可以插入各种检测算法的框架,例如,编程的和/或选择性执行的。如果更简单的检测算法不产生确定性的结果,则运行更高级(以及可能更慢)的算法来添加确定性。算法可以被设置为实现所期望的假阳性(不正确地发现水印)和假阴性(水印遗漏)率,并且检测算法可以被组合地执行,直到实现所期望的率。下面阐述了调谐检测系统124以实现所期望结果的一些非限制性示例。

在一个场景中,软件创作者将有价值的知识产权封装在软件程序的一个或多个功能中。假定该ip值得保护以防逆向工程,并且以这样的方式编写代码,使得攻击者仅解除(lift)其一部分(本质上,这意味着攻击者将不解除半个功能;无论如何这很难做到)将是没有价值的。如果攻击者将代码原封不动地解除,则与该代码相关的整个水印将在盗版程序中找到。在大多数情形下,这些假定是不必要的,但它们促进对可能的数学模型的解释。

盗版程序内被盗代码(候选代码)的格式将与原来粗略地相同。特别地,我们可以假定如果代码原本占用b字节,则解除后将占用不超过k*b字节,其中k是下面分析的参数。针对候选程序大小的上限可以设置为100gb,以平衡资源与检测准确度。

作为示例,期望的假阳性率可以设置为10-9,即,少于十亿分之一的机会错误地确定程序是从加水印的代码导出的。实际上,该数字可以基于应用的具体情况进行调整。假阳性的实际概率可能低得多,因为一旦已经标识了候选人,就可以手动对其进行分析,以寻找其他特征,最重要的是其功能。

参考图8,加水印的代码中常数的数量将被标示为m。在水印嵌入在b字节的代码中的情况下。检测系统124可以一次扫描t=2*k*b字节的范围(在802处指示一个这样的范围),其中每个组块与先前的组块具有50%的重叠。如果关于水印出现在k*b字节范围内的假定成立,则检测算法保证找到水印。k的合理值是4。

然后,要扫描的最大组块数是(如果k=4,则为)。用于给定程序的实际组块数可以标示为h。如果t字节组块中的一个具有在其内的所有m个水印常数,则将会出现假阳性。然而,该情况随机发生的可能性非常小。这可以建模如下:在具有n个可能结果的实验的t个独立试验中,所有m个指定结果发生的可能性是多少呢。(注意m<t,否则可能性平凡地为0)。把该值叫做。由于t与n相比相对小,因此这可以近似为,其中n=232。然后,跨所有组块,假阳性的概率是

实验上,这可以近似为。回想到,h与t成反比变化,对于m>1,t越小,则假阳性的可能性就越小。由于t只是b的倍数,b是原始代码的大小,因此我们发现对于固定大小的水印,可以加水印的代码大小基本上没有下限,因为代码越小,水印就越鲁棒。在100gb的候选程序的情况下,结果是对于小t(<1000),仅需要3个常数来使假阳性率小于10-9。这表明,在标记期间具有足够的操作来生成3个持久常数的任何代码都可以得到保护。取决于功能,这可能与单行代码一样小。

另一个考虑因素是水印检测所需的候选代码的大小。在诸如专有编解码器或白盒加密实现方式之类的示例的情况下,有价值的ip的完全封装可以被认为不少于1kib,并且可能不多于100kib。取决于k的选择,这表明t值在1与1000kib之间。在m=4并且t=1000000的情况下,假阳性率在6*10-10左右。现在,在这种情况下,虽然更大的t需要更大的m作为百分比开销,但m/t变得越小就得到越大的t。无论如何,1kib或更多代码中的4个常数是微小的开销,远远小于我们通常将对隐藏有价值的ip的预期。从另一个角度来看,如果转换代码仅用于加水印目的,并且不是混淆或其他过程/目的,则标记可以以非常小的性能惩罚来完成。

盗版检测、即检测代码的不准许使用和分发是加水印的常见用途。虽然某些城市被称为非法分销商,但在这些网站上可能有数百万个软件应用之中,可能很难识别所关心的相关软件。此外,“盗版者”可能采取伪装软件的步骤。除了诸如改变文件名和日期、移除版权信息和剥离代码签名之类的明显的事情之外,盗版者可能尝试改变文件的大小,并且甚至可能尝试改变被认为无害的一些指令。简单的散列/签名比较通常将不起作用。

但是,如果盗版者用多gb的0或随机数据填补文件,则这可以被检测到并剥离出来。因此,假定盗版程序的代码大小不多于原程序代码大小的k倍(上面定义了k)是实用的。与ip盗窃案一样,盗版者在不影响程序功能的情况下移动常数的能力有限。因此,如果一组水印常数出现在原程序的b字节内,则它们出现在盗版程序中的k*b字节内。

可以假定整个应用程序的代码区段为至少100kib大小。再次,在针对候选程序大小的上限为100gb(并且因此针对原始标记代码大小的上限为(100/k)gb)的情况下,可以下载候选程序的一部分,以将代码区段与其他区段区分。水印可以分布在整个代码中。如以上讨论的,加水印的开销很小。可能存在某些函数其被代码转换得更重,并且因此产生大量的常数,但我们可以假定代码的每个部分中都存在一些最小数量的常数。

假定我们可以接收整个候选下载,并且盗版者没有变更水印,则假阳性率可以设置为期望的最大水平。假阴性率将为0;满足水印阈值的任何候选程序将被标识为盗版程序。例如,对于10-9的期望假阳性率,在不破坏水印的情况下,我们可以确定必须分析的候选程序的最小值有多少。对于完整的候选程序和10-9的期望假阳性率,我们可以确定多少水印必须是完好无损的。换言之,盗版者伪装软件和避免检测的难度可以基于诸如代码值、带宽等之类的情形特性来调整。

作为示例,可以设置每1000字节代码1个常数的保守最小水印比率。在常数/kib和性能开销之间没有直接的转换,但是安全地假设在该比率下,大多数程序的开销应该很小。基于这些假定,标记软件中至少存在100个水印常数。

如果已经下载(或以其他方式接收/访问)了候选程序,则候选程序可以一次扫描一个组块。为了方便起见,可以使用k*100kib的组块,并映射到标记程序的对应的100kib。因此,至少标识了100个特定的水印常数。如果候选程序是盗版程序,即,从标记代码导出,则所有这些常数都将被预期出现。然而,所有这些常数出现在非盗版程序中的可能性非常低。对于所有合理的k值(例如,<1000),该数字远远小于10-100。此外,该数字随着每个组块而倍增。例如,如果扫描了10个组块,则该数字小于10-1000,对于100个组块,则它是10-10000,等等。基于所选的最小程序大小,假阳性率最多为10-100

此外,对于候选程序的每k个kib,如果候选程序是盗版程序,则将存在至少1个水印常数。在非盗版程序中看到所标识的常数的可能性随k而变化。再次,看k=1000的极端示例情况,该可能性是。因此,为了得到10-9或更小的假阳性率,我们可以下载3个组块的k个kib()。这表明,可能没有必要下载整个候选程序来确定它是否是盗版程序。

假设候选程序被扫描,并且每个k*100kib找到d个水印常数。d可能小于预期值,因为盗版者已经主动采取步骤来变更软件以破坏水印常数。如以上,这做起来相当困难,但仍然可以询问问题:有多少水印必须持续存在以便仍然被检测到。答案取决于期望的假阳性率,例如,诸如小于10-9。对于给定的比率,我们可以计算实现该比率的最小d值。例如,在k=1000、在d=6的情况下,假阳性率为1.5*10-10。因此,仅有6%的水印必须完好无损,以在优于10-9的假阳性率下将非盗版程序与盗版程序区分。

上面提到的可以定义如下:在具有n个可能结果的实验的t个独立试验中,所有m个指定结果都发生的可能性是什么呢。为了清楚起见,我们可以假定m个结果必须都是不同的。给出具体的示例,如果骰子被滚动5次,则你看到1、2和3全部的概率是什么。

考虑针对m、n和t的条件:

:你不能滚动骰子1.5次,或者看到2、3个结果。

n>0:实验必须至少有1个可能的结果。

t>0:必须至少有1次试验。

:指定结果的负数没有意义,但是m=0意味着我们对结果没有放置限制。

:因为所有指定的结果必须是不同的,所以最大m是可能结果的总数。

取得指定结果的方式数/结果的总。让我们将标示为该分数中的分子——具有n个可能结果的实验的t个独立试验的方式数,包括所有m个特定和不同的结果。分母很容易计算:因为每个试验都是独立的,所以总共存在nt个可能的结果。

考虑的一些基本情况

nt。这导致,如预期的那样。

如果m>t,则

现在考虑两种情况。给定的试验要么与指定的结果之一匹配,要么不匹配。如果它匹配{m个可能性),则少了一个匹配的结果,并且少了一次来进行它的试验。如果没有(n-m种可能性),则存在相同数量的结果要匹配,并且少了一次来进行它的试验。因此,q的递归公式为:

忽略m>t的情况,对于这种情况,公式是不必要的,如果我们保持递归,则我们最终将总是取得m'=0或者m'=t',基本情况之一。按照惯例,以上语句中的质数意在将变量与原始常数m和t区分。将该公式应用于上面的滚动骰子示例产生:

不幸的是,该公式在实际中很难使用,因为递归深度很大,并且涉及的数字很快就变得非常大。然而,可以近似该公式。首先,可以认识到如下:

利用归纳法,可以证明经由递归对的展开将生成(t选择m)项。每个项将是形式,其中t'<t,或者每个项将是形式,其中m'<m。每个项都由递归产生,其中m和t被减少m次,并且t被进一步减少t-m-t'次。m和t的减少一起给出系数的乘积。t的减少单独给出了t-m-t'个系数的乘积。最后,本身是。因此我们具有项

每个项由递归产生,其中m和t被减少m-m'次,并且t被进一步减少t-m次。m和t的减少一起给出系数的乘积。t的减少单独地给出了t-m个系数的乘积。最后,本身是。因此我们具有项

将所述项放在一起,可以发现:

并且因此

重要地,公式已经被证明高估了,所以假阳性率在最坏的情况下总是这样。考虑到简化,只要t和n二者比m大,它们就是合理的近似。可以看出,所公开的实现方式提供了高度鲁棒的软件加水印和非常准确的水印检测。

描述扩展表

尽管为了说明的目的,已经基于当前被认为是最实用和优选的实现方式详细描述了本技术,但是应当理解,这样的细节仅仅是为了该目的,并且该技术不限于所公开的实现方式,而是相反,意图覆盖在所附权利要求的精神和范围内的修改和等同布置。例如,应当理解,本技术预期,在可能的程度上,任何实现方式的一个或多个特征可以与任何其他实现方式的一个或多个特征相组合。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1