按需代码解密的制作方法

文档序号:17123946发布日期:2019-03-16 00:07阅读:219来源:国知局
按需代码解密的制作方法

本公开涉及一种用于保护代码的系统和方法,例如通过采用一种促进根据需求对代码解密的构建过程。



背景技术:

软件可能受到外部各方的恶意攻击,例如反向工程攻击。鉴于此,已经开发了各种技术来保护软件免受这种攻击。

这种技术的一个例子称为“按需代码解密”。根据该技术,代码的一些元素或“组块”以加密形式传递。这些代码或组块在执行之前被解密,然后被清除。这尤其可以减轻静态分析技术,该技术在不运行代码的情况下检查代码。静态分析技术包括多种变化并且通常涉及反汇编机器代码。

通常,按需加密过程可以大致概括为包括四个步骤。首先,提取待保护代码的相关二进制代码。第二,用伪代码替换待保护的二进制代码的位置。第三,然后将提取的二进制代码加密并添加到二进制的一个数据区域。然后使得按需解密过程具有正确的信息以供使用,以这样的方式最后确定最终二进制。通常,这些步骤均在链接过程完成之后进行,并由积分器执行。

附图说明

图1示出了用于实现优选实施例的硬件基础设施;

图2a示出了根据一种已知技术的编译过程;

图2b示出了根据优选实施例的编译过程;

图3示出了优选实施例的编译过程中的源到源转换;

图4示出了优选实施例的编译过程中的对象到对象转换;

图5示出了按需解密过程的流程图。

图6显示了处理代码的区域,这些区域将被排除,不作为重定位方向;

图7示出了在按需代码解密期间掩码的生成,该掩码将被应用于保护被排除的区域;和

图8示出了不影响重定位地址的按需代码解密过程。

具体实施方式

总的来说,提供了一种用于保护代码的系统和方法。对待保护代码的提取发生在对象到对象的转换期间,并且该代码被伪二进制代码替换。然后提取的待保护代码可以被加密或被模糊化,并被存储在目标文件的一个单独区域中。可以提供先前的源到源的文件转换,以对待保护的代码进行隔离和标记,并加入额外的源代码以处理之后的解密过程。

在本公开的一些方面,提供了一种方法,例如一种用于保护代码的方法,如用于保护代码的计算机实现的方法。该方法包括执行对象到对象文件转换。该对象到对象转换包括在一个输入目标文件内识别待保护的代码以进行加密,并提取被识别的待保护代码。该对象到对象转换还包括在所述输入目标文件内用伪代码替换被识别的待保护代码,以生成第一个输出目标文件,和将待保护的代码注入第二个输出目标文件中。在注入第二个输出目标文件之前,可以使用另一种技术对待保护的代码进行加密或模糊化。

通过执行这种对象到对象转换,可以提供一种方法,该方法可以避免在后期编译过程执行解密的要求。例如,与在生成最终二进制时由积分器执行的链接阶段依赖加密的方法相比,本公开的方法可以允许在不依赖于积分器和源代码及目标代码生成过程的完全协调的情况下使代码模糊化。在许多情况下,这是一种更可靠的解决方案,其中积分器独立地运行至早期的编码/编译过程。通过保持对接近代码源的模糊过程的控制,可以实现可靠性和安全性的改进。可以选择伪代码以类似于真实代码,从而使得加密过程更难以检测。所识别的待保护代码可以被注入到第二个输出目标文件的一个数据区域中,这可以进一步帮助模糊其真实性质。

在一些实施例中,第一个输出目标文件和第二个输出目标文件可以合并到一个最终输出目标文件中。这可以允许任何输入目标文件和输出目标文件之间的一对一关系,使得需要调整后续处理以考虑对象到对象转换期间的修改的需求最小化。

在一些实施例中,该方法还可以包括,在该对象到对象转换之前执行源到源转换。该源到源转换可以包括在输入源文件中标记待保护的代码。该源到源转换还可以包括向输入源文件提供附加代码,以提供用于之后解密操作的指令。此外,该源到源转换还可以包括隔离要保护的代码。以这种方式,该源到源转换可以允许集成对象到对象转换的必要信息,而无需特殊的操作员动作。可选择性地或另外地,可以向原始源代码提供适当的信息。

在一些实施例中,该对象到对象的转换还可以包括:在所述输入目标文件中识别重定位方向;在被伪代码替换的内容中将重定位方向排除。重定位方向可以是重定位指向的地址。通过从待保护的代码中排除这些重定位方向,在链接阶段期间的重定位过程可能不受该方法的影响。实际上,这可以允许待保护的代码在链接器/积分器处调用外部函数,尽管其因为在该阶段被加密因此对链接器/积分器不可见。在一些实施例中,对象到对象变换可以包括改变一个或多个重定位方向的目标,而不是排除替代重定位方向。这可以确保解密代码的一致性。

在本公开的一些方面,提供了一种计算机程序产品,包括用于执行上述方法的计算机可执行指令。在另一些方面,提供了一种用于执行上述方法的系统。

现在参考附图通过说明的方式描述一些具体实施例,其中相同的附图标记表示相同的特征。

图1示出了计算设备100的一个实施例的框图,在该计算设备100内可以执行用于使该计算设备执行本文所讨论的任何一个或多个方法的一组指令。在替代实施例中,该计算设备可以被连接(例如,联网)到局域网(lan)、内联网、外联网或因特网中的其他机器。该计算设备可以在客户端-服务器网络环境中以服务器或客户端机器的能力操作,或者作为对等(或分布式)网络环境中的对等机器来操作。该计算设备可以是个人计算机(pc)、平板计算机、机顶盒(stb)、个人数字助理(pda)、蜂窝电话、网络设备、服务器、网络路由器、交换机或桥,或任何能够执行一组指令(序列的或其他)的机器,该指令指定该机器要采取的动作。此外,虽然仅示出了单个计算设备,但是术语“计算设备”还应被视为包括单独或联合执行一组(或多组)指令,以执行本文所讨论的任何一个或多个方法的任何机器(例如,计算机)的集合。

该示例计算设备100包括一个处理设备102,一个主存储器104(例如只读存储器(rom)、闪存、诸如同步dram(sdram)或rambusdram(rdram)的动态随机存取存储器(dram)等)、一个静态存储器106(例如闪存、静态随机存取存储器(sram)等),以及通过总线130彼此通信的辅助存储器(例如数据存储设备118)。。

处理设备102表示一个或多个通用处理器,例如微处理器、中央处理单元等。更具体地,处理设备102可以是复杂指令集计算(cisc)微处理器、精简指令集计算(risc)微处理器、超长指令字(vliw)微处理器、实现其他指令集的处理器或实现指令集组合的处理器。处理设备102还可以是一个或多个专用处理设备,诸如专用集成电路(asic)、现场可编程门阵列(fpga)、数字信号处理器(dsp)、网络处理器等。处理设备102被配置为执行本文所讨论的操作和步骤的处理逻辑(指令122)。

计算设备100还可以包括一个网络接口设备108。该计算设备100还可以包括一个视频显示单元110(例如液晶显示器(lcd)或阴极射线管(crt))、一个字母数字输入设备112(例如键盘或触摸屏)、一个光标控制设备114(例如鼠标或触摸屏)和一个音频设备116(例如扬声器)。

数据存储设备118可以包括一个或多个机器可读存储介质(或者更具体地,一个或多个非暂时性计算机可读存储介质)128,其上存储有一个或多个指令集122,其包含这里描述的任何一个或多个方法或功能。指令122还可以在计算机系统100执行期间完全或至少部分地驻留在主存储器104内和/或处理设备102内,主存储器104和处理设备102也构成计算机可读存储器介质。

为了比较的目的,图2a示出了已知软件构建过程的一般步骤。这里,源文件“.c”由编译器编译以创建目标文件“.o”。然后,目标文件由归档器归档以形成库“.lib”,这些库又由链接器(有时称为积分器)链接以形成最终的二进制文件“.bin”。每一个编译器、归档器和积分器可以在如图1中描述的计算设备100上实现。归档器、编译器和积分器可以各自在独立的计算设备100上实现,或者任何归档器、编译器和积分器的组合可以共享一个实现其组合的计算设备。例如,编译器和归档器可以集成在第一计算设备100上,并且积分器可以在第二计算设备100上实现。在提供多个计算设备100的情况下,这些计算设备可以通过任何适当的通信网络进行通信。

