著录项信息
专利名称 | 用于基于编译器的混淆的方法和计算设备 |
申请号 | CN201480011267.9 | 申请日期 | 2014-02-26 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2015-11-25 | 公开/公告号 | CN105103127A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F8/41 | IPC分类号 | G;0;6;F;8;/;4;1;;;G;0;6;F;2;1;/;1;4查看分类表>
|
申请人 | 微软技术许可有限责任公司 | 申请人地址 | 美国华盛顿州
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 微软技术许可有限责任公司 | 当前权利人 | 微软技术许可有限责任公司 |
发明人 | O.A.米勒;T.岑;H.T.波斯坦奇;M.T.帕什尼亚克;K.S.佩特尔 |
代理机构 | 北京市金杜律师事务所 | 代理人 | 王茂华 |
摘要
描述了基于编译器的混淆。为了用混淆来保护代码项目的各部分,作为编译过程的一部分在编译器内修改该代码以产生使代码混淆的一个或多个修改。生成代码的已编译版本,其具有在编译器内产生的修改。在一个方法中,将编译器配置成消耗混淆描述,该混淆描述指示要保护的代码部分并指定要对所指示部分进行的修改。可在编译过程期间执行代码的各种不同修改以实现相应的混淆特征。例如,在编译器内进行的修改可包括但不限于被设计成使得能够实现代码的篡改检测、反调试和/或加密的修改。
1.一种用于基于编译器的混淆的方法,所述方法包括:
作为代码编译的一部分在编译器内修改用于开发项目的代码以产生一个或多个修改以使代码的一部分混淆,包括:
获得具有定义所述修改的命令的混淆描述,所述修改被设计成使得能够实现以下各项中的一个或多个:代码的堆执行、验证或加密;以及
通过对将用于开发项目的代码与用以实现所述命令的代码进行组合的中间代码应用所述混淆描述以产生所述修改,所述混淆描述被配置成指定要混淆的各代码部分和要对一个或多个部分进行的修改;以及
由编译器生成代码的已编译版本,该已编译版本具有在编译器内产生以使所述代码部分混淆的修改。
2.如权利要求1所述的方法,进一步包括作为编译过程的一部分即时地生成一个或多个混淆算法以产生所述修改。
3.如权利要求2所述的方法,其中,针对代码的至少两个不同部分而生成不同的混淆算法并将其应用于所述代码的至少两个不同部分。
4.如权利要求1所述的方法,进一步包括:
作为代码编译的一部分修改代码的多个部分包括:如所述混淆描述中的命令所命令的单独地向所述多个部分应用不同的混淆特征和修改以使所述多个部分的保护单独化。
5.如权利要求1所述的方法,其中,所述修改包括以下各项中的至少一个:
代码块的重排、调用重定向、克隆函数的创建、对符号属性和行为的改变、代码块的分段、替换调用、设定代码的不同部分之间的绝对引用、或者到代码中的入口点的修改。
6.如权利要求1所述的方法,其中,所述修改包括以下各项中的至少一个:插入校验和、验证器模块或验证代码。
7.如权利要求1所述的方法,其中,所述修改包括代码部分的加密和解密/重新加密代码的添加。
8.如权利要求1所述的方法,其中,所述修改包括将在运行时间以已混淆形式运行的至少一个函数的虚拟化。
9.如权利要求1所述的方法,其中,所述修改包括:
对代码进行预处理以产生中间语言代码,该中间语言代码将用于开发项目的源代码与指示要对源代码进行的修改的源混淆代码进行组合;以及
通过在代码的编译期间在编译器内对中间语言代码应用所述修改来使代码混淆。
10.存储指令的一个或多个计算机可读存储介质,所述指令在被计算设备执行时实现编译器模块,该编译器模块被配置成执行包括以下各项的操作:
获得指示要保护的用于开发项目的源代码部分和要进行的以使所指示部分混淆的修改的命令,所述修改被设计成使得能够实现源代码的堆执行、验证或加密中的一个或多个;
生成中间语言代码,该中间语言代码将源代码与用以实现所述命令的代码进行组合;
以及
对中间语言代码应用所述命令以在由编译器模块在中间语言代码的编译期间根据所述命令来修改所指示部分,包括:经由虚拟执行环境修改在运行时间以已混淆形式执行的一个或多个函数,所述虚拟执行环境模仿用于所述一个或多个函数的已混淆指令的操作。
11.如权利要求10所述的一个或多个计算机可读存储介质,其中,所述编译器模块被进一步配置成执行操作,所述操作包括:
编译通过对中间语言代码应用所述命令而产生的已混淆代码;以及
输出用于开发项目的受保护已编译代码,该受保护已编译代码具有由编译器模块在中间语言代码的编译期间产生的混淆。
12.一种计算设备,包括:
处理系统;
一个或多个模块,可至少部分地经由处理系统的硬件操作以实现集成开发环境(IDE),该集成开发环境包括:
开发模块,用于使开发接口暴露以使得能够创建用于软件开发项目的源代码;
混淆模块,用于:
产生通过开发接口产生的混淆描述以指定用于编译器在源代码的编译期间进行的以使源代码的一个或多个所选部分混淆的修改,所述修改包括:如所述混淆描述所命令的单独地向所选部分应用不同的混淆特征和修改以使所选部分的保护单独化;
将所述混淆描述与源代码相关联;以及
供应所述混淆描述以用于由编译器模块消耗;以及
编译器模块,用于通过解释和应用由所述混淆模块供应的所述混淆描述来使用混淆描述编译源代码以产生用于开发项目的受保护已编译代码,以实现所指定的修改以在编译期间使所述一个或多个所选部分混淆。
用于基于编译器的混淆的方法和计算设备\n技术领域\n[0001] 本发明涉及基于编译器的混淆,并且特别地涉及用于基于编译器的混淆的方法和计算设备。\n背景技术\n[0002] 与开发应用程序及其它代码相关联的一个挑战是保护代码的敏感部分不被修改、禁用或逆向工程。例如,可执行被设计成实现用于应用程序模块的电子许可和/或数字权限管理的代码部分的保护,以防止第三方围绕代码进行工作而非法地使用和/或分发该应用程序模块。开发者可直接地在对应用程序进行源编码的同时添加一些保护措施,然而,这对于开发者而言可能是相当麻烦且耗费时间的。另一方法涉及到在由编译器输出文件之后向已编译的二进制文件施加保护。然而,使已编译二进制码混淆可以使得一些二进制码变得不稳定,限制可用的混淆和代码优化的类型,并且增加开发过程的复杂性和时间。此外,被用于传统混淆的一些技术在运行时间或者通过磁盘上的二进制码的静态分析来检测是相当简单的,特别是由老练的黑客。传统混淆技术的这些及其它复杂性充当使得其低效且抑制开发者向其代码添加有效保护的障碍。\n发明内容\n[0003] 描述了基于编译器的混淆。为了用混淆来保护代码项目的各部分,作为编译过程的一部分在编译器内修改该代码以产生使代码混淆的一个或多个修改。生成代码的已编译版本,其具有在编译器内产生的修改。在一个方法中,将编译器配置成消耗混淆描述,该混淆描述指示要保护的代码部分并指定要对所指示部分进行的修改。可在编译过程期间执行代码的各种不同修改以实现相应的混淆特征。例如,在编译器内进行的修改可包括但不限于被设计成使得能够实现代码的篡改检测、反调试和/或加密的修改。\n[0004] 本发明内容被提供用来以简化形式介绍下面在具体实施方式中进一步描述的概念的选择。本发明内容并不意图标识要求保护的主题的关键特征或必要特征,其也不意图用作确定要求保护的主题的范围的辅助。\n附图说明\n[0005] 参考附图来描述具体实施方式。在图中,附图标记的(多个)最左数字标识该附图标记第一次在其中出现的图。相同附图标记在本描述和图中的不同实例中的使用可指示类似或相同的项目。\n[0006] 图1是可操作用于采用基于编译器的混淆技术的示例实施方式中的环境的图示。\n[0007] 图2是描述表示可发生以产生用混淆保护的已编译代码的操作的基于编译器的示例混淆的图。\n[0008] 图3是描绘其中作为针对开发项目的编译代码的一部分产生用混淆保护的已编译代码的示例实施方式中的工序的流程图。\n[0009] 图4是描绘其中作为编译过程的一部分对中间语言代码进行修改以产生已混淆代码的示例实施方式中的工序的流程图。\n[0010] 图5是描绘其中经由集成开发环境来执行基于编译器的混淆的示例实施方式中的工序的流程图。\n[0011] 图6图示出可以用来实现本文所述的技术的实施例的示例系统和系统的部件。\n具体实施方式\n[0012] 概述\n[0013] 开发者使用传统混淆技术向其代码添加有效的保护以防止第三方非法地使用或分发代码可能是困难或不可能的。在源编码期间或者对由编译器输出的已编译二进制码应用的传统混淆技术可提供有限的保护选项,使用在运行时间检测起来相当简单的技术,和/或增加开发过程的时间/复杂性/成本。\n[0014] 在本文中描述了基于编译器的混淆。为了用混淆来保护代码项目的各部分,作为编译过程的一部分在编译器内修改该代码以产生使代码混淆的一个或多个修改。生成代码的已编译版本,其具有在编译器内产生的修改。在一个方法中,将编译器配置成消耗混淆描述,该混淆描述指示要保护的代码部分并指定要对所指示部分进行的修改。可在编译过程期间执行代码的各种不同修改以实现相应的混淆特征。例如,在编译器内进行的修改可包括但不限于被设计成使得能够实现代码的加密、反调试和/或篡改检测的修改。\n[0015] 在以下讨论中,首先描述可采用本文所述的基于编译器的混淆技术的示例环境。\n接下来,描述图示出基于编译器的混淆的示例细节的示例过程流程情形。然后描述可在该示例环境以及其它环境中执行的示例工序。因此,示例工序的执行不限于该示例环境,并且该示例环境不限于示例工序的执行。最后,描述可以在基于编译器的混淆的一个或多个实施方式中采用的示例系统和该系统的部件。\n[0016] 示例操作环境\n[0017] 图1是可操作用于采用本文所述的技术的示例实施方式中的环境100的图示。所图示的环境100包括经由网络106被通信耦合的计算设备102和web服务104。可将计算设备102配置成访问通过网络106经由web服务104使得可用的多种资源105(例如,内容和服务)并与之相交互。计算设备102和web服务104每个可由范围广泛的计算设备实现。\n[0018] 例如,可将计算设备102配置为能够通过网络106进行通信的计算机,诸如台式计算机、移动站、娱乐装置、平板电脑或平板型设备、表面计算设备、被通信耦合到显示设备的机顶盒、移动通信设备(例如,无线电话)、游戏控制台等。可将计算设备102配置为采用各种处理系统的任何适当的计算系统和/或设备,相对于图6的示例系统来讨论其一些附加示例。\n[0019] 计算设备102被进一步图示为包括操作系统108。一般而言,操作系统108被配置成将计算设备102的底层功能抽象化成可在计算设备102上执行的应用程序110。例如,操作系统108可将计算设备102的处理、存储器、网络和/或显示功能进行抽象,使得可在不知道“如何”实现此底层功能的情况下编写应用程序110。应用程序110例如可向操作系统108提供数据以由显示设备再现和显示而不知道此再现将如何执行。操作系统108可提供应用程序110可调用以利用系统特征的各种服务、接口以及功能。设想向计算设备102提供范围广泛的功能的多种应用程序110,包括但不限于浏览器、办公室生产率应用程序、电子邮件客户端、多媒体管理程序、设备管理软件、软件开发环境和联网应用程序,仅举几个示例。\n[0020] 计算设备102还包括开发模块112,其表示可操作用于提供用于开发应用程序110的集成开发环境(IDE)的功能。开发模块112一般地提供应用程序生命周期管理,包括对于应用程序的设计、开发、测试和/或部署的支持。开发模块112可支持不同的编程语言并将不同的部件集成以简化应用程序开发,诸如代码编辑器、一个或多个编译器、构建自动化工具、调试器等。因此,开发模块112提供用于开发者创建/编辑用于项目的源内容/代码并编译该源内容/代码以构建应用程序110的功能。\n[0021] 根据本文所述的技术,开发模块112还可包括或者另外利用如本文所述地操作的编译器模块114和混淆模块116。编译器模块114表示可操作用于实现编译过程以将用于开发项目的源代码文件变换成机器语言代码和可执行指令(例如,目标代码、二进制文件、可执行文件等)的功能。编译器模块114可包括多个不同的子模块、处理步骤和/或编译阶段。\n例如,编译器模块可包括前端编译器和后端编译器两者。虽然被图示为单独的模块,但还可将混淆模块116提供为编译器模块114的集成部件。此外,在一些实施方式中,可将开发模块\n112、编译器模块114和/或混淆模块116中的一个或多个配置为使得可通过网络106被客户端访问的web服务(例如,作为“在云中”的开发服务或混淆服务)。在本示例中,开发者可能能够通过与web服务104的交互来开发应用程序,所述web服务104提供包括代码混淆工具/接口作为在线可用的资源105的应用程序开发工具。\n[0022] 混淆模块116表示可操作使得代码混淆技术能够作为编译过程的一部分由编译器模块114执行的功能。一般而言,如本文所使用的混淆指代以不同的方式修改代码以使得其难以理解。可采用混淆来隐藏代码的意义和目的,即使代码被以明文拦截和查看。这创建针对可尝试对代码进行篡改或逆向工程的“黑客”的一定水平的保护。与传统技术相反,混淆在编译过程期间发生。因此可将编译器模块114配置成在编译期间调用混淆模块116、与之相交互或者另外利用混淆模块116以施加修改来使源代码的至少一些部分混淆。在至少一些实施方式中,开发者可与开发模块112和/或混淆模块116相交互以产生混淆描述以指定要用混淆来保护的源代码的特定部分以及定义用于该部分的修改。可用指令来配置该混淆描述,所述指令适合于命令编译器模块114在编译期间实现对源代码的指定部分的修改。设想用以使代码混淆的各种不同种类的修改和技术,相对于以下各图来描述其示例。\n[0023] 已考虑了示例操作环境,现在考虑根据一个或多个实施例的用于基于编译器的混淆的一些示例细节。\n[0024] 基于编译器的混淆细节\n[0025] 以下讨论描述可利用先前所述的系统和设备来实现的基于编译器的混淆技术的实施方式细节。参考图2中描绘的示例情形来描述基于编译器的混淆的各方面。特别地,图2一般地在200处描绘了关于开发模块112的部件和操作的细节,根据一些实施方式,开发模块112可被用来通过在编译期间对代码进行混淆来产生受保护的已编译代码。\n[0026] 在操作中,开发者可使用开发模块112在用于应用程序的项目中设计、定义、创建和编辑源代码202(例如,代码模块、内容、脚本、图像、式样、注释等)。开发模块112可支持用一个或多个不同编程语言进行的软件编程。一般地,可以各种不同的编程语言、IDE、编译器等来采用本文所述的基于编译器的混淆技术。\n[0027] 作为开发项目的一部分,可调用混淆模块116以产生与源代码202相关联的混淆描述204。在一个方法中,可使接口暴露,其使得开发者能够进行选择以产生用于源代码202的各部分的混淆描述204。如所指出的,混淆描述204被配置成指定要混淆的源代码202的至少一些部分并定义要对那些部分进行的修改。在一个方法中,混淆描述204可包含各种命令\n206,其可被编译器模块114消耗以实现相应的混淆。可将混淆模块116配置成响应于由开发者通过适当的接口进行的选择而自动地生成命令206。\n[0028] 可以各种方式来配置命令206以标识由开发者选择用于保护的源代码202的各部分。可进一步将命令206配置成定义可以在编译期间解释并应用以实现修改的不同类型的修改、混淆算法、设定及其它参数。在一些实施方式中,将命令206创建成包括用于实现针对源代码202的所选部分指定的一个或多个修改的源代码部分。一般地该修改被设计成以某种方式操纵代码以使代码混淆。这可包括但不限于代码失真、符号/语法替代、区块或模块的重新排序、到代码中的插入、分支、函数重排、跳转指令的添加、布局和程序流程操纵、敏感代码部分的加密等。\n[0029] 修改还可包括将在运行时间以已混淆形式运行的一个或多个函数的虚拟化。在这里,针对至少一个函数定义虚拟执行环境,该函数解释以已修改、已混淆形式表示的命令/指令。指令的已修改、已混淆表示可以是黑客难以解释(即使其被以明文拦截)的字节代码值。在运行时间,虚拟执行环境实际上模拟或模仿以已修改、已混淆形式表示的指令的操作。这样,可以避免所表示的底层指令的暴露。\n[0030] 可将编译器模块114配置成执行操作,所述操作包括扫描源代码202、解析该代码、验证语法、将源代码翻译成中间语言(IL)代码、优化代码和布局以及产生已编译输出文件(例如,二进制文件、汇编代码、目标代码等)。作为此过程的一部分,编译器模块114可应用由命令206指定的所选混淆算法来实现相应的修改。可采用用以产生代码的适当修改以用于代码混淆的任何适当算法。可经由命令206来选择代码的至少一些部分以用于混淆,而代码的其它部分可保持未混淆/未修改。可对被选择用于混淆的代码的每个部分应用一个或多个不同算法。在一个方法中,作为编译过程的一部分,即时地(例如,按需动态地)生成用以实现混淆的不同算法或算法的变型。因此,可采用不同的技术和算法来使代码的不同部分混淆。对不同的代码部分使用不同的算法进一步使对代码进行逆向工程的尝试复杂化,因为黑客/恶意方可能不能在没有发现被用于每个已混淆代码部分的每个单独技术和算法并将其解码的情况下完全理解代码的目的和/或意义。\n[0031] 此外,可针对每个部分将该混淆单独化。例如,可对一些敏感的数字权限代码部分应用加密,同时可对不那么敏感的代码使用代码重排和布局修改以提供不同的各水平的保护。可选择性地对附加受保护部分应用跳转指令和符号代替。可针对不同的受保护部分动态地生成用于将混淆编码/解码的另外的不同密钥对和/或代替模式。可针对不同的受保护部分以及跨不同的项目/应用程序采用不同的密钥对和/或代替模式来改变算法方案和/或使混淆算法单独化。编码/解码密钥可以是随机生成的密钥、基于校验和或散列导出的密钥、静态密钥值等。代码的其它部分可保持未被混淆修改且未受到混淆保护。\n[0032] 因此,可针对每个代码部分选择适当水平的保护,并且可单独地对各部分应用相互之间改变的相应技术/算法。被用于每个项目的特定混淆方案和在每个实例中应用的技术可改变以使得难以确定用于代码的任何给定部分的保护类型。以这种方式,可对受保护代码的多个部分单独地应用不同的混淆特征和修改以如混淆定义204和/或命令206所命令的使保护单独化。\n[0033] 因此,可调用混淆模块116以产生定义将在编译器中发生的混淆的命令206。例如,开发者通过混淆模块116可选择要保护的至少一些代码部分,诸如与数字许可和权限管理有关的代码部分。此动作产生混淆描述204,混淆描述204包括用于由编译器消耗的命令\n206。然后可将用于项目的源代码202和具有命令206的相应混淆描述204作为输入提供给编译器模块114,如图2中所表示的。\n[0034] 一般而言,编译器模块114表示可在混淆模块116的影响下操作以解析用于开发项目的源代码202并将其转换成代码的已编译和受保护(例如,已混淆)版本的功能。如前面指出的,编译器模块114可包括多个不同的子模块、处理步骤和/或编译阶段。例如,编译器模块可包括前端编译器和后端编译器两者或功能的其它划分。\n[0035] 如图2中所表示的,编译器模块114可执行预处理操作208以解析源代码202并将源代码202变换成中间语言代码210(例如,IL代码)。IL代码表示基于源代码的预处理生成的高级指令。IL代码的该高级指令可稍后在编译过程中被消耗以产生低级的机器代码。IL代码还可结合从混淆描述204导出的运行时间指令以使得能够实现混淆功能。因此,中间语言代码210可表示源代码202与用以在编译过程中实现各种修改的混淆描述204所指示的代码部分的组合。\n[0036] 以示例而非限制的方式,预处理操作208可采用令牌化器或相当的功能来从混淆描述204导出运行时间指令。在这里,令牌化器可解析并解释混淆描述204以产生具有采取适合于被扩展至中间语言的格式的命令206的运行时间文件。令牌化器还可产生描述用于将在编译期间应用的各种修改的配置的令牌。根据针对基于编译器的混淆而定义的图式,可将令牌实现为表示用于修改的配置数据的各串的密钥值对。然后,可将命令扩展,并用相应的中间语言代码来替换令牌以产生预处理运行时间文件,该文件包含用于将在已编译代码中结合以实现混淆的函数、数据结构以及算法的源混淆代码。\n[0037] 此外,预处理操作208还可采用前端编译器或相当的功能来将用于项目的源代码\n202与一些源混淆代码进行组合,并将已组合代码预编译成中间语言代码210。换言之,可在预处理操作208中使用混淆描述204和/或关联的命令206以产生指示要对源代码进行的修改的源混淆代码。然后,在可经由前端编译器或其他方式执行的预编译阶段中将用于项目的源代码和源混淆代码钩连(hook)在一起。预处理操作208的结果是将源代码202和用于混淆的配置信息进行组合的中间语言代码210。\n[0038] 该中间语言代码210然后可在由编译器模块114实现的编译过程的后续阶段中被消耗。如图2中进一步所示,这可包括混淆过程212,其将中间语言代码210作为输入并因此而修改代码以产生已混淆中间语言代码214。因此,混淆在编译器内发生,与对代码的已编译版本进行操作或要求开发者在源代码开发期间执行时间/资源密集的修改的传统技术相反。\n[0039] 然后,在编译过程216中编译已混淆中间语言代码214以产生具有用以使代码混淆的各种修改的受保护已编译代码218。一般地,编译过程216涉及到将代码转换成低级机器代码,诸如二进制码、目标代码、汇编代码等。因此,如本文所使用的编译过程216指的是将IL代码变换成适当的较低级机器代码的操作。混淆过程212和编译过程216可经由后端编译器或由编译器模块114实现的其它相当功能发生。此外,中间语言代码的混淆和编译可连续地(如所示的)、同时地针对不同受保护部分或者以别的方式发生。\n[0040] 在一个方法中,将输入中间语言代码210转换成元组流,其由编译器模块114(例如,后端编译器)和混淆模块116进行操作。在这里,编译器模块114可以各种方式与混淆模块116相交互以实现如由混淆描述204指定并在中间语言代码210中反映的修改。交互可经由适当的接口220发生,所述接口220促进编译器模块114与混淆模块116之间的通信、数据交换及其它交互。\n[0041] 在一个实施例中,编译器模块114被配置成在编译期间调用混淆模块116以随着正在处理IL代码而向混淆模块116传递关于各函数的符号、数据类型、状态以及阶段的配置信息。混淆模块116可利用从编译器模块114获得的信息来确定要保护的函数和数据并确定要进行的混淆和修改的类型。在这里,可将混淆模块116实现为与编译器模块114分离且因此可能不能直接地进行指定修改的部件。替代地,混淆模块116处理由编译器模块114提供的配置信息,识别该配置信息所指示的修改,并发送指令以便由编译器模块接收,所述指令被配置成促使编译器模块代表其进行修改。例如,混淆模块116可命令编译器模块114插入调用、获得或设定某些值、加密函数,和/或进行其它种类的修改以对代码进行混淆,上文和下文描述了其示例。另外或替换地,可将混淆模块116实现为编译器114和/或后端编译器的部件,并且因此可操作用于直接地对IL代码进行修改。\n[0042] 如前面指出的,设想多种不同种类的修改。这些修改用来实现混淆特征/功能,诸如篡改检测、反调试和/或加密。在一个实施方式中,将这些修改设计成使得能够实现在运行时间的堆执行、代码部分的加密/解密以及代码验证中的一个或多个。可用来实现这些及其它基于编译器的混淆特征的修改的一些非限制性示例包括对符号属性和行为的改变、克隆函数的创建、调用重定向、代码块分段、代码块重排、替换调用、设定特定代码段之间的绝对引用以及入口点的修改。可进行前述列表中的示例修改中的一个或多个以使得能够实现堆执行自己其它混淆特征。修改还可包括校验和、验证器模块和/或其它验证代码的插入以实现验证特征以及促进其它混淆特征。另外,这些修改可包括代码部分的加密和/或解密/重新加密代码的添加以实现用于代码的指定部分的加密。在示例工序的以下讨论中可以找到关于用于基于编译器的代码混淆的技术的这些及其他方面的附加细节。\n[0043] 示例性程序\n[0044] 在本节中,讨论了可以与任何适当硬件、软件、固件或其组合相结合地实现的用于基于编译器的混淆的(多个)示例工序。所述工序被示为一组块,其指定由一个或多个设备执行的操作,并且不一定局限于用于由各块执行操作的所示顺序。在至少一些实施例中,可经由适当配置的计算设备、诸如图1的示例计算设备102来实现所述工序。可经由计算设备的开发模块112来实现工序的各方面。此外,开发模块可包括或利用被配置成执行相对于示例工序描述的操作中的至少一些的混淆模块116和/或编译器模块114。\n[0045] 图3描绘了其中作为针对开发项目的编译代码的一部分产生用混淆保护的已编译代码的示例实施方式中的工序300的流程图。以示例而非限制的方式,工序300可表示经由开发模块112的一个或多个编译器模块114执行的示例操作。作为代码编译的一部分在编译器内修改代码以产生一个或多个修改以使代码的一部分混淆(方框302)。例如,可调用开发模块112的编译器(例如,编译器模块114)来编译应用程序开发项目。如相对于图2所描述的,编译器可包括混淆模块116或与之相交互,该混淆模块116供应具有描述如何使关联的源代码混淆的命令206的混淆描述204。命令206被配置成促使编译器作为编译源代码的一部分实现各种修改。该编译器可结合混淆模块进行操作以对项目中的代码的至少一些部分进行指定的修改。如前所述,设想多种修改。采用所述修改来产生开发模块所支持的不同类型的混淆特征,包括但不限于代码的加密、验证以及堆执行。\n[0046] 由编译器生成具有修改的代码的已编译版本以使在编译器内产生的代码部分混淆(方框304)。例如,经由各种不同修改而混淆的代码可被编译器编译以产生已编译代码。\n已编译代码可以是采用适当机器语言的二进制文件或其它低级文件。由编译器输出的已编译代码包含在编译器本身内实现的混淆。\n[0047] 图4是描绘其中对中间语言代码进行修改以产生已混淆代码的示例实施方式中的工序400的流程图。以示例而非限制的方式,工序400可表示经由包括或利用混淆模块116的编译器模块114执行的示例操作。获得指示要保护的用于开发项目的源代码部分和要进行的以使所指示部分混淆的修改的命令(方框402)。例如,包含在混淆描述204中的命令206可由混淆模块116供应以便由编译器模块114在关联的源代码的编译期间使用。命令206可指定要进行的不同修改并指示要保护的代码的特定部分,如前所述。\n[0048] 生成将源代码与用以实现所述命令的代码进行组合的中间语言代码(方框404)。\n这可以相对于图2所述的方式发生。例如,可发生预处理以产生混淆源代码。该混淆源代码被与用于项目的源代码进行组合并预编译成中间语言格式。在一个方法中,输出具有已组合IL代码的单个目标文件以便在编译过程的后续阶段中处理。\n[0049] 将所述命令应用于中间语言代码以根据所述命令来修改所指示的部分(方框\n406)。然后,编译通过对中间语言代码应用所述命令而产生的已混淆代码(方框408),并输出用于开发项目的受保护已编译代码(方框410)。在这里,编译器模块114可进行操作以处理已组合IL代码以实现所指定的各种修改。为此,编译器可调用和/或另外与混淆模块116相交互,如先前所讨论的。可将编译器模块114进一步配置成编译代码以将IL代码降低成较低级机器代码(例如,二进制码)。一般地,这可包括解析代码、语法的识别和验证、符号代替、代码的布局和优化以及通常为了编译源代码而执行的其它操作。结果是代码的已编译版本,其由各种混淆保护而免于第三方进行的逆向工程和操纵。\n[0050] 图5是描绘其中经由集成开发环境来执行基于编译器的混淆的示例实施方式中的工序500的流程图。以示例而非限制的方式,程序500可表示经由开发模块112而执行的示例操作,该开发模块112表示作为台式计算机封装件、在线web服务或以别的方式可用的集成开发环境(IDE)。使开发接口暴露以使得能够创建用于软件开发项目的源代码(方框502)。\n例如,可由开发者采用开发模块112来产生用于应用程序或其它项目的源代码。开发模块\n112可包括或利用如本文所述地操作以实现基于编译器的混淆的混淆模块116。\n[0051] 源代码与通过开发接口产生的混淆描述相关联以指定用于编译器在源代码的编译期间进行的以使源代码的一个或多个所选部分混淆的修改(方框504)。在这里,可调用混淆模块116以产生混淆描述204,该混淆描述204包括指示针对代码的一个或多个部分指定的修改的命令206。可单独地针对代码的各部分选择性地指定各种修改。\n[0052] 使用混淆描述来编译源代码以产生用于开发项目的受保护已编译代码以实现指定修改以使一个或多个所选部分混淆(方框506)。例如,编译器模块114可获得并解释混淆描述204以在编译期间实现代码的相应修改。编译器模块114可直接地实现修改或者可依赖于混淆模块116来命令修改,如本文所讨论的。可进行如上文所讨论的多种修改以生成已编译代码,其被用使得第三方难以理解、解释结果得到的代码以及对其进行逆向工程的一个或多个类型的混淆进行保护。\n[0053] 已考虑了用于基于编译器的混淆的示例工序,现在考虑可以用来实现本文所述的技术的实施例的示例系统和部件的讨论。\n[0054] 示例系统\n[0055] 图6图示出包括表示可实现本文所述的各种技术的一个或多个计算系统和/或设备的示例计算设备602的示例系统600。计算设备602可以是例如服务提供商的服务器、与客户端相关联的设备(例如,客户端设备)、芯片上系统和/或任何其它适当的计算设备或计算系统。\n[0056] 如所图示的示例计算设备602包括处理系统604、一个或多个计算机可读介质606以及被相互通信耦合的一个或多个I/O接口608。虽然未示出,但计算设备602可进一步包括将各种部件相互耦合的系统总线或其它数据和命令传输系统。系统总线可以包括不同总线结构(诸如存储器总线或存储器控制器、外围总线、通用串行总线和/或利用多种总线架构中的任何一个的处理器或本地总线)中的任何一个或组合。还设想多种其它示例,诸如控制和数据线。\n[0057] 处理系统604表示使用硬件来执行一个或多个操作的功能。因此,处理系统604被图示为包括可配置为处理器、功能块等的硬件元件610。这可包括作为使用一个或多个半导体形成的专用集成电路或其它逻辑器件的采用硬件的实施方式。硬件元件610并不受形成其的材料或其中采用的处理机制的限制。例如,处理器可由(多个)半导体和/或晶体管(例如,电子集成电路(IC))构成。在这样的背景下,处理器可执行指令可以是电子可执行指令。\n[0058] 计算机可读介质606被图示为包括存储器/储存器612。存储器/储存器612表示与一个或多个计算机可读介质相关联的存储器/储存器容量。存储器/储存器612可包括易失性介质(诸如随机存取存储器(RAM))和/或非易失性介质(诸如只读存储器(ROM)、闪存、光盘、磁盘等)。存储器/储存器612可包括固定介质(例如,RAM、ROM、固定硬驱等)以及可移动介质(例如,闪存、可移动硬驱、光盘等)。如下面进一步描述的,可以多种其它方式来配置计算机可读介质606。\n[0059] (多个)输入/输出接口608表示允许用户向计算设备602键入命令和信息且还允许使用各种输入/输出设备向用户和/或其它部件或设备呈现信息的功能。输入设备的示例包括键盘、光标控制设备(例如,鼠标)、用于语音操作的麦克风、扫描仪、触摸功能(例如,被配置成检测物理触摸的电容性或其它传感器)、照相机(例如,其可采用可见或不可见波长,诸如用以将并未涉及到触摸的移动检测为手势的红外频率)等。输出设备的示例包括显示设备(例如,监视器或投影仪)、扬声器、打印机、网卡、触觉响应设备等。因此,可以如下面进一步描述的多种方式来配置计算设备602以支持用户交互。\n[0060] 在本文中可在软件、硬件元件或程序模块的一般背景下描述各种技术。一般地,这样的模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、元件、部件、数据结构等。如本文所使用的术语“模块”、“功能”和“部件”一般地表示软件、固件、硬件或其组合。本文所述的技术的特征是平台独立的,意味着可在具有多种处理器的多种商用计算平台上实现所述技术。\n[0061] 可将所述模块和技术的实施方式存储在某种形式的计算机可读介质上或跨该计算机可读介质发射。计算机可读介质可包括可被计算设备602访问的多种介质。以示例而非限制的方式,计算机可读介质可包括“计算机可读存储介质”和“通信介质”。\n[0062] “计算机可读存储介质”指的是与仅仅信号传输、载波或信号本身相比使得能够实现信息的存储的介质和/或器件。因此,计算机可读存储介质不包括信号承载介质或信号本身。计算机可读存储介质包括硬件,诸如易失性和非易失性、可移动和不可移动的介质和/或存储器件,所述介质和/或存储器件以适合于存储诸如计算机可读指令、数据结构、程序模块、逻辑元件/电路或其它数据之类的信息的方法或技术实现。计算机可读存储介质的示例可包括但不限于RAM、ROM、EEPROM、闪存或其它存储技术、CD-ROM、数字多功能磁盘(DVD)或其它光储存器、硬盘、盒式磁带、磁带、磁盘储存器或其它磁存储器件或者适合于存储期望信息且可被计算机访问的其它存储器件、有形介质或制品。\n[0063] “通信介质”指的是被配置成诸如经由网络向计算设备602的硬件发射指令的信号承载介质。通信介质通常可体现计算机可读指令、数据结构、程序模块或已调制数据信号中的其它数据,诸如载波、数据信号或其它传送机制。通信介质还包括任何信息递送介质。术语“已调制数据信号”意指信号,该信号使其特性中的一个或多个以对信号中的信息进行编码的方式被设定或改变。以示例且非限制的方式,通信介质包括诸如有线网络或直接导线连接之类的有线介质以及诸如声学、RF、红外及其他无线介质之类的无线介质。\n[0064] 如前所述,硬件元件610和计算机可读介质606表示以硬件形式实现的指令、模块、可编程器件逻辑和/或固定器件逻辑,其在一些实施例中可被用来实现本文所述的技术的至少一些方面。硬件元件可包括集成电路或芯片上系统、专用集成电路(ASIC)、现场可编程门阵列(FPGA)、复杂可编程逻辑器件(CPLD)以及硅或其它硬件器件中的其它实施方式的部件。在此背景下,硬件元件可操作为执行由硬件元件体现的指令、模块和/或逻辑所定义的程序任务的处理器件以及被用来存储指令以供执行的硬件器件,例如先前所述的计算机可读存储介质。\n[0065] 还可采用前述内容的组合来实现本文所述的各种技术和模块。因此,可将软件、硬件或包括操作系统108、应用程序110、开发模块112、编译器模块114、混淆模块116及其它程序模块的程序模块实现为在某种形式的计算机可读存储介质上和/或由一个或多个硬件元件610体现的一个或多个指令和/或逻辑。可将计算设备602配置成实现对应于软件和/或硬件模块的特定指令和/或功能。因此,模块作为可由计算设备602作为软件来执行的模块的实现可至少部分地用硬件来实现,例如通过使用计算机可读存储介质和/或处理系统的硬件元件610。指令和/或功能可以可由一个或多个制品(例如,一个或多个计算设备602和/或处理系统604)执行/操作以实现本文所述的技术、模块以及示例。\n[0066] 如在图6中进一步图示的,示例系统600使得能够实现当在个人计算机(PC)、电视设备和/或移动设备上运行应用程序时针对无缝用户体验的无所不在的环境。当在利用应用程序、玩视频游戏、观看视频等的同时从一个设备过渡至下一个时,服务和应用程序基本上类似地在全部三个环境中运行以获得共同的用户体验。\n[0067] 在示例系统600中,通过中央计算设备将多个设备互连。中央计算设备可在多个设备本地,或者可位于远离多个设备处。在一个实施例中,中央计算设备可以是通过网络、因特网或其它数据通信链路而连接到多个设备的一个或多个服务器计算机的云。\n[0068] 在一个实施例中,此互连架构使得能够实现将跨多个设备递送的功能以向多个设备的用户提供共同且无缝的体验。多个设备中的每一个可具有不同的物理要求和能力,并且中央计算设备使用平台来使得能够向设备递送为该设备量身定制且对于所有设备而言共同的体验。在一个实施例中,创建一类目标设备并且为一般类别的设备量身定制体验。可按设备的物理特征、使用类型或其它常见特性来定义一类设备。\n[0069] 在各种实施方式中,计算设备602可采取多种不同的配置,诸如供计算机614、移动设备616以及电视618使用。这些配置中的每一个包括可具有一般地不同的构造和能力的设备,并且因此可根据不同设备类别中的一个或多个来配置计算设备602。例如,可将计算设备602实现为计算机614类别的设备,其包括个人计算机、台式计算机、多屏幕计算机、膝上型计算机、上网本等。\n[0070] 还可将计算设备602实现为移动616类别的设备,其包括移动设备,诸如移动电话、便携式音乐播放器、便携式游戏设备、平板计算机、多屏幕计算机等。还可将计算设备602实现为电视618类别的设备,其包括具有或被连接到休闲观看环境中的一般地较大的屏幕的设备。这些设备包括电视、机顶盒、游戏控制台等。\n[0071] 本文所述的技术可由计算设备602的这些各种配置支持,并且不限于本文所述的技术的特定示例。这通过在计算设备602上包括开发模块112而图示出。还可全部或部分地通过使用分布式系统来实现开发模块112和其它模块的功能,诸如经由平台622而通过“云”\n620,如下所述。\n[0072] 云620包括和/或表示用于资源624的平台622。平台622对云620的硬件(例如,服务器)和软件资源的底层功能进行抽象。资源624可包括可在远离计算设备602的服务器上执行计算机处理的同时利用的应用程序和/或数据。资源624还可以包括通过因特网和/或通过订户网络(诸如蜂窝式或Wi-Fi网络)提供的服务。\n[0073] 平台622可对资源和功能进行抽象以将计算设备602与其它计算设备相连。平台\n622还可用于对资源的分级进行抽象以根据遇到对于经由平台622实现的资源624的需求而提供相应水平的分级。因此,在互连设备实施例中,可将本文所述的功能的实施方式分布遍及系统600。例如,可部分地在计算设备602上以及经由对云620的功能进行抽象的平台622来实现功能。\n[0074] 结论\n[0075] 虽然已用特定于结构特征和/或方法动作的语言描述了本发明,但应理解的是在所附权利要求中定义的本发明不一定局限于所述特定特征或动作。相反地,所述特定特征和动作是作为实现要求保护的发明的示例形式而公开的。
法律信息
- 2018-05-04
- 2015-12-23
实质审查的生效
IPC(主分类): G06F 9/45
专利申请号: 201480011267.9
申请日: 2014.02.26
- 2015-11-25
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2011-11-09
|
2011-06-30
| | |
2
| |
2016-04-27
|
2012-12-07
| | |
3
| | 暂无 |
2008-10-27
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |