二进制代码混淆的国内外研究现状
二进制代码相似度检测复现

二进制代码相似度检测复现引言在软件开发领域,代码的相似度检测是一项重要的技术,它可以帮助开发人员发现重复的、冗余的或可能存在问题的代码片段。
其中,二进制代码相似度检测是一种常用的技术手段,它可以比较两个二进制文件之间的相似程度,以帮助开发人员进行代码分析、优化和维护。
本文将以二进制代码相似度检测为主题,介绍如何复现这一技术。
一、背景介绍二进制代码是计算机程序的一种形式,它是由计算机硬件直接执行的指令序列。
与源代码相比,二进制代码更加难以阅读和理解,但它在计算机系统中起着至关重要的作用。
因此,对二进制代码的相似度检测具有重要的意义。
二、实现方法要进行二进制代码的相似度检测,需要先将二进制文件转换为可比较的形式。
常用的方法是将二进制文件转换为十六进制字符串或二进制字符串。
接下来,可以使用以下方法进行相似度比较:1. 汉明距离法汉明距离是指两个等长字符串之间对应位置不同字符的个数。
在二进制代码相似度检测中,可以将二进制字符串视为一个位向量,然后计算两个二进制字符串之间的汉明距离。
汉明距离越小,表示两个二进制字符串越相似。
2. 编辑距离法编辑距离是指将一个字符串转换为另一个字符串所需的最少操作次数。
在二进制代码相似度检测中,可以将二进制字符串视为一个字符序列,然后使用动态规划算法计算两个二进制字符串之间的编辑距离。
编辑距离越小,表示两个二进制字符串越相似。
3. 哈希函数法哈希函数是一种将任意长度的输入映射为固定长度输出的函数。
在二进制代码相似度检测中,可以使用哈希函数将二进制字符串映射为一个固定长度的哈希值,然后比较两个二进制字符串的哈希值。
哈希值越接近,表示两个二进制字符串越相似。
三、实验步骤为了复现二进制代码相似度检测,可以按照以下步骤进行实验:1. 收集二进制文件:从不同的软件项目中收集一些二进制文件,确保它们具有一定的差异性。
2. 转换为可比较形式:使用十六进制转换工具将二进制文件转换为十六进制字符串。
恶意代码二进制程序行为分析关键技术研究

恶意代码二进制程序行为分析关键技术研究随着信息时代的来临,互联网已经成为了人们工作和生活中不可缺少的一部分。
但是,在生活因为互联网而变得便捷的同时,也使得人们更加容易遭受到来自于恶意代码的攻击。
特别是在恶意代码的编写、传播以及利用发展成为一个黑色产业链之后,恶意代码的产量越来越大,生产速度也越来越快。
恶意代码对网络安全造成的影响也随之变得越来越大,甚至严重地威胁到了国家的安全。
正是鉴于恶意代码的带来的严重安全威胁,对恶意代码的分析已经成为了所有安全机构和厂商关注的重点。
特别是基于二进制程序行为的恶意代码分析技术已经被广泛的应用在日常分析工作当中,以帮助安全分析人员迅速地对恶意代码进行分析。
从而,可以达到对恶意代码传播扩散的遏制,保护合法用户的利益不受到来自于恶意代码的侵害。
随着近年来恶意代码分析技术研究的不断进步,已经取得了一些重要的研究成果,对恶意代码的传播及其造成的危害起到了有效的遏制作用。
但是,依然还有许多问题依然困扰着研究人员。
对于恶意代码二进制程序行为分析主要存在着以下几个问题:首先,在现有的恶意代码行为分析当中,多数分析方法都是底层都是在汇编代码层面对其行为进行描述。
由于汇编代码复杂且难于理解,使得用其描述的行为很难具有可读性,缺乏针对的行为形式化的抽象描述。
尽管,有些研究者借助编译器中的中间语言对程序行为进行了抽象,但是由于这种中间语言专注于对程序正向编译执行,而缺乏对反编译技术的有效理解,导致很多反编译中存在问题无法被正确描述,从而导致恶意代码行为的抽象描述存在欠缺,不能正确地展示出恶意代码运行的整个流程。
也正是由于缺少对恶意代码分析的形式化中间描述语言,使得很多分析方法都只能够停留在技术说明的层面,不能够向人们完整地展示其分析方法的全部过程。
其次,现有的恶意代码行为分析技术,无论是动态行为分析,还是静态行为分析往往都关注于恶意代码的调用函数层面的监视分析,没有深入到内存和寄存器的变化层面。
基于神经网络的二进制代码安全分析研究