在许多传统场景中,编译器和归档器可以归第一实体控制,而第二实体可以通过链接器/积分器的实现聚集来自多个源的库。图2a中的框210示出了在第一实体控制下的实体。因此,当生成二进制.bin文件时,多个实体已经访问该代码,增加了潜在的安全风险以及实体之间协调不完善的稳定性风险。本公开提供了一种减轻这种风险的构建过程。特别是,此构建过程支持按需代码解密。这种构建过程在图2b中示出。

与图2a相比,图2b示出了两个额外的构建步骤。首先,“s2s”源到源转换将输入源文件.c转换为输出源文件.c。然后由编译器编译以形成符合图2a的过程的目标文件。然后,该目标文件是一个标记为“补丁”的用于对象到对象变换的输入目标文件,其生成一个或多个输出目标文件。

参考图3可以理解源到源的转换,图3示出了这种过程的一个实施例。特别是,该源到源转换隔离并用标记对待保护的代码进行标记。操作“fibwrapped”标识此代码。另外,在该转换期间,并入了附加代码以帮助处理解密操作。在一些实施例中,可以使用替代的加密过程对待保护的代码模糊化,在这种情况下,解密操作将由合适的替代方案替换。

图4示出了对象到对象转换的实施例。这里输入目标文件fib.s2s.o包含标记“fibwrapped”和“fibwrappedend”,允许对象到对象转换识别待保护的代码。此代码被提取并在目标文件fib.s2s.o中被伪代码替代。可以选择伪代码以类似于真实代码,并且可以是例如垃圾代码、真实代码或看似有意义的代码。在其他实施例中,伪代码可以是随机代码。修改的目标文件fib.s2s.o可以被认为是第一个输出目标文件。

此外,对象到对象的转换可以生成中间源文件fib.shellcode.c。该中间源文件通过使用与源到源转换期间注入的解密操作相匹配的加密操作和给予的秘密密钥,对待保护的代码加密。秘密密钥可以是预定义的,或者可以被定义为使得其可以在对象到对象转换期间或在其他时间被导出。加密操作可以用可能较弱的模糊处理进行替换,以便使开销和潜在的性能损失最小化。

在对象到对象转换期间编译中间源文件,以生成第二个输出目标文件,在图4中被称为“fib.shellcode.o”。第二个目标文件在一个数据区域中携带加密的或其模糊化的待保护代码。

随后可以合并第一个和第二个目标文件以形成单个合并的输出目标文件,尽管不是必须在所有实施例中都需要此合并。以这种方式,可以在用作对象到对象变换的输入目标文件和该处理输出的目标文件之间实现一对一的关系。目标文件合并的方法将根据工具链而变化。在一些示例中,可以开发coff格式解析器,并且该过程可以涉及读取两个目标文件,根据microsoftcoff规范对其进行合并,并将合并文件写回磁盘。在其他实施例中,可能存在用于执行此合并的工具链提供的工具。

然后,可以将由图2b、图3和图4的过程生成的目标文件传递给积分器/链接器以进行链接。积分器不需要采取进一步措施来确保按需解密是可行的,并且不需要执行任何后链接过程。此外,由于传递给积分器的代码已经被加密,因此禁止在此阶段对库进行静态分析,提高了代码的安全性。

图5示出了在运行软件时随后执行的按需解密的过程。首先,在步骤s51获得最终的.bin二进制包装器,和可以被恢复的相关功能代码(即已被保护的代码)。这在步骤s52解密,然后在步骤s53修补到其源位置,替换位于那里的伪代码。然后在步骤s54运行程序。

随后,在步骤s55取消修补功能代码,再次从静态分析中使该代码模糊化。

