CN117633729A - 用于通过执行路径多样性来增加软件代码安全性的方法和装置 - Google Patents

用于通过执行路径多样性来增加软件代码安全性的方法和装置 Download PDF

Info

Publication number
CN117633729A
CN117633729A CN202311128829.5A CN202311128829A CN117633729A CN 117633729 A CN117633729 A CN 117633729A CN 202311128829 A CN202311128829 A CN 202311128829A CN 117633729 A CN117633729 A CN 117633729A
Authority
CN
China
Prior art keywords
program state
execution
code
software
elements
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202311128829.5A
Other languages
English (en)
Inventor
P·米尔瓦尔德-斯塔德勒
M·普林格
L·劳赫
W·舍赫尔
D·奥格尔维
M·费舍尔
I·纳吉
F·毛利
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Irdeto BV
Original Assignee
Irdeto BV
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Irdeto BV filed Critical Irdeto BV
Publication of CN117633729A publication Critical patent/CN117633729A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • G06F21/54Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/35Creation or generation of source code model driven

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Storage Device Security (AREA)

Abstract

一种用于创建安全软件代码的系统和方法。原始代码被处理以确定存储器状态,所述存储器状态在代码的执行期间是动态的。代码的所选函数被复制并且被放置在并行的替代控制路径中,以便创建具有增加的路径多样性的受保护代码。在受保护代码的执行期间,存储器的状态或从其导出的变量被使用以选择替代路径中的一个。

Description

用于通过执行路径多样性来增加软件代码安全性的方法和 装置
背景技术
已知各种机制用于增加软件的安全性。例如,软件可以在防篡改硬件中执行,或者软件可以以加密的形式存储,并且仅在运行时被解密。然而,在许多情形下,诸如机顶盒、移动电话和个人计算机之类的硬件设备处于可能是潜在攻击者的用户的完全控制下。这已经产生了“白盒”软件保护的领域,在其中,假定潜在攻击者具有对执行软件的完全访问。
在白盒软件保护中,使用各种混淆技术来使代码变得复杂,并因此使攻击者难以分析和侵入(hack)。例如,可以使用“变换”的概念。变换仅仅是在代码内以可以在执行期间被逆转(reverse)的方式做出的代替(substitution)。“路径多样性”是另一种白盒软件混淆技术,它使分析和修改可执行二进制文件(executable binary)变得更加困难。传统路径多样性技术的目标是从一个指令序列创建多个替代的、但功能上等效的执行路径。路径的选择是依赖于变量(在本文中被称为“决策值”)而做出的。作为结果,为了理解软件的控制流,必须分析多个可能的执行路径,并且必须建立它们的功能等效性(equivalence)。
例如,在其中GetPassword()调用函数ValidatePassword()的工作流中,攻击者可以篡改ValidatePassword()来获得批准的假密码(false password)。由于ValidatePassword()是对软件安全性至关重要的指令的序列,所以软件开发者可以选择复制函数ValidatePassword(),并且基于条件(例如,按照PC系统时钟的一年中的月份,或者CPU时间戳/循环计数器)来决定将执行ValidatePassword()的哪个实例。在使用月份作为条件的情况下,将使得对于攻击者而言,以提供该程序的正确操作的方式来定位和拼凑(patch)所有可能的路径变得更加困难。另外,攻击者可能需要几个月来拼凑所有路径。例如,攻击者可能会错过替代的代码路径,并且在条件已经改变(例如,月份已经改变)之后,被破解的可执行文件将变得不起作用。
使用CPU时间戳/循环计数器(模3(modulo 3))作为路径选择条件可以导致对代码路径的看似随机的选择,并且由于混淆技术,所复制的代码的等效性对于攻击者来说可能不是很明显的,因此增加了成功地攻击代码所需的努力。代码路径多样性技术不限于函数的复制,而是可以复制任何指令序列或基本块。
可以采用不同的策略来创建路径多样性。例如,可以使路径依赖于:
·随机值(例如,借助于PRNG),
·时间段(例如,一周中的每一天执行不同的路径),
·平台配置(例如,基于键盘布局(英语、德语等)执行不同的路径),
·CPU的时间戳(例如,x86 RDTSC指令),
·进程标识符(例如,在可执行文件重新启动之前采取相同的路径)。
所有这些传统策略的局限性在于:获得决策值需要调用公知的指令、函数或系统API(例如,CPUID或RDTSC指令、由C运行时库提供的PRNG、诸如GetSystemTime()、GetKeyboardLayout()、GetProcessId()之类的操作系统API等)。这些函数可以相对容易地被攻击者发现并链接到决策值,从而揭示它们被用于路径依赖。替代地,可以更改这些函数的返回值,以假定期望值(例如,常数或用以探索所有执行路径的所有可能值)。
另外,经常需要二进制程序重写,其中只有原始软件的二进制代码可以用于创建软件的安全版本。使用静态程序分析,通常仅能够获得关于程序状态的有限信息,诸如变量内容。因此,其任务是增加执行路径多样性的用户可能难以在程序状态内找到合适的数据来用作决策值。因此,在现有方法中经常使用用于路径多样性的外部决策值。另外,可供使用的潜在外部决策值的数量经常被限于那些可由已知API访问的值,这些已知API必须针对兼容性和可变性被验证/测试。当试图扩展保护方法以引入大量替代路径时,这可能会导致问题,这可能最终导致在传统技术中相对少量的决策值的重用。由于这种决策值在数量上被限于已知集合,所以这种决策值可以被攻击者相对容易地发现或预测。
发明内容
本发明的目的是改进这种路径多样性策略的安全性,并且特别地是解决上面讨论的现有方法中存在的问题。
所公开的实现方式利用动态分析(“剖析(profiling)”)来找到具有相对“高可变性”的存储器位置,即,相对频繁地被更新的存储器位置。这些存储器位置然后与代码生成结合使用(例如,通过二进制重写、源代码重写等),作为用于在代码运行时期间从多个执行路径中选择执行路径的决策值。这使得执行路径依赖于程序在执行期间的动态状态。对程序状态的存储器引用通常发生在程序执行期间。另外,通过观察存储器读取访问来检测和辨别存储器访问的目的是困难的。以另一种方式表述,将需要对程序进行仔细且冗长的分析,才能确定哪些存储器访问被用于决策值以及它们如何被使用。因此,所公开的实现方式得到了难以成功地攻击的安全代码。
本发明的一个方面是通过增加原始代码的路径多样性来创建安全可执行代码的方法,所述方法包括:动态地剖析原始代码,以收集与在原始代码的执行期间的原始代码的一个或多个状态指示符的更新特性相关的数据;基于所述动态剖析,从所述一个或多个状态指示符当中选择至少一个状态指示符;以及将至少一个新的替代执行路径添加到原始二进制代码,从而创建安全代码,其中所述至少一个新的替代执行路径的执行依赖于所述至少一个状态指示符的值。
根据本发明的第一方面,提供了一种保护可执行代码的方法,所述方法包括:接收所述可执行代码在执行期间的程序状态的多个元素的使用数据;从接收到的使用数据来标识所述程序状态的具有至少一个预定义更新特性的至少一个元素;以及修改所述可执行代码,以依赖于所述程序状态的所标识的至少一个元素的值在所述可执行代码的至少两个等效执行路径之间进行选择。所述程序状态的元素可以对应于以下各项中的任何(或由以下各项中的任何所定义或通过其访问):主存储器地址;高速缓存存储器地址;帧缓冲器地址;CPU寄存器;GPU寄存器;FPU寄存器;调用堆栈(或其一部分);所述可执行代码的变量;以及与所述可执行代码的符号相关的地址。由此,所述程序状态的元素可以是以下各项中的任何的内容:主存储器地址;高速缓存存储器地址;帧缓冲器地址;CPU寄存器;GPU寄存器;FPU寄存器;调用堆栈(或其一部分);所述可执行代码的变量;以及与所述可执行代码的符号相关的地址。
在一些实施例中,所述修改步骤包括:在所述可执行代码中拷贝来自所述可执行代码的第一执行路径的操作,以在所述可执行代码中生成第二执行路径,其中第二可执行路径在功能上等效于第一执行路径。特别地,第二执行路径中的操作可以被修改,使得第二可执行路径中的中间结果依赖于所述程序状态的所述至少一个元素的值。
在一些进一步的实施例中,第一操作被修改以基于所述程序状态的所述至少一个元素的值来更改所述中间结果,并且第二操作被修改以基于所述程序状态的所述至少一个元素的预期值来补偿所述更改(或逆转或以其他方式撤消其影响)。
在一些实施例中,所述方法进一步包括:接收所述执行路径之一中的第一可调用单元的调用数据。这里,所述标识步骤是(或者包括)从接收到的使用数据和接收到的调用数据来标识所述程序状态的、在所述执行路径的开始处具有所述至少一个预定义更新特性的至少一个元素。所述调用数据可以通过动态地剖析所述可执行代码来生成。
类似地,在一些实施例中,所述使用数据是通过动态地剖析所述可执行代码来生成的。这种剖析可以与用于生成调用数据的剖析相同。
在一些进一步的实施例中,动态地剖析包括(或包含):收集执行期间的所述程序状态的多个快照。所述多个快照可以基于时间被周期性地收集。附加地或替代地,所述多个快照可以基于(或响应于)事件的发生被收集。事件可以包括设备(或硬件)事件、输入事件、定时器事件等等中的任何。
在一些实施例中,所述使用数据包括在所述可执行代码的多个执行实例期间生成的使用数据。所述使用数据可以包括多个使用数据集,每个使用数据集对应于在相应的执行环境中对执行期间的所述程序状态的所述多个元素的使用。
在一些实施例中,所述使用数据包括针对所述程序状态的所述多个元素中的每一个的一个或多个度量(metric)。度量可以是以下各项中的任何:在执行期间的所述程序状态的元素的更新频率的量度(measure);在执行期间的所述程序状态的元素所取的值的范围的量度;在执行期间的所述程序状态的元素所取的值的变动(variance)的量度;在执行期间的所述程序状态的元素的更新次数;在执行期间的所述程序状态的元素所取的值。所述预定义更新特性可以要求所述程序状态的元素至少具有阈值水平的度量。
在一些实施例中,所述预定义更新特性指定以下各项中的任何:更新频率;所述程序状态的元素所取的值的随机性的量度;所述程序状态的元素所取的值的熵(entropy)的量度;所述程序状态的元素所取的值的变动。
根据本发明的第二方面,提供了一种装置,其被布置成执行上面讨论的第一方面(或其任何实施例)的方法中的任何。特别地,提供了一种用于保护可执行代码的保护系统。所述保护系统包括一个或多个处理器,其被配置成:接收所述可执行代码在执行期间的程序状态的多个元素的使用数据;从接收到的使用数据来标识所述程序状态的具有至少一个预定义更新特性的至少一个元素;以及修改所述可执行代码,以依赖于所述程序状态的所标识的至少一个元素的值在所述可执行代码的至少两个等效执行路径之间进行选择。所述程序状态的元素可以对应于以下各项中的任何(或由以下各项中的任何所定义或通过其访问):主存储器地址;高速缓存存储器地址;帧缓冲器地址;CPU寄存器;GPU寄存器;FPU寄存器;调用堆栈(或其一部分);所述可执行代码的变量;以及与所述可执行代码的符号相关的地址。由此,所述程序状态的元素可以是以下各项中的任何的内容:主存储器地址;高速缓存存储器地址;帧缓冲器地址;CPU寄存器;GPU寄存器;FPU寄存器;调用堆栈(或其一部分);所述可执行代码的变量;以及与所述可执行代码的符号相关的地址。
根据本发明的第三方面,提供了一种计算机程序,所述计算机程序在由一个或多个处理器执行时使得所述一个或多个处理器执行第一方面(或其任何实施例)的方法。所述计算机程序可以被存储在非暂时性计算机可读介质上。
附图说明
现在将仅以示例的方式关于附图来描述本发明的实施例,在附图中:
图1示意性地图示了计算机系统100的示例;
图2a示意性地图示了根据本发明的一些实施例的示例系统200;
图2b示意性地图示了根据本发明的一些实施例的用于保护软件项目的场景;
图2c示意性地图示了包括两个替代执行路径的示例软件项目(或可执行文件);
图3是图示了根据本发明的一些实施例的操作保护系统的示例方法的流程图;
图4是根据所公开的实现方式的从原始代码创建安全代码的过程的流程图;
图5是根据所公开的实现方式的安全软件中的多样化代码流路径的示意性表示。
具体实施方式
在以下描述以及附图中,描述了本发明的某些实施例。然而,将领会的是,本发明不限于所描述的实施例,并且一些实施例可以不包括下面描述的所有特征。然而,将明显的是,在不脱离所附权利要求中阐述的本发明的更宽泛的精神和范围的情况下,可以在本文中进行各种修改和改变。
图1示意性地图示了计算机系统100的示例。系统100包括计算机102。计算机102包括:存储介质104、存储器106、处理器108、接口110、用户输出接口112、用户输入接口114和网络接口116,它们全部通过一个或多个通信总线118链接在一起。
存储介质104可以是任何形式的非易失性数据存储设备,诸如硬盘驱动器、磁盘、光盘、ROM等中的一个或多个。存储介质104可以存储供处理器108执行以便使计算机102起作用的操作系统。存储介质104还可以存储一个或多个计算机程序(或软件或指令或代码)。
存储器106可以是适合于存储数据和/或计算机程序(或软件或指令或代码)的任何随机存取存储器(存储单元或易失性存储介质)。
处理器108可以是适合于执行一个或多个计算机程序(诸如,存储在存储介质104上和/或存储器106中的那些)的任何数据处理单元,这些计算机程序中的一些可以是根据本发明的实施例的计算机程序,或者是在由处理器108执行时使得处理器108实行根据本发明的实施例的方法并且将系统100配置成根据本发明的实施例的系统的计算机程序。处理器108可以包括单个数据处理单元、或并行地或者彼此协作地操作的多个数据处理单元。在实行本发明的实施例的数据处理操作时,处理器108可以将数据存储到存储介质104和/或存储器106,和/或从存储介质104和/或存储器106读取数据。
接口110可以是用于提供去往设备122的接口的任何单元,设备122在计算机102外部或者可从计算机102移除。设备122可以是数据存储设备,例如光盘、磁盘、固态存储设备等中的一个或多个。设备122可以具有处理能力——例如,该设备可以是智能卡。因此,接口110可以根据它从处理器108接收到的一个或多个命令来从设备122访问数据、或者向设备122提供数据、或者与设备122对接。
用户输入接口114被布置成接收来自系统100的用户或操作者的输入。用户经由系统100的连接到用户输入接口114或者与用户输入接口114通信的一个或多个输入设备(诸如,鼠标(或其他定点设备)126和/或键盘124)来提供该输入。然而,将领会的是,用户可以经由一个或多个附加的或替代的输入设备(诸如,触摸屏)向计算机102提供输入。计算机102可以将经由用户输入接口114从输入设备接收到的输入存储在存储器106中,以供处理器108随后访问和处理,或者可以将其直接传递给处理器108,使得处理器108可以相应地对用户输入做出响应入。
用户输出接口112被布置成向系统100的用户或操作者提供图形/视觉和/或听觉输出。由此,处理器108可以被布置成指令用户输出接口112来形成表示期望图形输出的图像/视频信号,并且将该信号提供给系统100的连接到用户输出接口112的监测器(或屏幕或显示单元)120。附加地或替代地,处理器108可以被布置成指令用户输出接口112来形成表示期望音频输出的音频信号,并且将该信号提供给系统100的连接到用户输出接口112的一个或多个扬声器121。
最后,网络接口116提供用于使计算机102从一个或多个数据通信网络下载数据和/或向一个或多个数据通信网络上传数据的功能。
将领会的是,在图1中图示并且在上面描述的系统100的架构仅仅是示例性的,并且在本发明的实施例中可以使用具有不同架构(例如,具有比图1中所示的组件更少的组件、或者与图1中所示的组件相比具有附加的组件和/或替代的组件)的其他计算机系统100。作为示例,计算机系统100可以包括以下各项中的一个或多个:个人计算机;服务器计算机;移动电话;平板设备;膝上型电脑;电视机;机顶盒;游戏控制台;其他移动设备或消费电子设备;等等。
图2a示意性地图示了根据本发明的一些实施例的示例系统200。系统200包括计算机系统(或客户端系统或用户系统)210、保护系统220和网络270。
总的来说,计算机系统210被布置成执行或处理软件项目240。软件项目240是受保护的(或安全的)软件项目——已经被应用于软件项目240(或软件项目240所并入或使用)的“保护”性质将在稍后更详细地描述。保护系统220负责基于初始软件项目250来生成受保护软件项目240。如将变得明显的那样,系统200使得能够保护初始软件项目250,以使得可以在计算机系统210上执行所得到的受保护软件项目240。
计算机系统210、保护系统220可以被布置成通过或经由网络270彼此通信。网络270可以是适合于从计算机系统210向保护系统220传输或传送数据(并且反之亦然)的任何种类的网络。例如,网络270可以包括以下各项中的一个或多个:局域网、广域网、城域网、互联网、无线通信网络、线缆网络、数字广播网络、卫星通信网络、电话网络等。计算机系统210和保护系统220可以经由任何合适的通信机制/协议在网络270上进行通信,以便彼此传送数据。然而,将领会的是,其他通信场景也是可能的。
虽然图2a图示了单个计算机系统210和单个保护系统220,但是将领会的是,可以有多个计算机系统210和/或多个保护系统220,并且为了便于说明,图2a已经被简化。
计算机系统210和保护系统220可以各自是或者可以各自包括如上面关于图1所描述的一个或多个计算机系统100。例如,计算机系统210可以是个人计算机、服务器计算机、膝上型电脑、移动电话、平板计算机、电视机等。类似地,保护系统220可以例如包括一个或多个服务器计算机。
保护系统220可以由分离的实体来操作,或者可以由同一实体来操作。
计算机系统210的操作者可以是攻击者,因为该操作者可能希望针对在计算机系统210上执行的软件项目发起攻击(或者基于或使用该软件项目发起攻击)。例如:(a)软件项目可能包含或者生成攻击者希望经由该攻击获得的秘密信息(诸如,一个或多个密码学密钥、一个或多个秘密密钥、其他用户的数据等);(b)攻击者可能试图使用该软件项目(以该软件项目的创建者最初没有意图(intent)或授权的方式)来实现攻击者无权享有或未经授权的功能性,诸如通过规避(circumventing)或阻挠(thwarting)安全性检查;(c)攻击者可能希望实现在该软件项目的情况下最初没有意图的新的/替代的功能性;(d)攻击者可能希望使用该软件项目来试图从一个或多个服务器(例如,托管与提供或包括该软件项目的网页相关联的网站的服务器)获得对功能性或数据的未经授权的访问;等等。
所谓的“白盒”攻击环境是针对软件项目的执行的攻击模型,其中该模型标识攻击者具有如下更详细地描述的各种能力(即,攻击者可以执行某些动作/操作,并且有权访问某些数据)。因此,如果攻击者当软件项目在特定执行环境中(例如,使用特定计算机/处理器等)被实际执行时将具有那些能力,那么可以说该软件项目正在“白盒”环境中执行。在白盒攻击环境中,软件项目的攻击者被假定为具有对正在被操作的数据(包括中间值)、存储器内容以及软件项目的执行/进程/控制流的完全访问和可见性。此外,在白盒攻击环境中,攻击者被假定为能够修改正在被操作的数据、存储器内容以及软件项目的执行/进程/控制流,例如通过使用调试器——以这种方式,攻击者可以对软件项目进行实验并试图操纵软件项目的操作,其目的是规避最初所意图的功能性和/或标识秘密信息和/或用于其他目的。
然而,软件项目可能需要使用或存储或生成秘密信息(例如,一个或多个密码学密钥或标识符),其中该信息需要保持对攻击者隐藏或者不可由攻击者使用/不可由攻击者访问(除了作为软件项目的正确/所意图功能性的一部分);软件项目可能需要基于特定决策逻辑来执行代码的不同部分,其中重要的是要确保攻击者不能够强迫该软件执行代码的一个部分、而不是与决策逻辑相矛盾的代码的另一个部分;等等。计算机系统210的设置、配置和能力对于软件项目的提供者来说不一定是已知的(或完全已知的),和/或不可由软件项目的提供者控制(或完全控制),并且因此可以假定软件项目可以最终在白盒攻击环境中被执行。计算机系统210的用户可以查看、监测和修改这种软件项目的执行,从而允许攻击者拷贝和修改软件项目和/或其数据或控制流,以尝试针对软件项目发起攻击/使用软件项目发起攻击。这就是为什么不是在计算机系统210上执行初始软件项目250,而是初始软件项目250具有由保护系统220对其应用的一个或多个软件保护技术,从而得到受保护软件项目240。在计算机系统210上执行的正是该受保护软件项目240。为了生成受保护软件项目240而应用的保护技术旨在使攻击者难以对受保护软件项目240实施成功的攻击,和/或旨在减少/减轻攻击者的这种攻击的后果——即,所述保护技术旨在针对白盒攻击环境来保护初始软件项目250。
保护系统220被布置成将一个或多个“保护”应用于软件项目250,从而生成并输出受保护软件项目240。将领会的是,可以在软件项目250上使用多个不同的保护系统220以应用不同的保护。因此,保护系统被布置成将一个或多个“保护”应用于初始软件项目250,或者应用于已经具有这些保护中的一个或多个的软件项目250的版本。
初始软件项目250和受保护软件项目240可以各自包括可存储为一个或多个文件的一个或多个计算机程序(或软件或模块)。每个文件可以包含或实现一个或多个函数。初始软件项目250和受保护软件项目240可以各自是或者实现一个或多个整个软件应用、或用于软件应用的一个或多个组件(例如,库文件)、或较小的组件(例如,代码片段(codesnippet))。初始软件项目250可以包括用一个或多个语言编写的源代码,这些语言中的一个或多个可以与用于受保护软件项目240的(一个或多个)语言相同,尽管这不是必需的。初始软件项目250和受保护软件项目240可以各自包括编译/可执行代码和/或源代码(或经解释的代码)。初始软件项目250和受保护软件项目240可以包括用于在计算机系统210处作为原生应用(的一部分)执行的编译代码。初始软件项目250和受保护软件项目240可以包括用于在计算机系统210上执行的虚拟机内执行的代码。初始软件项目250和受保护软件项目240可以包括用于在计算机系统210上执行的浏览器内执行的代码(例如,作为webapp、或网页的代码)。
如本文中关于软件项目所使用的术语“代码”指代软件项目的指令/命令。除了代码之外,软件项目(例如,初始软件项目250和受保护软件项目240)还可以包括数据和/或其他资源,使得“代码”的执行(或软件项目的执行)包括执行这些指令/命令中的一些或全部,其中该执行可能潜在地涉及使用数据和/或其他资源中的一些,如果它们存在于软件项目中的话。如本文中关于软件项目所使用的术语“软件元素”指代软件项目的代码和/或其他组件(例如,数据和/或其他资源/资产)。因此,软件项目(或用于软件项目)的软件元素可以包括:(a)软件项目(或用于软件项目)的一段或多段代码(例如,一个或多个指令/命令);和/或(b)软件项目(或用于软件项目)的一段或多段数据或其他资源;和/或(c)一个或多个代码块。
将领会的是,软件项目可以包括一个或多个可调用单元。可调用单元可以被认为是特定类型的上述软件元素(或上述软件元素的子集)。可调用单元通常包括软件项目(或用于软件项目)的一段或多段代码(例如,一个或多个指令/命令)。在一些示例中,可调用单元可以是单个可执行指令或命令。可调用单元通常被布置成可由软件项目中的其他代码来调用(或者可由其他代码调取或以其他方式可以使得被其他代码执行)。换句话说,可调用单元可以是或者包括一个或多个软件例程。将理解的是,本领域中已知存在许多类型的例程,包括(但不限于)子例程、函数、过程、方法、子程序等等。软件例程通常被布置成在被执行时执行一个或多个任务(或提供一个或多个功能元素)。还将领会的是,可调用单元可以包括一个或多个另外的可调用单元(或者定义一个或多个另外的可调用单元或以其他方式使得一个或多个另外的可调用单元被实例化)。
图2b示意性地图示了根据本发明的一些实施例的场景。在所图示的场景中,需要通过增加路径多样性来保护初始软件项目250(在这里,以二进制可执行文件或可执行代码的形式)。将理解的是,软件项目250通常是由用户运行来执行计算任务的程序(或程序的一部分)。
如图2b中所图示,可执行代码(或二进制可执行文件)250作为多个实例260来运行(或执行)。每个实例在计算机系统(诸如上面描述的计算机系统100)上运行。为了易于理解,图2a示出了在单个计算机系统100上运行的实例260。然而,如下面简要地描述,一个或多个实例260可以在具有不同计算机架构(和/或硬件配置和/或软件配置)的不同计算机系统上运行。
本领域技术人员将理解,可执行代码250的运行(或执行)实例260将具有程序状态265。程序状态265在实例260的执行期间被更新,并且包括实例260在给定时间点处的数据、指令和其他存储值。程序状态265可以被理解为在给定时间点处对实例260可用的所有存储位置的内容。
程序状态265可以被认为包括多个元素。可执行代码可访问(或可到达或可读取)程序状态的元素。可以在系统级别处定义程序状态的元素。特别地,元素可以由一个或多个主存储器(诸如RAM)地址(或一系列存储器地址);一个或多个高速缓存存储器地址(或一系列高速缓存存储器地址);一个或多个帧缓冲器地址(或一系列帧缓冲器存储器地址);一个或多个CPU寄存器;一个或多个GPU寄存器;一个或多个FPU寄存器;调用堆栈(或调用堆栈的一部分)等等中的任何来定义。由此,将领会的是,由这种地址(或寄存器或调用堆栈部分)定义的状态元素可以被认为是(或者包括)这种地址(或寄存器或调用堆栈部分)的内容。换句话说,元素可以被定义为以下各项中的任何的内容:一个或多个主存储器(诸如RAM)地址(或一系列存储器地址);一个或多个高速缓存存储器地址(或一系列高速缓存存储器地址);一个或多个帧缓冲器地址(或一系列帧缓冲器存储器地址);一个或多个CPU寄存器;一个或多个GPU寄存器;一个或多个FPU寄存器;调用堆栈(或调用堆栈的一部分)等等。附加地或替代地,可以在程序级别处定义程序状态。特别地,元素可以由可执行代码的变量(或其他符号)来定义。由此,将领会的是,由变量定义的状态元素可以被认为是(或者包括)这种变量的内容。换句话说,元素可以被定义为可执行代码的变量(或其他符号)的内容。将理解的是,在程序状态元素之间可能存在重叠。例如,在元素由变量定义的情况下,这种元素可以被定义为可执行代码的符号表中的特定符号(即,用于该变量的符号)。这种符号将通常还被链接到一个或多个主存储器地址(或以其他方式关于一个或多个主存储器地址被定义)。这种主存储器地址本身可以被认为定义了程序状态的元素。由此,程序状态的元素也可以对应于程序状态的另一元素的一部分。
还将理解的是,程序状态的值在可执行代码的执行期间改变。因此,程序状态的给定元素的值可以在可执行代码的执行期间改变。在所图示的场景中,针对每个实例260收集程序状态265的多个元素的使用数据267。程序状态的元素的使用数据跟踪(或表示或涉及)程序状态265的元素在可执行代码的执行期间的改变。换句话说,使用数据267涉及该元素在实例260期间(或者在实例的执行期间)的改变。使用数据可以包括程序状态的元素的一个或多个度量。这种度量可以涉及以下各项中的任何:在实例期间元素的更新频率;在实例期间元素所取的值的范围;在实例期间元素所取的值的变动;在实例期间对元素的更新(或改变)的次数;在实例期间对元素的读取的次数;在实例期间对元素的写入的次数;等等。
在图2b中所图示的场景中,执行相应实例260的计算机系统(或多个系统)被布置成记录(或收集或以其他方式存储)相应实例260的程序状态265的多个元素的使用数据。程序状态265的元素的使用数据267可以被认为是表征(至少部分地表征)在相应实例260的执行期间元素的交互(或使用)的数据。例如,使用数据可以是(或者包括)表示对程序状态的元素的访问(或访问模式)的数据。通常,使用数据包括对程序状态的元素的访问的一个或多个度量的值。
度量可以包括以下各项中的任何一个或多个:在执行期间的程序状态的元素的更新频率的量度;在执行期间的程序状态的元素所取的值的范围;在执行期间的程序状态的元素所取的值的变动的量度;在执行期间对程序状态的元素的更新的次数;在执行期间的程序状态的元素所取的值;在执行期间对元素的值的更新的时间戳;更新之间的时间间隔;更新事件的类型,等等。
将领会的是,这种使用数据267可以形成通常被称为剖析数据的一部分。由此,在一些实施例中,当在计算机系统100上执行实例260时,可以通过剖析(或动态地剖析)软件项目250来生成(或收集)使用数据267。这种剖析也可以被称为动态程序分析。用于执行这种动态剖析的剖析工具的示例包括:Intel Vtune、Valgrind、perf tools、Intel PIN、DynamoRIO等等。如本领域技术人员将理解的,存在用于执行这种动态剖析的众多方式,我们在本文中将不详细讨论这些方式。然而,我们注意到,动态剖析的一种方式将包括收集执行期间的程序状态的多个快照。这种快照可以基于时间被周期性地收集或者基于预定义事件的发生被收集。然后,可以直接分析所收集的快照,以标识各种使用数据,包括元素更新频率、元素所取的值的范围等等。
所图示的保护系统220包括元素标识模块222和代码修改模块224。保护系统220被布置成从每个计算机系统100(或实例260)接收使用数据267。将领会的是,可以直接从计算机系统100接收针对给定执行(或实例260)的使用数据。例如,可执行文件250可以被修改(或者被检测(instrument)),使得实例260向保护系统220发送使用数据267。替代地,计算机系统可以运行另外的可执行文件(或帮助程序),该另外的可执行文件向保护系统220发送使用数据267(或使其可用)。同等地,将领会的是,保护系统220可以间接地接收使用数据。例如,使用数据可以被收集(或聚集或以其他方式)存储在另一系统上,保护系统220可以在需要时从该另一系统访问使用数据267。
元素标识模块222被布置成从接收到的使用数据来标识(或选择)程序状态的至少一个元素,以用于在可执行代码250的执行路径之间进行选择。通常,元素标识模块222被布置成使用一个或多个更新特性226来标识(或选择)程序状态的元素。换句话说,元素标识模块222被布置成从接收到的使用数据来标识程序状态的具有至少一个预定义更新特性的至少一个元素。
如下面将简要地描述的,可以由保护系统220的用户根据要应用于初始软件项目250的所需保护(或安全性)级别来预定义更新特性(或多个特性)。更新特性可以是(或者包括)对如上所讨论的一个或多个度量的要求。将理解的是,更新特性可以是(或者包括)绝对要求。例如,更新特性可以指定(或要求)度量高于(或低于)某个阈值。更新特性可以指定(或要求)度量等于某个值(或在某个值的指定范围内)。替代地,更新特性可以是(或者包括)相对要求。例如,更新要求可以指定选择具有给定度量的最大(或最小)值的程序状态元素(与其他程序状态元素相比)。更新特性可以指定(或要求)程序状态元素具有在指定的最高(top)(或最低(bottom))百分位数中的度量值,等等。
预定义更新特性可以指定以下各项中的任何:阈值更新频率;程序状态的元素所取的值的随机性的阈值量度;程序状态的元素所取的值的熵的阈值量度;程序状态的元素所取的值的阈值变动;等等。如上所讨论,这种阈值可以被指定为绝对值或相对项。
代码修改模块224被布置成修改可执行代码250,以依赖于程序状态的所标识的至少一个元素的值在可执行代码的至少两个等效执行路径之间进行选择。以这种方式,可执行代码(或软件项目)的安全(或受保护)版本240被生成作为经修改的可执行代码。
下面关于图2c简要地描述了具有替代(或等效)执行路径的软件项目250;240的示例。然而,将领会的是,在一些情况下,初始软件项目250(或可执行代码)将已经具有至少两个等效执行路径。这样,替代执行路径可能已经在软件项目250的初始编程期间被引入。同等地,这种替代执行路径可能已经由被布置成引入替代执行路径作为应用另一“保护”的一部分的分离的保护系统(诸如关于图2a所描述的)所引入。
在一些实施例中,代码修改模块224被布置成将一个或多个替代执行路径引入(或包括或插入)到软件项目250中。例如,代码修改模块224可以被布置成在软件项目250中拷贝来自软件项目250的第一执行路径的操作,以在软件项目250中生成第二执行路径,其中第二可执行路径在功能上等效于第一执行路径。通常,代码修改模型224被布置成操作(或修改)二进制可执行代码,诸如在软件项目250是以二进制可执行文件形式的情况下。
将领会的是,可以使用用于增加软件项目中的路径多样性的已知技术来生成替代执行路径。这种已知技术的示例包括:Fred Cohen.“Operating System Protectionthrough Program Evolution”,Computers and Security,12(6):第565-584页,1993年10月,其从基本实现方式开始讨论了产生语义上等效但形态上不同的代码的技术;StephanieForrest,Anil Somayaji和David Ackley.“Building Diverse Computer Systems”,Proceedings of the Sixth Workshop on Hot Topics in Operating Systems,第67-72页,1997年,其讨论了随机添加或删除非功能代码以及将代码重新排序作为用于构造路径多样性的变换;以及Christian Collberg,Clark Thomborson和Douglas Low.“ATaxonomyof Obfuscating Transformations”,Technical Report 148,Department of ComputerSciences,The University of Auckland,1997年,其提供了混淆变换的分类法(taxonomy)并提供了路径流多样性构造的示例。
将领会的是,可以基于被标识并用于在等效执行路径之间进行选择的程序状态元素(或多个元素)的属性或特性来调整由上述可执行代码的修改所给出的改进安全性的级别。例如,在可能采取不同的执行路径的情况下,程序状态元素在执行期间具有(或显示)的可变性(或熵或随机性)越多,受保护软件项目240的总体控制流将对攻击者来说就越不可预测。此外,使用被频繁访问的程序状态元素以在执行路径之间进行选择将增加关于哪个元素正在确定执行路径选择的混淆,因为对该元素的附加访问将仅仅是许多访问当中的一个。
图2c示意性地图示了包括两个替代执行路径360;370的示例软件项目(或可执行文件)250;240。在图2c中,图示了输入(或输入集)310和输出(或输出集)315,并且示例可执行文件被布置成从输入集310转到(go to)输出集315。可执行文件被布置成通过对输入状态执行多个操作351、352、353、354、356、357来从输入集310转到输出集315。特别地,所图示的可执行文件可以遵循第一执行路径360,第一执行路径360包括对输入集310执行操作351,接着是操作352、操作353和操作354,以产生输出集315。替代地,所图示的可执行文件可以遵循第二执行路径370,第二执行路径370包括对输入集310执行操作351,接着是操作355、操作356、操作357和操作354,以产生输出集315。
以这种方式,将理解的是,第一执行路径360和第二执行路径370是替代执行路径。一般地,替代执行路径可以被理解为如下执行路径:所述执行路径对于任意输入均产生与每个其他替代执行路径相同的输出。换句话说,每个替代执行路径在功能上等效于每个其他替代执行路径。
在图2c中所示的示例执行路径360;370中,第一执行路径360包括四个操作,并且第二执行路径370包括五个操作。以这种方式,将理解的是,第一执行路径360的一个或多个操作可能不同于第二执行路径370的一个或多个对应操作。然而,将领会的是,在一些实施例中,两个替代执行路径360;370可以均包括相同的操作。一个执行路径的操作可以是另一执行路径的操作的复制品(duplicate),使得相同操作的多个副本出现在可执行代码中。以这种方式,攻击者可能会发现难以确定哪个操作副本由给定执行路径所使用。
在一些实施例中,软件代码混淆技术(诸如白盒混淆技术)可以用于混淆操作副本中的一个或多个。以这种方式,攻击者可能会发现甚至难以标识出操作和操作副本是对应的并且它们本身在功能上是等效的。由此,攻击者可能会发现难以单独通过检查来标识两个替代执行路径在功能上是等效的。这些影响中的每一个都意味着:为了对可执行文件实施攻击而修改操作的攻击者将无法简单地将修改拷贝到该操作的所有副本。
将领会的是,为了易于理解,简化了上述示例。虽然所示的执行路径从输入转到输出,但是在一些实施例中,这种执行路径可能仅仅是可执行文件的实例的总体执行路径(或流)的一部分。由此,输入310和输出315可以是实例的中间结果或状态,并且它们本身可以表示去往实例的总体执行路径的其他部分的输入或输出。以这种方式,将领会的是,对于通过实例或可执行文件的总体执行路径的不同部分,可以存在多组替代执行路径。
类似地,本文中所提到的操作可以是单个计算或函数,或者可以包括更复杂的表达或可执行代码块。由此,操作可以包括一个或多个软件例程(或指令序列)。将理解的是,本领域中已知有许多类型的例程,包括(但不限于)子例程、函数、过程、方法、子程序等等。软件例程通常被布置成在被执行时实行一个或多个任务(或提供功能性的一个或多个元素)。将理解的是,在一些情况下,操作可以包括单个指令。
以类似的方式,将理解的是,执行路径可以是(或者对应于)如先前所描述的一个或多个可调用单元。由此,在一些实施例中,执行路径可以被认为包括一个或多个可调用单元。执行路径的开始可以被认为是其中执行路径的第一可调用单元被调用的点。将理解的是,即使在执行路径包括(或者对应于)单个可调用单元的情况下,这也同等地适用。
在上面关于图2b所描述的变型实施例中,保护系统220被布置成从每个计算机系统100(或实例260)接收调用(或调取(invocation))数据。可以以与上述使用数据267相同的方式来接收调用数据。在一些情况下,可以接收调用数据和使用数据267,作为剖析数据的一部分。将领会的是,可以使用上面关于使用数据267讨论的动态剖析技术和工具来生成调用数据。
调用数据涉及软件项目250中的一个或多个可调用单元。待接收的调用数据包括在调取了(或调用了)软件项目250的一个或多个可调用单元时由实例收集或生成的数据。调用数据通常对应于(或涉及)可调用单元的调用(或执行)。特别地,调用数据可以包括(或者可以是)表征可调用单元的调用(或执行)的调取统计信息。通常,调用数据作为时间序列(或根据一个或多个时间间隔或周期)而被记录(或收集)。例如,调用数据可以包括可调用单元的每个调用的时间戳(或其他时间标记)。
这里,标识模块被布置成从针对执行路径的第一可调用单元的接收到的调用数据和接收到的使用数据来标识程序状态的具有至少一个预定义更新特性的至少一个元素。特别地,在该变型中,标识模块可以标识(或选择)在执行路径的第一可调用单元所在的点(或执行时间)处具有预定义更新特性的程序状态元素。
将领会的是,在一些情况下,程序状态的特定元素具有仅针对软件项目250的执行的某个部分的预定义特性。例如,执行状态的元素的更新频率可以在执行期间变化。在该变型中,通过考虑执行路径的第一(或初始)可调用单元的调用数据,标识单元可以确保在执行路径的开始处具有预定义更新特征的程序状态元素被标识。换句话说,这允许在执行路径的开始处测量预定义更新特性。这种操作进一步改进了安全性,因为它进一步增加了为了控制执行路径的选择而选择的状态元素与该选择点处的程序流不相关的可能性。
图3是图示了根据本发明的一些实施例的操作保护系统220的示例方法400的流程图。
在步骤402处,接收软件项目250在执行期间的程序状态的多个元素的使用数据。通常,使用数据是从软件项目250的多个实例260来接收的。在一些情况下,使用数据包括多个使用数据集。每个使用数据集对应于在相应执行环境中对执行期间的程序状态的多个元素的使用。由此,使用数据可以表示该多个元素跨多个不同的执行环境(诸如不同的硬件和/或软件平台)的使用。
在步骤404处,基于接收到的使用数据,将程序状态的至少一个元素被标识为具有至少一个预定义更新特性。步骤404可以由标识模块222执行。如上面所讨论,预定义更新特性可以指定以下各项中的任何:阈值更新频率;程序状态的元素所取的值的随机性的阈值量度;程序状态的元素所取的值的熵的阈值量度;程序状态的元素所取的值的阈值变动;等等。这种阈值可以被指定为绝对值或相对项。预定义更新特性226通常由用户(或操作者)来选择,以确保所选程序状态元素的所需随机性被满足,或者程序状态元素与要在其间选择的执行路径之间的相关性的所需缺乏被满足。
在步骤406处,修改软件项目250(通常是以二进制可执行文件形式),以依赖于程序状态的所标识的至少一个元素的值在可执行代码的至少两个等效执行路径之间进行选择。步骤406可以由代码修改模块224执行。步骤406可以包括:修改可执行代码以包括基于第一执行路径的替代第二执行路径。这种修改可以使用上面描述的路径多样性保护技术中的任何来完成。步骤406可以包括:在可执行代码中拷贝来自可执行代码的第一执行路径的操作,以在可执行代码中生成第二执行路径,其中第二可执行路径在功能上等效于第一执行路径。步骤406可以进一步包括:将一个或多个已知的白盒混淆技术应用于等效执行路径中的一个或多个。以这种方式,替代执行路径虽然在功能上等效,但是可以包括不同的可执行代码。这种混淆技术在本领域中是已知的,并且在本文中不作进一步描述。
更新特性
上文和遍及全文描述了更新特性226的各种示例和类型。然而,将领会的是,保护系统220的操作者可以基于被保护的软件项目的性质、可能攻击的性质、所需的安全性级别等等中的任何来选择不同的更新特性。由此,可以根据需要使用来自各种类型的更新特性的各种更新特性。下面列出了有用类型的更新特性的示例。
更新频率特性。这些是与程序状态元素的更新频率相关的特性。它们可以指定以下各项中的任何:元素的更新的直接频率;元素的更新频率的变动(诸如更新频率在执行期间是否大量改变);元素的更新频率在软件项目的不同运行(或执行)之间的变动。通过确保高更新频率或高更新频率可变性,可以确保状态元素对执行路径的选择的不可预测性(或随机性),使得软件对修改或静态分析类型的攻击更有弹性(resilient)。
值可变性特性。这些是与状态元素所取的值的可变性(或随机性)相关的特性。它们可以指定以下各项中的任何:元素所取的值的范围;元素所取的值的数量;元素所取的值的随机性(诸如元素的先前值与元素的随后值之间的相关性)。类似地,通过确保状态元素所取的值在执行期间的高随机性或可变性,可以确保状态元素对执行路径的选择的不可预测性(或随机性),使得软件对修改或静态分析类型的攻击更有弹性。
进程(或实例)依赖性特性。这些是与状态元素的运行到运行(或逐实例)可变性相关的特性。这也可以被认为是状态元素的值对给定实例(或进程)的依赖性水平。它们可以指定以下各项中的任何:跨多个实例的元素所取的值的范围;关于不同实例的元素所取的不同值的数量;跨多个实例的元素所取的值的随机性(诸如先前实例中的元素值与随后实例中的元素值之间的相关性);跨多个实例的元素的启动(start-up)(或初始值)的范围。还将领会的是,这些特性可以包括如下特性:所述特性当可执行代码在同一操作系统环境的不同实例内运行时、诸如在操作系统的重启之后,与状态元素的可变性相关。例如,它们可以指定以下各项中的任何:跨操作系统的多次重启的元素所取的值的范围;关于操作系统的多次重启的元素所取的不同值的数量;跨操作系统的多次重启的元素所取的值的随机性;跨操作系统的多次重启的元素的启动(或初始值)的范围。通过确保高的运行到运行可变性(或进程依赖性),阻碍了试图通过重复运行来分析软件项目的攻击者。同等地,对执行路径的任何恶意修改都可能在随后的运行上失败。
执行环境依赖性特性。这些是当软件项目在具有彼此不同的硬件和/或软件配置的计算机系统上执行时与状态元素的可变性相关的特性。这也可以被认为是状态元素的值对硬件和/或软件配置的依赖性水平。它们可以指定以下各项中的任何:跨多个执行环境的元素所取的值的范围;关于不同执行环境上的不同实例的元素所取的不同值的数量;跨多个执行环境的元素所取的值的随机性;跨多个执行环境的元素的启动(或初始值)的范围。通过确保高执行环境依赖性,当被恶意修改的软件项目在不同的执行环境的情况下执行时,对执行路径的任何恶意修改都可能失败,从而防止攻击者有效地分发被恶意修改的软件项目。
内部进展依赖性特性。这些是与软件项目的内部进展相关的特性。它们可以指定以下各项中的任何:状态元素的值与软件项目的进展量度之间的相关性。例如,在呈现软件时,与用于呈现的墙上时间(wall time)(或用于呈现的处理器时间)相关的状态元素可能是合期望的,这是因为由于呈现任务的高度可变性质,通过软件项目的不同运行通常将会导致在不同的墙上时间(或处理器时间)处进入执行路径。类似地,在计算机游戏或训练系统(诸如飞行模拟器)中,与游戏时间或游戏进展相关的状态元素可能是合期望的,这是因为不同的用户将以不同的速率通过游戏前进。
将领会的是,以上更新特性可以从由如上所讨论的动态剖析工具而使得可用的使用数据来确定。通过一些说明性示例,更新频率特性、值可变性特性、进程(或实例)依赖性特性、执行环境依赖性特性和内部进展依赖性特性可以通过分析包括程序状态快照的用户数据来确定。特别地,可以使用以规则间隔取得的全局变量的存储器快照。计算这些快照之间的差异通常将使得能够标识具有这种特性的元素。进程(或实例)依赖性特性通常可以在进入了实例的函数时从包括调用堆栈上的返回地址的用户数据来标识。值可变性特性通常可以在进入了实例的函数时从寄存器上下文来标识。此外,作为使用数据的一部分以规则的间隔取得的FPU或SIMD上下文的样本也可以用于标识具有特定值可变性特性的状态元素。
类似地,通过从具有不同硬件和/或软件配置的系统100上运行的实例260收集使用数据,可以标识执行环境依赖性特性。将领会的是,这种配置执行环境依赖性特性可以通过来自具有不同硬件和/或软件配置的系统的给定程序状态元素的使用数据之间的比较来标识。这种比较可以指示哪些程序状态元素依赖于硬件和/或软件环境的改变(或与之高度相关)。例如,实例可以使用以下各项在系统100上运行:给定操作系统的不同版本(例如,Windows 10的不同版本或macOS的不同点发布(point releases))、同一操作系统家族的不同代(例如,Windows或macOS的不同主要发布)、或不同操作系统家族(诸如在Windows NT、Windows 10、macOS和openBSD上运行)。类似地,在不同硬件配置上运行的实例可以包括利用共享公共架构的不同GPU和/或不同CPU(例如,不同版本的NVIDIA Tesla GPU)运行的实例。同等地,在不同硬件配置上运行的实例可以包括在不同架构上运行的实例(例如,在arm64、x86_64和POWER9上运行)。图4图示了根据所公开的实现方式的示例的用于从原始代码(或初始软件项目250)创建安全代码(或受保护软件项目240)的另一过程500。如先前所列出,原始代码可以是二进制代码或源代码。在该示例中,原始代码是二进制代码。在步骤1、2和3处,以动态的方式对原始代码的二进制(binary)进行剖析。在步骤1处,接收原始二进制代码。在步骤2处,调试工具或其他检测(instrumentation)工具可以用于在执行期间周期性地收集存储器写入(更新)和其他状态的“快照”。所收集的数据可以包括关于存储器寄存器、调用堆栈内容、以及执行代码的其他动态特征的数据。例如,可以收集时间戳、改变的存储器地址的列表、改变的值等。可以周期性地收集(由时间触发)或者以事件相关的方式收集(由其他事件触发,该其他事件诸如进入函数或基本块、退出具体API调用等)剖析数据“快照”。另外,可以收集执行程序代码的其他状态信息,诸如CPU或FPU寄存器值的内容、调用堆栈内容。将领会的是,在该示例实施例中,该所收集的数据和其他状态信息形成使用数据267。可以仅针对一个程序执行来完成剖析。然而,在该示例中,在3处,可以可选地合并多个运行中的每一个的剖析输出,并且可以分析不同运行中的存储器写入,以确定哪些存储器位置是持续活动的(即,经常改变值)。
在步骤4处,将启发式方法应用于所收集的剖析(或使用)数据,以便确定要用作决策值的候选变量(或程序状态的其他元素)。可以应用各种策略来在潜在的更新存储器位置当中进行选择。例如,可以通过分析在剖析期间获得的日志、提取设备存储器的热图并仅考虑频繁改变的存储器位置或其他状态指示符来选择存储器位置或其他状态指示符。在剖析期间,还有可能推断正在收集的数据的类型。例如,值可以对应于堆存储器(heap memory)地址,或者值可以对应于堆栈地址。要注意的是,程序以某个堆栈开始(该堆栈可能在一个方向上增长),而堆是在运行时在许多地方被获得和创建的。这些地址范围在操作系统中通常是非常有区别的,并且由于地址空间布局随机化,在随后程序执行之间可能是不同的。该信息还可以用于选择程序状态的元素作为候选决策值。堆地址可能是随机的,因此具有跨程序运行的高可变性,但是在进行内是恒定的——这是合期望的属性。
要注意的是,程序状态的元素(或状态指示符)可以包括地址和该地址处的值、CPU寄存器和该CPU寄存器的值、以及FPU寄存器和该FPU寄存器的值。此外,状态指示符可以包括与这些元素中的一个相关的元数据,诸如指示数据何时被记录的时间戳以及指示数据为什么被记录(例如,由于时间间隔的流逝或事件的发生)的数据。元数据还可以是标识用于剖析运行的计算机/配置的ID、剖析运行的ID/计数器等,等等。
在步骤5和6处,基于从步骤3得到的剖析日志和步骤4的随后分析/启发式方法来重写(即,改变)原始代码,从而产生受保护的代码。重写可以包括在步骤5处创建替代代码路径(诸如安全性关键代码路径的复制)以及在步骤6处将所选择的决策值(或程序状态元素)与代码路径相关联,作为针对代码路径的选择条件。要注意的是,替代代码路径可以是彼此的功能等效物(equivalent),并且这种等效性可以通过传统的混淆技术来混淆。例如,变换可以被应用于复制的代码路径,以使得确定复制的代码路径的存在(攻击者可以使用该知识来定位代码的安全部分)变得更加困难。要注意的是,如本文中所使用的短语“复制的代码”包括相同的代码和/或可能具有略微不同的二进制表示的代码变体。另外,复制的代码路径可以在其中具有不同的混淆。
图5图示了根据所公开的实现方式的代码流的示例。在该示例代码路径2000中,选择是基于二进制的存储器位置的。然而,该选择可以基于寄存器、调用堆栈内容等。在该示例的受保护代码中,GetPassword()函数2020前进到ValidatePassword()函数2040a或ValidatePassword()函数2040b或ValidatePassword()函数2040c中的一个,这依赖于从所选存储器位置2060确定或读取的值。ValidatePassword()函数2040a、ValidatePassword()函数2040b和ValidatePassword()函数2040c可以在功能上等效。然而,攻击者将难以确定在任何给定执行实例中正在使用哪一个函数,并且因此代码更加安全。
利用通过剖析导出的知识,选择被复制的实例的条件(“决策值”)可以依赖于程序状态,并且外部条件可以被避免,该外部条件即,不是常规编译器发出的代码的一部分的条件(诸如CPU定时器、API调用等)。这使得安全代码非常难以被成功地攻击,因为攻击者不能够确定决策值的来源。因为决策值是从内部存储器读取获得的——这是程序代码执行中的正常操作,所以难以发现决策值的来源。另外,即使攻击者发现了决策值的来源,攻击者也不能够通过更改决策值以假定期望值来成功地攻击该代码,因为这种改变将可能导致程序的不正确操作。另外,校验和(checksumming)可以用于防止攻击者通过改变选择代码来改变正在读取的值。
在所公开的实现方式中,通过添加用于路径多样性的多个执行路径来重写原始程序代码,尤其是在安全性关键代码区域中。决策值可以是存储器位置的值,或者基于已经被收集的多个存储器位置来计算。例如,决策值可以基于存储器位置1、存储器位置2和存储器位置3。当存储器位置1具有三个位置中的最高值时,决策值可以被计算为1,当存储器位置2具有三个位置中的最高值时,决策值可以被计算为2,并且当存储器位置3具有三个位置中的最高值时,决策值可以被计算为3。值1、2或3可以用于选择三个替代执行路径。任何计算都可以用于单独地或与其他条件相结合地从动态状态指示符导出决策值。
下面示出了根据所公开的实现方式的样本剖析数据结构。
(1)标签(Label):neon::raindropVertices偏移量(offset):2645484第一时间(firstTime):8412895800最后时间(lastTime):15444155900
熵独特值总计2(entropy unique values total 2):0x6c,0x40,
在以下时间戳期间的改变:8412895800,15444155900,
(2)标签:neon::raindropVertices偏移量:1266176第一时间:8412895800最后时间:15444155900
熵独特值总计2:0xad,0x41,
在以下时间戳期间的改变:8412895800,15444155900,
(3)标签:neon::raindropVertices偏移量:1266177第一时间:8412895800最后时间:15444155900
熵独特值总计2:0x91,0xb5,
在以下时间戳期间的改变:8412895800,15444155900,
(4)标签:neon::raindropVertices偏移量:1266178第一时间:8412895800最后时间:15444155900
熵独特值总计2:0xd6,0xa0,
在以下时间戳期间的改变:8412895800,15444155900,
(5)标签:
?s_currentVBufferDataCamera@Gfx2ParticleAccumulationComputeGenerator@neon@@2PAVNeCamera@2@A偏移量:208第一时间:74924274700最后时间:261774418300
熵独特值256:
0xfa,0xb2,0xf2,0x32,0x53,0x13,0xb,0x4b,0x76,0x4c,0x8c,0x64,0xa4,0xe4,0x35,0xc7,0x49,0x17,0xbe,0x3e,0xf1,0x31,0xde,0xb8,0xf8,0x79,0xa2,0xae,0x6e,0xb7,0x91,0x51,0xeb,0x4f,0x98,0x18,0x1a,0x15,0x55,0x30,0xb0,0xa5,0xe7,0xa7,0x9b,0xd4,0x10,0x96,0x44,0xa0,0xed,0x29,0x61,0x1c,0xe3,0xc6,0xc3,0x26,0x66,0xe6,0x6f,0x99,0x19,0x3d,0x2f,0x50,0xca,0xcb,0x2d,0x36,0xbb,0x9c,0xc,0x16,0xc2,0xf9,0x33,0xb4,0xe5,0x3,0xce,0x8a,0xb9,0xf6,0x7a,0x56,0xff,0xdd,0xb5,0x21,0x78,0x38,0xfe,0xea,0xd1,0x5b,0xe,0x9f,0x20,0x77,0xdc,0x58,0x71,0xa3,0x5e,0x23,0x73,0x97,0x7e,0xc5,0x74,0x3b,0xbf,0x40,0x68,0xdb,0x9d,0x84,…
在以下时间戳期间的改变:74924274700,75961305500,76034276300,76050276900,76069278900,77499276700,77555277600,77728302800,77745322400,79056276000,79072277100,79104299200,79121281900,79157278100,79172279300,79204304800,79228274900,79281276100,79498279100,79623276100,79640309200,79658350300,79708280900,79765338900,79782283600,79836278200,79995284400,80015275700,80069284000,80085275000,80116291500,80133276600,80296277100,80317282200,80370278000,80444277400,80492281900,80540275500,80560281000,80640324900,80660278000,80709289000,80759282000,80780296700,…。
上面的示例涉及软件实现的游戏,并且剖析器的输出示出了与改变的游戏数据相关的标签。附加地,它还示出了关于该改变的信息,诸如:
·关于标签的偏移量,以便知道该改变发生在哪个字节上(例如,与剖析器输出(2)至(4)中的单个标签相关的数据可以是三个连续的字节,针对这些字节,同时检测到改变),·其可变性(在本文中被称为“熵”),即,例如,剖析器检测到的独特值的数量,
·改变被检测到的所有时间的时间戳列表,该时间戳列表关于游戏的开始。
可以在单个平台或多个不同平台(或执行环境)上执行的一个剖析运行或多个运行内收集熵和时间戳。上面示出的结果是针对相同游戏产生的所有剖析输出的合并剖析数据。
各种启发式方法可以被应用于剖析输出。例如,可以对标签加偏移量的组合在剖析输出中出现的次数进行计数,以检查其有多活跃(即,多久被更新一次)。作为另一示例,在调用被复制的函数之前,可以检查标签是否改变了若干次。为了理解函数和数据之间的关系,数据部分以及其在数据部分上操作的对应函数被并行地剖析。然后,将函数-剖析器输出与数据-剖析器输出进行组合,以导出数据和函数之间的关系。这确保了存储器位置被初始化,并且其值具有某种合期望的熵水平。
例如,以上示例的标签5跨不同的剖析运行生成了多于256个独特值。这展示了相对高的熵。对于任何具体代码所期望的熵水平可以由本领域技术人员基于期望的安全性级别和其他实际考虑来确定。
下面的样本代码片段是根据所公开的实现方式处理原始代码以产生受保护代码的结果:
上面的代码片段是受保护代码的精简版本,目的是为了示出如何使用适用的数据(由本文中所公开的剖析确定的)以在被复制的代码路径之间进行选择。为了决定选择哪个被复制的代码实例,在该示例中,访问了该代码(游戏)中的两个变量的地址。具体地,将“raindrop vertices(雨滴顶点)”内的地址与相机信息数据内的地址进行组合。该示例组合了两个标签。然而,可以使用任何数量的一个或多个标签。最合期望的是使用标签或标签的组合,从而得到高熵,诸如该示例中的相机。此外,具有较低熵的标签可以被组合以增加熵输出。
在本示例中,被复制的函数的标签是从名为“Duplicated_Group_128”的表中获得的(参见地址0000000143CB8CDB)。标签可以是一个或多个存储器地址的任何符号性信息。使用标签而不是存储器地址是有利的,因为在(二进制)计算机程序的随后版本中,例如变量的存储器地址可能会在编译器的审慎(discretion)下改变(可能是由于添加或移除了一些其他变量而仅仅略微地改变),而变量的名称(即标签)仍然有效并传达相同的信息。“Duplicated_Group_128”表包含对被复制的代码的所有引用,并且它与mod操作(idiv指令)的输出进行组合,其作为索引(index)而工作。因此,将要执行的被复制的代码实例可以根据从这些地址读取(并且用作决策值)的两个组合值来确定。给定所读取的值的属性,将在代码运行时内选择不同的代码路径。可以应用不同的方法,比如switch语句(诸如if条件)和其他程序结构,以基于游戏数据输入来选择将调用哪个复制实例。
将领会的是,可以将执行路径对所标识程序状态元素的附加依赖性进一步引入到安全软件项目240中,以进一步改进防篡改性。在图2b中所示的保护系统220的变型实施例中,代码修改单元224被配置成修改等效执行路径中的至少一个中的至少一个操作,使得可执行路径中的中间结果依赖于程序状态的至少一个元素的值。倘若程序状态的至少一个元素的值是预期值(或者一组预期值中的一个),则进行修改以使得经修改的执行路径的功能性不变。以这种方式,倘若软件项目被布置成使得经修改的可执行路径仅当程序状态的至少一个元素的值是预期值(或者一组预期值中的一个)时才被选择,则保留该软件项目的功能性。然而,万一攻击者寻求通过强制选择经修改的执行路径来规避路径多样性,则软件项目的功能性将无法被保证,这是因为经修改的执行路径将在程序状态的至少一个元素的值不是预期值的情况下被采用,这打破了经修改的执行路径的功能等效性。
代码修改单元224可以被布置成:通过修改第一操作以基于程序状态的至少一个元素的值来更改中间结果,以及修改第二操作以基于程序状态的至少一个元素的预期值来补偿(或撤消或以其他方式反转)该更改,从而修改执行路径。例如,第一操作可以被修改为包括二进制运算符对程序状态的至少一个元素的值和中间结果的作用,并且第二操作可以被修改为包括对应的逆二进制运算符对程序状态的至少一个元素的预期值和中间值(其可以是相同的或相应发生的(consequential)中间值)的作用。
下面的代码示例说明了这种执行路径修改的示例。
(1)原始代码:
int f(){
return 42;
}
(2)根据存储器内容选择的具有路径多样性的代码:
(3)使用存储器的值的具有路径多样性的代码:
将领会的是,所描述的方法已经被示出为以特定次序实行的个体步骤。然而,本领域技术人员应当领会,这些步骤可以被组合或以不同的次序实行,同时仍然实现期望的结果。
将领会的是,本发明的实施例可以使用各种不同的信息处理系统来实现。特别地,尽管附图及其讨论提供了示例性计算系统和方法,但是呈现这些仅仅是为了在讨论本发明的各种方面时提供有用的参考。本发明的实施例可以在任何合适的数据处理设备上实行,该数据处理设备诸如个人计算机、膝上型电脑、个人数字助理、移动电话、机顶盒、电视、服务器计算机等。当然,出于讨论的目的,已经简化了系统和方法的描述,并且它们只是可以用于本发明的实施例的许多不同类型的系统和方法中的一个。将领会的是,逻辑块之间的边界仅仅是说明性的,并且替代实施例可以合并逻辑块或元素,或者可以在各种逻辑块或元素下强加功能的替代分解。
将领会的是,上面提及的功能可以被实现为作为硬件和/或软件的一个或多个对应模块。例如,上面提及的功能可以被实现为一个或多个软件组件以供该系统的处理器执行。替代地,上面提及的功能可以被实现为硬件,诸如一个或多个现场可编程门阵列(FPGA)、和/或一个或多个专用集成电路(ASIC)、和/或一个或多个数字信号处理器(DSP)、和/或其他硬件布置。在本文中包含的流程图中实现的或如上所描述的方法步骤可以均由对应的相应模块来实现;在本文中包含的流程图中实现的或如上所描述的多个方法步骤可以由单个模块一起实现。
将领会的是,在本发明的实施例由计算机程序来实现的限度内,则承载计算机程序的存储介质和传输介质形成本发明的方面。计算机程序可以具有一个或多个程序指令、或在由计算机执行时实行本发明的实施例的程序代码。本文中使用的术语“程序”可以是被设计用于在计算机系统上执行的指令序列,并且可以包括子例程、函数、过程、模块、对象方法、对象实现、可执行应用、小程序、小服务程序、源代码、对象代码、共享库、动态链接库、和/或被设计用于在计算机系统上执行的其他指令序列。存储介质可以是磁盘(诸如,硬盘或软盘)、光盘(诸如,CD-ROM、DVD-ROM或蓝光盘)、或存储器(诸如,ROM、RAM、EEPROM、EPROM、闪速存储器、或便携式/可移除存储器设备)等。传输介质可以是通信信号、数据广播、两个或更多个计算机之间的通信链路等。
在以下编号的段落中阐述了本发明的各种示例和实施例。
NP1.一种通过增加原始代码的路径多样性来创建安全可执行代码的方法,所述方法包括:
动态地剖析所述原始代码,以收集与在所述原始代码的执行期间的所述原始代码的一个或多个状态指示符的更新特性相关的数据;
基于所述动态剖析,从所述一个或多个状态指示符当中选择至少一个状态指示符;以及
将至少一个新的替代执行路径添加到原始二进制代码,从而创建安全代码,其中所述至少一个新的替代执行路径的执行依赖于所述至少一个状态指示符的值。
NP2.根据NP1所述的方法,其中所述选择步骤包括:基于所述至少一个状态指示符在所述原始代码的执行期间被频繁更新的确定来选择所述至少一个状态指示符。
NP3.根据NP1所述的方法,其中所述动态地剖析包括:收集所述原始二进制代码的执行期间的所述原始代码的至少一个数据快照。
NP4.根据NP3所述的方法,其中所述至少一个数据快照是从所述原始代码在单个设备上的多次执行或所述原始代码在多个设备上的多次执行中的至少一个所收集的。
NP5.根据NP1所述的方法,其中所述至少一个状态指示符包括以下各项中的至少一个:
地址和该地址处的值;
CPU寄存器和该CPU寄存器的值;以及
FPU寄存器和该FPU寄存器的值。
NP6.根据NP5所述的方法,其中所述状态指示符进一步包括与以下各项中的至少一个相关的元数据:
地址和该地址处的值;
CPU寄存器和该CPU寄存器的值;以及
FPU寄存器和该FPU寄存器的值。
NP7.根据NP4所述的方法,其中所述至少一个数据快照基于时间被周期性地收集或者基于事件的发生被收集。
NP8.根据NP7所述的方法,其中所述事件是具体API调用或函数调用中的至少一个。
NP9.根据NP1所述的方法,其中所述原始代码是二进制代码。
NP10.根据NP9所述的方法,其中所述二进制代码采用以下格式中的一个:
Windows PE32/PE32+可执行格式;
x64或x86指令集格式;
ELF格式;
ARM32格式;
ARM64格式。
NP11.根据NP1所述的方法,其中所述原始代码是源代码。
NP12.根据NP1所述的方法,其中所述至少一个替代执行路径是对所述原始代码中的原始执行路径的功能上等效的替代。
NP13.根据NP11所述的方法,进一步包括将混淆技术应用于以下各项中的至少一个:条件值的读取、路径的选择、所述至少一个替代执行路径、所述原始执行路径、以及所述安全代码的其他部分。
NP14.根据NP1所述的方法,其中所述至少一个替代执行路径的操作的影响与所述原始执行路径的操作的影响是不同的,由此,由受保护代码的执行而得到的函数基于所述状态指示符而变化。
NP15.根据NP1所述的方法,其中所述状态指示符与符号性信息相关联,并且所述符号性信息用于使所述至少一个执行路径依赖于所述至少一个状态指示符。
NP16.根据NP15所述的方法,其中所述符号性信息是调试符号和变量名称中的至少一个。
NP17.一种用于通过增加原始代码的路径多样性来创建安全可执行代码的计算机系统,所述系统包括:
至少一个数据处理器;以及
至少一个存储器,其上存储有指令,所述指令在由所述至少一个计算机处理器执行时使得所述至少一个计算机处理器:
动态地剖析所述原始代码,以收集与在所述原始代码的执行期间的所述原始代码的一个或多个状态指示符的更新特性相关的数据;
基于所述动态剖析,从所述一个或多个状态指示符当中选择至少一个状态指示符;以及
将至少一个新的替代执行路径添加到原始二进制代码,从而创建安全代码,其中所述至少一个新的替代执行路径的执行依赖于所述至少一个状态指示符的值。
NP18.根据NP17所述的系统,其中选择包括:基于所述至少一个状态指示符在所述原始代码的执行期间被频繁更新的确定来选择所述至少一个状态指示符。
NP19.根据NP17所述的系统,其中所述动态地剖析包括:收集所述原始二进制代码的执行期间的所述原始代码的至少一个数据快照。
NP20.根据NP19所述的系统,其中所述至少一个数据快照是从所述原始代码在单个设备上的多次执行或所述原始代码在多个设备上的多次执行中的至少一个所收集的。
NP21.根据NP17所述的系统,其中所述至少一个状态指示符包括以下各项中的至少一个:
地址和该地址处的值;
CPU寄存器和该CPU寄存器的值;以及
FPU寄存器和该FPU寄存器的值。
NP22.根据NP21所述的系统,其中所述状态指示符进一步包括与以下各项中的至少一个相关的元数据:
地址和该地址处的值;
CPU寄存器和该CPU寄存器的值;以及
FPU寄存器和该FPU寄存器的值。
NP23.根据NP20所述的系统,其中所述至少一个数据快照基于时间被周期性地收集或者基于事件的发生被收集。
NP24.根据NP23所述的系统,其中所述事件是具体API调用或函数调用中的至少一个。
NP25.根据NP17所述的系统,其中所述原始代码是二进制代码。
NP26.根据NP25所述的系统,其中所述二进制代码采用以下格式中的一个:
Windows PE32/PE32+可执行格式;
x64或x86指令集格式;
ELF格式;
ARM32格式;
ARM64格式。
NP27.根据NP17所述的系统,其中所述原始代码是源代码。
NP28.根据NP17所述的系统,其中所述至少一个替代执行路径是对所述原始代码中的原始执行路径的功能上等效的替代。
NP29.根据NP27所述的系统,进一步包括将混淆技术应用于以下各项中的至少一个:条件值的读取、路径的选择、所述至少一个替代执行路径、所述原始执行路径、以及所述安全代码的其他部分。
NP30.根据NP17所述的系统,其中所述至少一个替代执行路径的操作的影响与所述原始执行路径的操作的影响是不同的,由此,由受保护代码的执行而得到的函数基于所述状态指示符而变化。
NP31.根据NP17所述的方法,其中所述状态指示符与符号性信息相关联,并且所述符号性信息用于使所述至少一个执行路径依赖于所述至少一个状态指示符。
NP32.根据NP31所述的方法,其中所述符号性信息是调试符号和变量名称中的至少一个。