基于神经网络的二进制代码安全分析研究二进制代码是计算机程序的底层运行形式,但其难以被人类理解。
而随着计算机领域的发展,各种恶意软件和攻击手段层出不穷,对程序的安全分析显得尤为重要。
近年来,基于神经网络的二进制代码安全分析研究备受关注。
神经网络是由人工神经元之间复杂相互作用而形成的模型,其具有非常强大的模式识别和拟合能力。
基于神经网络的二进制代码安全分析主要是通过机器学习的方法来识别程序的安全性,具有一定的自动化和高效性。
在这个研究领域中,涉及到的主要技术包括程序的静态分析和动态分析。
其中,静态分析是通过对程序进行反汇编或二进制分析,对程序的结构进行解析,提取出程序的特征,进行安全性评估。
而动态分析则是通过对程序进行运行,根据程序的行为来进行安全性评估。
基于神经网络的二进制代码安全分析主要应用于以下几个方面:首先,二进制代码的加密和解密。
在软件开发过程中,为了防止程序被反编译和篡改,开发者通常会对二进制代码进行加密。
基于神经网络的二进制代码安全分析可以帮助破解这种加密,分析加密算法,提高安全性。
其次,二进制代码的漏洞分析和修补。
在软件开发过程中,程序往往存在着漏洞,这些漏洞可能被黑客利用,导致程序崩溃、泄露数据或被入侵。
基于神经网络的二进制代码安全分析可以帮助发现这些漏洞,提出修补方案,提高程序的安全性。
再次,二进制代码的恶意软件检测和分析。
恶意软件是指具有恶意目的的计算机程序,如病毒、木马、蠕虫等。
这些恶意软件可能会给用户带来安全隐患,如窃密、勒索、篡改等。
基于神经网络的二进制代码安全分析可以通过学习恶意软件的行为模式,来进行检测和分析。
最后,二进制代码的逆向工程和保护。
逆向工程是指通过对已有程序进行反汇编和分析,来了解程序的结构和实现原理。
而保护则是指通过各种手段,来保护程序的版权和代码安全性。
基于神经网络的二进制代码安全分析可以帮助进行逆向工程,提出保护方案,提高程序的安全性。
总之,基于神经网络的二进制代码安全分析研究具有非常重要的应用价值。
代码混淆技术研究综述

代码混淆技术研究综述引言随着信息技术的快速发展和普及,软件的开发和使用已经成为现代社会的一个重要组成部分。
随之而来的问题是软件安全性的挑战。
恶意攻击者往往试图通过逆向工程和分析软件源代码来发现其漏洞和弱点,从而实施攻击。
为了应对这一挑战,代码混淆技术应运而生。
代码混淆技术旨在通过改变软件源代码的结构和逻辑,使其难以理解和分析,从而加强软件的安全性。
本文将对代码混淆技术进行综述,并探讨其研究现状和发展趋势。
一、代码混淆技术概述代码混淆技术是一种通过对软件源代码进行转换和重组来隐藏其真实意图和逻辑的手段。
通过代码混淆,可以使软件的逻辑结构变得复杂和难以理解,从而降低攻击者对软件源代码的分析效率,增加攻击者攻击软件的成本和难度。
代码混淆技术通常包括以下几种常见手段:1. 控制流混淆:通过改变软件的控制流程,使得程序的执行路径变得复杂和混乱,增加攻击者理解和分析程序的难度。
代码混淆技术的目标是增加软件系统的复杂性,使得攻击者难以理解和分析软件的内部逻辑和结构,从而提高软件的安全性。
二、代码混淆技术研究现状代码混淆技术是软件安全领域的一个重要研究方向,当前已经取得了一些研究成果。
代码混淆技术的研究现状主要包括以下几个方面:1. 控制流混淆技术研究控制流混淆是代码混淆技术中的一个重要手段,当前已经有许多研究针对控制流混淆进行了深入的探讨。
现有的控制流混淆技术主要包括基础块替换、指令混淆、虚假指令插入等方法。
通过这些技术,可以有效地改变程序的控制流程,使得程序的执行路径变得复杂和难以理解。
2. 数据混淆技术研究数据混淆技术是代码混淆技术的另一重要方面。
目前已经有许多研究着眼于数据混淆技术的研究。
常见的数据混淆技术包括变量重命名、数据加密、数据重排等方法。
通过这些技术,可以有效地隐藏程序中的数据访问关系,增加程序的复杂度。
3. 代码混淆工具研究当前已经有一些代码混淆工具得到了研究和开发,并广泛应用于实际的软件开发中。
代码混淆技术研究综述

代码混淆技术研究综述随着软件开发的发展,越来越多的软件产品面临污点问题和反编译攻击。
这给软件部署和运营过程带来了巨大的安全隐患。
通过代码混淆技术,可以使得代码变得更加难以理解,从而提高软件的安全性和保护知识产权。
代码混淆技术被广泛应用于Java、C/C++、JavaScript、Objective-C等编程语言中,成为提高代码安全性的重要手段。
本文旨在对代码混淆技术进行综述,探讨代码混淆技术的优缺点、常用技术和未来发展趋势。
一、代码混淆技术的优缺点代码混淆技术的优点是可以对代码进行加密和混淆,从而使得反编译和分析难度增加。
采用代码混淆技术可以使得软件更加安全和保护知识产权。
下面列举了代码混淆技术的优点:1. 提高软件安全性:代码混淆技术可以提高软件的安全性,防止黑客攻击和归档分析。
2. 保护知识产权:代码混淆技术可以保护知识产权,防止他人篡改代码、复制代码或者非法使用代码。
3. 防范逆向工程:代码混淆技术可以防范逆向工程,使得代码难以理解、分析和模拟。
4. 提高反软件病毒和恶意攻击的能力:代码混淆技术可以增强反恶意软件病毒和恶意攻击的能力。
代码混淆技术的缺点在于其会增加代码大小和执行时间。
代码混淆技术需要对代码进行加密和混淆,这将增加代码的大小和执行时间。
另外,代码混淆技术对于代码质量的影响也是一个需要考虑的问题,如果代码混淆技术应用不恰当,则可能会对代码质量产生负面影响。
代码混淆技术的常用技术有:标识重写技术、控制流混淆技术、数据流混淆技术和代码隐藏技术等。
1. 标识重写技术:标识重写技术是最基本的混淆技术,其目的是将代码所有元素进行替换,使得反编译者难以识别代码的含义。
标识重写技术主要包括函数名、变量名、结构名、常量名、类型名、枚举类型名以及宏等元素的重写。
2. 控制流混淆技术:控制流混淆技术主要是对程序控制流程进行混淆,使得程序难以分析和理解。
控制流混淆技术包括基本块排列混淆、代码插入混淆、代码拆分混淆、跳转替换混淆以及函数内联混淆等技术。
代码混淆技术研究综述

代码混淆技术研究综述近年来,随着软件领域的迅速发展,软件的安全性也变得越来越重要。
随之而来的是——黑客攻击事件激增。
对于黑客来说,攻击软件的最好方式就是攻击软件中的漏洞,而这些漏洞往往都是由于开发者犯了错误而导致的。
为了解决这个问题,一种被广泛采用的方法是代码混淆。
代码混淆是一种将程序代码进行加密或其他修改的技术,以使黑客难以理解和反编译该代码,从而提高代码的安全性。
本文将对代码混淆技术进行研究综述。
1. 静态混淆和动态混淆代码混淆可以分为静态混淆和动态混淆两种方式。
静态混淆是通过修改程序代码本身来实现,它通常会对代码进行变量重命名、删除无用代码、添加无用代码、修改控制流等操作,以此来使程序代码不容易被反编译和理解。
静态混淆的优点是不需要在程序运行时加载代码,因此对程序的运行速度没有影响,缺点是由于静态混淆是在开发阶段完成的,因此也容易被反混淆。
动态混淆则是指在程序运行时对程序的代码进行修改,一般会对代码进行加密、解密、动态调用等操作。
动态混淆的优点是可以在程序运行过程中动态加密和解密代码,从而使黑客无法在攻击前获取到明文代码,而且也不容易被反混淆,缺点是会对程序的运行速度产生一定的影响。
2. 常见的代码混淆技术(1)变量重命名变量重命名是一种最基本且最常见的代码混淆技术。
它的思路非常简单,就是将程序中的变量名进行重命名,使程序的逻辑结构变得难以理解。
变量重命名不仅使代码难以读懂,也使反汇编代码难以理解,从而增加攻击者从反汇编代码重构程序的复杂度。
(2)控制流混淆控制流混淆是一种使程序控制流程难以理解的技术。
它通过在代码中插入大量无效代码,改变程序控制流程,使程序逻辑变得混乱和不连续。
控制流混淆技术可以使程序难以反汇编、反编译和理解,从而增加攻击者重构程序的难度。
(3)代码替换代码替换是一种通过用一段功能相同的代码替换原有的代码来实现混淆的技术。
在程序执行过程中,可以随机选择一个代码片段替换当前正在执行的代码片段,从而使程序逻辑变得难以理解。
二进制代码混淆的国内外研究现状

二进制代码混淆的国内外研究现状一.国内外研究现状南开大学贾春福《路径模糊一种有效抵抗符号执行的二进制混淆技术》提出了一种新的基于路径模糊的软件保护方法以抵抗符号执行的逆向分析:利用条件异常代码替换条件跳转指令来隐藏程序的路径分支信息,通过系统的异常处理机制实现程序的跳转,并使用不透明谓词技术引入伪造的路径分支来弥补程序在统计属性上的差异。
电子科技大学吴适《基于二进制代码混淆的软件保护研究》提出一种新的 C2D 转换的混淆算法—基于代码-数据欺骗的混淆算法,该算法的目的是为了在静态分析工具中隐藏目标基本块及到目标基本块的控制流,当反汇编器遇上条件跳转指令时,跳转指令中的目标地址和跳转指令紧接着的地址都会被解释成指令。
令绝对跳转指令(jmp,ret)后面的地址为 A,当使用递归遍历算法时,若没有其他指令跳转到 A,则 A 不会被解释成指令;当使用顺序扫描算法时,A 地址处存在无法被解释的指令,则会跳过对 A 的反汇编。
利用这两点规律,将真正的控制转移隐藏在某条指令的数据部分中,还可以将指令隐藏在代码段的静态数据中。
西北大学王怀军《基于变形的二进制代码混淆技术研究》研究并实现了二进制代码混淆保护原型系统MEPE,MEPE 系统变形部分主要包含3 方面研究内容: 1) 指令等价变形,主要通过设计指令变形的模板函数,利用模板函数对原始指令进行等价变形。
2) 控制流混淆,通过打乱原来指令的物理顺序,利用跳转地址表管理指令执行顺序; 3) 循环体中指令变形的控制,首先分析循环结构对时间开销的影响,然后提出控制循环体中指令变形和控制流混淆的方法。
南开大学王志《二进制代码路径混淆技术研究》提出了一种全新的线性代码混淆策略,该策略将未解数学猜想引入到软件的路径信息中,将基于符号执行和约束求解技术的逆向工程难度等价到证明未解数学猜想的难度。
在代码混淆中只使用线性操作,不使用加密函数。
多项式等价变换、收敛值变换、固定循环次数变换和相似控制流变换是基于未解数学猜想的路径混淆所特有的变换方式,多态和变形技术是常用的代码变换技术,由于基于未解数学猜想的路径混淆有很好的可扩展性,这些代码变换技术可以直接应用到混淆后代码中。
代码混淆技术研究综述