在修补步骤s53期间,可以保留某些区域,特别是在加密完成之后被链接器修改的区域。下面将参考图6至8更详细地描述实施例的过程。在链接步骤,该链接器修改代码,将call指令中的offsets更新为相关的目标函数。由于这不能在加密代码中预先计算,在以下参考图6到图8描述的这种方法中,可以预期,这些区域在加密之前被识别,然后被保存,使得修补后的结果是适当、正确的代码。另一种方法可能涉及模糊处理obf的过程及其对称的unobf,其将与链接器一起工作,使得link(区域)=unobf(link(obf(区域));这种替代方案可以避免保留区域的要求。

如上所述,一些优选实施例的进一步细节在图6至图8中示出。此处指出,重定位过程可能需要未改变的代码。这种重定位过程可以在链接过程中以及加载程序时发生。为了避免干扰该过程,在用于重定位方向的对象到对象转换的区域中,可以排除伪代码的替换。特别地,用于重定位方向的区域可以是重定位命令所针对的区域。

图6示出了一个实施例。输入目标文件中的原始“普通”代码包括两个突出显示的区域,这两个区域是重定位操作的目标。伪代码被修改,使得这些区域不被替换,并且这些区域中的值保持不变。

然后可以生成掩码,以确保在重定位期间提供给该区域的任何数据在运行时的按需解密过程期间不被覆盖。可以通过比较(解密的)待保护代码和输出目标文件内的等效区域来生成该掩码。这在图7中示出;一个xor操作标识两组代码的相同位置,从而指示未进行替换的位置。

在链接和加载过程中发生重定位,如图8所示。然后使用掩码,以确保在按需解密过程中,通过禁止将已被保护的代码修补到为此类重定位保留的区域,这些重定位仍然有效。

上述各种方法可以由计算机程序实现。该计算机程序可以包括计算机代码,该计算机代码被布置成指示计算机执行上述各种方法中的一个或多个功能。可以将计算机程序和/或用于执行这些方法的代码提供给一个或多个计算机可读介质上的一个装置,例如一台计算机,或者更一般地,一个计算机程序产品。计算机可读介质可以是暂时的或非暂时的。一个或多个计算机可读介质可以是,例如电子、磁、光、电磁、红外或半导体系统,或用于数据传输的传播介质,例如用于通过因特网下载代码。或者,一个或多个计算机可读介质可以采用一个或多个物理计算机可读介质的形式,例如半导体或固态存储器、磁带、可移动计算机磁盘、随机存取存储器(ram)、只读存储器(rom)、刚性磁盘和光盘,例如cd-rom,cd-r/w或dvd。

在一个实施例中,这里描述的模块、组件和其他特征(例如与图1相关的控制单元110)可以实现为分立组件或集成在诸如asics、fpga、dsp或类似设备的硬件组件的功能中,作为个性化服务器的一部分。

“硬件组件”是能够执行某些操作的有形(例如非暂时性)物理组件(例如一组单个或多个处理器),该物理组件可以以特定物理方式配置或布置。硬件组件可以包括永久配置为执行某些操作的专用电路或逻辑。硬件组件可以是或包括专用处理器,例如现场可编程门阵列(fpga)或asic。硬件组件还可以包括由软件临时配置以执行某些操作的可编程逻辑或电路。

因此,短语“硬件组件”应该被理解为包含可以物理构造、永久配置(例如硬接线)或临时配置(例如编程),以便以某种方式操作或执行所描述的某些操作的有形实体。

此外,模块和组件可以实现为硬件设备内的固件或功能电路。此外,模块和组件能够以硬件设备和软件组件的任何组合来实现,或者仅以软件(例如存储在或以其他方式体现在机器可读介质或传输介质中的代码)来实现。

除非另外特别说明,否则从以下讨论中,应当理解在整个说明书中,利用诸如“接收”、“确定”、“比较”、“启用”、“维护”、“识别”等术语,是指计算机系统或类似电子计算设备的动作和过程,其将表示为计算机系统的寄存器和存储器内的物理(电子)量的数据,操纵和转换为类似地表示为计算机系统存储器或寄存器或其他此类信息存储、传输或显示设备内物理量的数据。

应理解,以上说明旨在说明性而并非限制性的。在阅读和理解以上说明书后,许多其他实施方式对于本领域技术人员而言将是显而易见的。尽管已经参考特定实施例描述了本发明,但是需要认识到本发明不限于所描述的实施例,而可以在所附权利要求的精神和范围内通过修改和变更来实践。

相应的,说明书和附图应被视为具有说明性意义而并非限制性意义。因此,本发明的范围应该参考所附权利要求以及这些权利要求所赋予的等同物的全部范围来确定。

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