Claims (17)

1.一种保护可执行代码的方法,所述方法包括:
接收所述可执行代码在执行期间的程序状态的多个元素的使用数据;
从接收到的使用数据来标识所述程序状态的具有至少一个预定义更新特性的至少一个元素;以及
修改所述可执行代码,以依赖于所述程序状态的所标识的至少一个元素的值在所述可执行代码的至少两个等效执行路径之间进行选择。
2.根据权利要求1所述的方法,其中所述修改步骤包括:在所述可执行代码中拷贝来自所述可执行代码的第一执行路径的操作,以在所述可执行代码中生成第二执行路径,其中第二可执行路径在功能上等效于第一执行路径。
3.根据权利要求2所述的方法,其中第二执行路径中的操作被修改,使得第二可执行路径中的中间结果依赖于所述程序状态的所述至少一个元素的值。
4.根据权利要求3所述的方法,其中第一被修改的操作基于所述程序状态的所述至少一个元素的值来更改所述中间结果,并且第二被修改的操作基于所述程序状态的所述至少一个元素的预期值来补偿所述更改。
5.根据任一项前述权利要求所述的方法,进一步包括:接收所述执行路径之一中的第一可调用单元的调用数据,其中所述标识步骤是从接收到的使用数据和接收到的调用数据来标识所述程序状态的、在所述执行路径的开始处具有所述至少一个预定义更新特性的至少一个元素。
6.根据权利要求5所述的方法,其中所述调用数据是通过动态地剖析所述可执行代码来生成的。
7.根据任一项前述权利要求所述的方法,其中所述使用数据是通过动态地剖析所述可执行代码来生成的。
8.根据权利要求6或7所述的方法,其中所述动态地剖析包括:收集执行期间的所述程序状态的多个快照,可选地,其中所述多个快照基于时间被周期性地收集或者基于事件的发生被收集。
9.根据任一项前述权利要求所述的方法,其中所述使用数据包括在所述可执行代码的多个执行实例期间生成的使用数据。
10.根据任一项前述权利要求所述的方法,其中所述使用数据包括多个使用数据集,每个使用数据集对应于在相应的执行环境中对执行期间的所述程序状态的所述多个元素的使用。
11.根据任一项前述权利要求所述的方法,其中所述程序状态的元素对应于以下各项中的任何:
主存储器地址;
高速缓存存储器地址;
帧缓冲器地址;
CPU寄存器;
GPU寄存器;
FPU寄存器;
调用堆栈的一部分;
所述可执行代码的变量;以及
与所述可执行代码的符号相关的地址。
12.根据任一项前述权利要求所述的方法,其中所述使用数据包括针对所述程序状态的所述多个元素中的每一个的一个或多个度量。
13.根据权利要求12所述的方法,其中所述度量是以下各项中的任何:
在执行期间的所述程序状态的元素的更新频率的量度;
在执行期间的所述程序状态的元素所取的值的范围的量度;
在执行期间的所述程序状态的元素所取的值的变动的量度;
在执行期间的所述程序状态的元素的更新次数;
在执行期间的所述程序状态的元素所取的值。
14.根据权利要求12或13所述的方法,其中所述预定义更新特性要求所述程序状态的元素至少具有阈值水平的度量。
15.根据任一项前述权利要求所述的方法,其中所述预定义更新特性指定以下各项中的任何:
更新频率;
所述程序状态的元素所取的值的随机性的量度;
所述程序状态的元素所取的值的熵的量度;
所述程序状态的元素所取的值的变动。
16.一种装置,其被布置成执行根据权利要求1至15中任一项所述的方法。
17.一种存储计算机程序的计算机可读介质,所述计算机程序在由处理器执行时使得所述处理器执行根据权利要求1至15中任一项所述的方法。
CN202311128829.5A 2022-09-01 2023-09-01 用于通过执行路径多样性来增加软件代码安全性的方法和装置 Pending CN117633729A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
EP22193529.9A EP4332800A1 (en) 2022-09-01 2022-09-01 Method and apparatus for increasing the security of software code through execution path diversity
EP22193529.9 2022-09-01