代码混淆技术研究综述代码混淆技术是一种应用于软件安全领域的技术,通过对程序代码进行加密、替换、重组、插入无效代码等方式,增加代码的复杂度与混淆程度,提高程序的安全性。
随着软件复杂度和攻击技术的不断提升,代码混淆技术愈发成为保护程序安全的必要手段。
一、代码混淆技术的概念及目的1.控制流混淆技术控制流混淆技术通过修改程序的控制流程,增加分支逻辑判断、插入无用分支等方式,加强程序的混淆程度,使攻击者难以通过分析代码结构来获取程序逻辑。
常用的技术包括跳转插入、循环转换、枚举转换、函数调用随机化等。
数据流混淆技术通过对程序变量、常量等数据进行加密、变形、替换等操作,增加程序数据流程的复杂度,使攻击者难以获取数据信息。
常用的技术包括变量加密、常量替换、数组拆分、加密字符串、加密方式等。
3.代码结构混淆技术代码混淆技术已被广泛应用于软件安全领域。
在商业软件、游戏、金融、物联网、移动应用等领域,代码混淆技术都被用于保护程序安全。
具体应用包括:1.商业软件保护代码混淆技术可用于保护商业软件的安全,防止破解和盗版。
商业软件通常涉及到重要的商业机密和数据,代码混淆技术可以有效地保护这些信息不被窃取。
2.游戏保护游戏开发者通常使用代码混淆技术,以增加游戏程序的安全性,防止游戏被盗版和修改。
此外,代码混淆技术还可以用于反外挂、防作弊等方面。
3.金融应用保护在金融应用领域,代码混淆技术通常用于增加应用程序的安全性。
防止程序被攻击者窃取重要信息,如银行、证券等金融应用。
4.物联网应用保护在物联网应用领域,代码混淆技术可以用于起到保护设备连接安全的作用。
物联网应用通常涉及到硬件、设备、传感器、数据传输等多个方面,混淆程序代码可以有效地保护物联网应用的安全。
五、总结随着软件攻击技术的对抗,代码混淆技术已成为一种必要的程序安全保护手段。
在程序代码混淆中,控制流混淆、数据流混淆、代码结构混淆等技术被广泛应用,并已成为主流的保护方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二进制代码混淆的国内外研究现状1.国内外研究现状南开大学 贾春福 《路径模糊一种有效抵抗符号执行的二进制混淆技术》提出了一种新的基于路径模糊的软件保护方法以抵抗符号执行的逆向分析:利用条件异常代码替换条件跳转指令来隐藏程序的路径分支信息,通过系统的异常处理机制实现程序的跳转,并使用不透明谓词技术引入伪造的路径分支来弥补程序在统计属性上的差异。
电子科技大学 吴适 《基于二进制代码混淆的软件保护研究》提出一种新的 C2D 转换的混淆算法—基于代码-数据欺骗的混淆算法,该算法的目的是为了在静态分析工具中隐藏目标基本块及到目标基本块的控制流,当反汇编器遇上条件跳转指令时,跳转指令中的目标地址和跳转指令紧接着的地址都会被解释成指令。
令绝对跳转指令(jmp,ret)后面的地址为 A,当使用递归遍历算法时,若没有其他指令跳转到 A,则 A 不会被解释成指令;当使用顺序扫描算法时,A 地址处存在无法被解释的指令,则会跳过对 A 的反汇编。
利用这两点规律,将真正的控制转移隐藏在某条指令的数据部分中,还可以将指令隐藏在代码段的静态数据中。
西北大学王怀军《基于变形的二进制代码混淆技术研究》研究并实现了二进制代码混淆保护原型系统MEPE,MEPE 系统变形部分主要包含3 方面研究内容: 1) 指令等价变形,主要通过设计指令变形的模板函数,利用模板函数对原始指令进行等价变形。
2) 控制流混淆,通过打乱原来指令的物理顺序,利用跳转地址表管理指令执行顺序; 3) 循环体中指令变形的控制,首先分析循环结构对时间开销的影响,然后提出控制循环体中指令变形和控制流混淆的方法。
南开大学 王志 《二进制代码路径混淆技术研究》提出了一种全新的线性代码混淆策略,该策略将未解数学猜想引入到软件的路径信息中,将基于符号执行和约束求解技术的逆向工程难度等价到证明未解数学猜想的难度。
在代码混淆中只使用线性操作,不使用加密函数。
多项式等价变换、收敛值变换、固定循环次数变换和相似控制流变换是基于未解数学猜想的路径混淆所特有的变换方式,多态和变形技术是常用的代码变换技术,由于基于未解数学猜想的路径混淆有很好的可扩展性,这些代码变换技术可以直接应用到混淆后代码中。
Collberg 《A Taxonomy of Obfuscation Transformations.Department of Computer Science》第一次针对JAVA 程序提出了代码混淆。
Collberg 在其技术报告中提出了混淆转换的定义、混淆算法的详细分类及其有效性评估方法,该报告中根据其分类描述了混淆转换的一般性算法,这些算法能够应用于大部分流行的高级程序语言的代码混淆。
根据 Collberg 的分类,混淆转换可以分为词法结构混淆又称布局混淆、控制流混淆、数据混淆以及针对特定反混淆器的预防性混淆。
Cohen 《Operating System Protection through Program Evolution》论述了将代码混淆作为一种技术用于增加软件代码的多样性,其使用了重排指令顺序,增加或者删除跳转指令和反内联函数等方法,在不改变代码语义的情况下对软件的指令或指令序列进行替换,利用软件代码的多样性增加攻击者对软件进行逆向分析和篡改的难度。
C Wang《A security architecture for survivability mechanisms:[dissertation]》针对静态逆向反编译技术提出了基于控制流退化(degeneration of control flow)的高级语言代码混淆策略,通过间接跳转对控制流重新整合,并在数据流中引入指针别名操作,有效地提高了软件代码的复杂度,并降低了静态逆向反编译的精度。
Linn C 《Obfuscation of executable code to improve resistance to staticDisassembly》等人针对静态反汇编技术提出了一种二进制代码混淆方案。
反汇编技术是将二进制机器代码转换成汇编指令,是逆向分析和推理的基础,常用的反汇编算法有线性扫描算法(linear sweep algorithm)和递归遍历算法(recursivetraversal algorithm)。
针对线性扫描算法难以区分代码和数据的问题,Linn 等人提出了分支反转(branch flipping)技术,在条件跳转指令之后加入垃圾数据以阻止线性扫描算法的分析。
针对递归遍历算法以控制流为基础进行反汇编的特点,Linn 等人提出了分支函数(branch functions)技术,将控制流中显而易见的直接跳转指令和函数调用指令隐藏在分支函数中,并引入不透明谓词(opaquepredicates)和跳转表欺骗(jump table spoofing)技术误导反汇编的递归遍历算法。
Wang 和 Linn 等人的混淆策略都利用了静态逆向分析难以处理指针别名的问题,将控制流的静态逆向分析由线性复杂度变成 NP 完全问题。
Kanzaki《Exploiting Self-Modification Mechanism for Program Protection》利用二进制代码自修改机制(self-modifying mechanism)对软件中的重要代码进行伪装。
首先,用不可执行的垃圾指令对软件原始的二进制指令进行伪装;然后,在软件执行中利用二进制代码的自修改机制动态地生成原始指令并替换伪装代码;最后,将已经执行过的原始指令再次使用垃圾指令进行覆盖。
Birrer 利用程序碎片技术和跳转表使混淆后的软件二进制代码具有变形能力。
Kanzaki 和 Birrer 等人提出的两种代码混淆策略隐藏了软件代码或控制流,使其在执行过程中才动态的展现出来,其混淆的对象是静态反汇编和反编译技术。
多样性是生物系统健壮的重要保证。
当前软件系统大部分是同构系统,缺乏多样性。
Forrest 《Building Diverse Computer Systems. Proceedings of the6th Workshop on Hot Topics in Operating Systems》提出了利用混淆堆栈数据的方式增加软件代码的多样性,在保持软件的用户体验、功能性和效率的基础上,提高了软件的抗攻击能力。
Bhatkar 《Address Obfuscation: an Efcient Approach to Combat aBroad Range of Memory Error Exploits》提出了地址混淆的策略,在Forrest 等人的工作基础上对软件中的代码和数据地址进行混淆变换,进一步提升了软件代码的健壮性。
2007 年,Popov 《Binary obfuscation using signals. Proceedings of theUSENIX Security Symposium》提出了一种基于Linux信号机制的二进制代码混淆技术:使用各种产生异常信号的代码替换程序中的 jmp、ret 和 call 等跳转指令来混淆程序的执行过程。
二进制代码中读写内存、算术运算和调用系统函数等操作,都有可能产生系统异常信号,因此,静态逆向分析工具很难准确判定在执行过程中二进制代码是否会产生异常信号。
但是,该技术无法对二进制代码的路径分支进行混淆,因此,它不能缓解软件执行过程中的信息泄露问题。
2008 年,Sharif 《Impeding malware analysis using conditional codeObfuscation》等人提出了一种基于哈希函数代码混淆策略,用哈希值替换路径分支条件中的常量,利用哈希函数的单向性增加逆向工程的难度,但是,哈希函数不具有保序性,即无法保证当 x > y 时,Hash(x) > Hash(y)成立。
因此,该混淆策略具有局限性,只能保护等于关系的路径分支条件。
2011 年,Falcarin 《Exploiting Code Mobility for Dynamic BinaryObfuscation》等人将软件核心代码放到网络上的一个可信实体中,该实体在攻击者的控制之外,利用代码的流动性使软件在执行过程中动态获得这些代码,减少攻击者对软件整个二进制代码的能见度,从而限制攻击者的知识并阻止其逆向工程。
2011 年,Ceccato 《Remote Software Protection Using Orthogonal Replacement》 等人提出了基于正交替换(orthogonal replacement)的客户端混淆策略,通过设置客户端代码的有效期,软件客户端在运行过程中与远程可信服务器进行频繁的代码替换,使软件代码不断的更新,增加攻击者进行逆向工程的难度。
Falcarin 和Ceccato 提出的混淆策略都是基于网络交互的,在不可信主机上运行的软件代码都是不完整的,软件的执行过程需要由远程可信服务器决定,而且每次执行的代码都是定制的,这样迫使攻击者不断面对软件的变化,增加逆向工程的复杂度。
而且,本地代码的不完整性也干扰了攻击者对软件行为的静态预测能力。
但是,由于网络带宽和延迟的限制,应用程序与可信的远程服务器的频繁交互过程将致使软件的运行效率远远低于本地执行,因此大部分软件还是以二进制本地代码形式发布,服务器端运行保护(protection byserver-side execution)并非对所有应用程序都适用。
二.代码混淆技术的分类Collberg 等人根据各种代码混淆技术变换对象的不同将混淆分为四类:布局混淆、数据混淆、控制混淆和预防混淆。
1. 布局混淆布局混淆(layout obfuscation)是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。
软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高软件装载和执行的效率。
软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。
标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。
哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代码的理解难度。