Publications (1)

Publication Number Publication Date
CN117633729A true CN117633729A (zh) 2024-03-01

Family

ID=83151514

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311128829.5A Pending CN117633729A (zh) 2022-09-01 2023-09-01 用于通过执行路径多样性来增加软件代码安全性的方法和装置

Country Status (3)

Country Link
US (1) US20240078294A1 (zh)
EP (1) EP4332800A1 (zh)
CN (1) CN117633729A (zh)

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7430670B1 (en) * 1999-07-29 2008-09-30 Intertrust Technologies Corp. Software self-defense systems and methods
EP3513348A1 (en) * 2016-09-15 2019-07-24 Telefonaktiebolaget LM Ericsson (PUBL) Efficient obfuscation of program control flow

Also Published As

Publication number Publication date
US20240078294A1 (en) 2024-03-07
EP4332800A1 (en) 2024-03-06

Similar Documents

Publication Publication Date Title
Sihag et al. A survey of android application and malware hardening
Snyder et al. Most websites don't need to vibrate: A cost-benefit approach to improving browser security
Holla et al. Android based mobile application development and its security
US11822654B2 (en) System and method for runtime detection, analysis and signature determination of obfuscated malicious code
Chen et al. A practical approach for adaptive data structure layout randomization
CN105893228A (zh) 用于行为沙箱化的系统和方法
Haupert et al. Honey, i shrunk your app security: The state of android app hardening
JP2016525760A (ja) 無関係なコードの特定
Druffel et al. Davinci: Android app analysis beyond frida via dynamic system call instrumentation
Chinprutthiwong et al. Security Study of Service Worker Cross-Site Scripting.
Shan et al. Mobile agent protection with self-modifying code
Rauti et al. Internal interface diversification as a method against malware
Lefebvre et al. Universal trusted execution environments for securing SDN/NFV operations
Bouffard et al. The ultimate control flow transfer in a Java based smart card
Tanner et al. Protecting android APPS from repackaging using native code
Qiu et al. Libcapsule: Complete confinement of third-party libraries in android applications
Wan et al. Defending application cache integrity of android runtime
De Ryck et al. Protected web components: Hiding sensitive information in the shadows
Küçük et al. Managing confidentiality leaks through private algorithms on Software Guard eXtensions (SGX) enclaves: Minimised TCB on secret-code execution with Early Private Mode (EPM)
EP4332800A1 (en) Method and apparatus for increasing the security of software code through execution path diversity
Zhao et al. Automatic extraction of secrets from malware
Lee et al. VODKA: Virtualization obfuscation using dynamic key approach
Alsmadi et al. Software management
Küçük et al. SoK: How Not to Architect Your Next-Generation TEE Malware?
Ahmad et al. Empirical analysis on the use of dynamic code updates in android and its security implications

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination