文摘

数据模糊通常使用的恶意软件,以避免检测和反向分析。在分析恶意软件时,这样的陷阱要删除恢复程序变成一种更容易理解的形式(deobfuscation)。deobfuscation基于项目的合成提供了一个良好的解决方案将目标程序视为一个黑盒子。因此,deobfuscation成为一个问题找到最短的指令序列合成一个程序使用相同的输入输出行为作为目标程序。现有工作有两个局限性:假设混淆代码片段在目标程序是已知的和使用一个随机搜索算法导致低效率。在本文中,我们提出了细粒度模糊检测定位混淆代码片段的机器学习。除此之外,我们还将合成和启发式搜索算法的程序嵌套的蒙特卡罗搜索。我们应用的原型实现思想模糊的数据在不同的工具,包括OLLVM和凶悍的女人。我们的实验结果表明,这种方法是非常有效的定位和deobfuscating二进制文件与数据模糊,至少有90.34%的准确性。与最先进的deobfuscation技术相比,我们的方法的效率增加了75%,成功率提高了5%。

1。介绍

模糊数据转换,掩盖了在应用程序中使用的数据结构(1]。这个模糊的目标技术仅仅由取代标准的二元操作符(如加、减、或布尔操作符)的功能与更复杂的指令序列。近年来,几乎所有的恶意软件利用数据模糊掩盖其内部逻辑,以避免检测或阻止安全分析师反向分析,如病毒(2),重新包装(3),代码克隆(4,5),和隐私盗窃(6]。它使检测和分析恶意软件更加困难,更不用说混淆程序二进制文件没有源代码。

Deobfuscation是一个变换,可以从目标程序删除模糊效果来解决上述问题。这是一个逆向的过程代码混淆。具体来说,deobfuscation试图获得项目 通过逆向分析的目标程序 ; 在功能上是等价的, 更简单,更容易理解。目前,大多数现有的deobfuscation技术工作在一种特定的困惑7- - - - - -12),例如,布局deobfuscation [7),不透明谓词deobfuscation [8),控制流平deobfuscation [9],和虚拟化deobfuscation [10- - - - - -12]。

几乎没有deobfuscation专为数据模糊方法。有三个原因。首先,与其它模糊算法相比,更隐秘的模糊数据。这是因为指令参与数据混淆的数量很小,所以很难检测到13]。之后,大多数模糊处理工具实现数据模糊时,他们从等效指令序列增加随机选择一个转换的多样性(14- - - - - -16]。即使一个成功扭转分析转换,它仍然需要相同或更多的时间和精力deobfuscate其他转换。最后,恢复数据流从混淆代码需要大量的专家经验和领域知识,包括静态和动态分析。

根据底层原理,现有deobfuscation算法分为两类。第一类利用编译器优化的想法。Yadegari et al。17,18)第一次使用位污染传播和控制依赖分析的组合来确定相关指令的输入和输出值。然后,他们借的编译器优化删除冗余指令不断传播和常数合并。虽然编译器优化和deobfuscation都是为了简化代码,他们本质上是不同的19]。Deobfuscation旨在生成更可读的代码。编译器优化的目标是生成代码运行更快或使用更少。然而,代码执行效率高并不意味着它是可读的。因此,deobfuscation编译器的优化可能会导致生成的代码过于简化。

第二类deobfuscation基于程序合成技术(20.- - - - - -23),将目标程序视为一个黑盒子。潜在的直觉是可以被理解为一个程序的语义映射输入值和输出值。因此,deobfuscation成为一个问题找到最好的指令序列合成一个程序使用相同的输入输出行为作为目标程序。最好的在这里意味着它是最容易理解。这一类的优点是,不需要大量的专家经验和领域知识。程序合成技术不需要太多关注语义信息和模糊算法在目标程序。他们将单调乏味的,冗长的,与主观手册二进制代码逆向分析到自动化任务。但缺点是这一类的准确性和效率等因素是有限的用户意图,程序空间,和搜索技术。

Syntia [22)是一种先进的deobfuscation方法基于程序合成、自动化代码deobfuscation使用项目综合指导下蒙特卡洛树搜索(mct)。我们所知,Syntia首次提出一个框架,结合合成的人工智能算法的程序。然而,Syntia假设混淆指令是已知的。因此,第一个提出研究问题RQ1:如何定位混淆在目标程序指令?这是一个使deobfuscation的先决条件。此外,特定本质上是一种随机搜索算法,从而导致低效率的程序合成。因此,第二个提出研究问题RQ2:如何优化搜索效率的程序合成同时提高成功率?这激励我们去做我们的工作。

在本文中,我们提出一个简化二进制文件的方法和数据模糊AutoSimpler和名称。我们借Syntia结合项目的合成(21)和人工智能算法。具体地说,我们的方法的主要思想是将随机蒙特卡洛树搜索替换为嵌套蒙特卡罗启发式搜索(nmc) [24]。但也有一些挑战我们的工作。一方面,如何定位混淆指令?考虑到这一事实数据模糊涉及一些算术和逻辑运算符,我们选择熵基本块和语法指令的功能、使用支持向量机(SVM) [25与梯度下降法)和逻辑回归(LR-GD) [26)作为分类器找到混淆指令。另一方面,如何提高搜索效率?嵌套的蒙特卡罗搜索基于启发式是最好的选择,将嵌套的调用和随机性播出和记忆最好的动作序列。

与以往方法不同,AutoSimpler依靠嵌套的优点蒙特卡罗搜索的启发式程序合成效率的提高。此外,AutoSimpler采用机器学习识别混淆指令。不同于以前的工作,因为他们都假定已知混淆指令(22,23]。

贡献。本文以下贡献:我们提出一个细粒度的模糊检测定位混淆代码片段,它选择的熵基本块和语法指令特征训练机器学习模型。我们更换随机搜索的启发式搜索相结合的deobfuscation框架程序合成合成和人工智能来提高程序的效率,同时保证成功率略有增加。我们实现一个原型AutoSimpler并评估其准确性和效率。实验结果表明AutoSimpler deobfuscation工具数据混淆二进制文件与精度高90.34%和23秒的任务。

2。背景

在本节中,我们首先分析模糊的数据用户的复杂性研究部分2.1。接下来,我们描述的细节计划合成部分2.2。最后,我们定义的问题,简化了混淆的二进制文件2.3

2.1。模糊的数据复杂性分析

模糊数据转换,掩盖了源应用程序中所使用的数据结构(1]。尽管数据模糊通常只涉及几个指令(如图1),分析它的难度是不减少。一方面,这种模糊转换程序的数据流。几乎是不可能恢复其完整的语义只通过静态分析没有动态分析。另一方面,这种模糊随机性和多样性的特点。即使我们可以反向分析程序与数据成功地混淆,但这并不意味着我们仍然可以分析其他数据混淆项目以同样的方式。

评估数据混淆的韧性,我们遵循类似的评价方法中描述的旷et al。27进行小规模的用户研究。我们的用户研究涉及五个研究生主修计算机科学。所有的学生在软件逆向分析实践经验。他们被要求反向工程6个二进制程序。样品来自的源代码 和被OLLVM混淆选项的 或母老虎的选项 每个参与者都将12小时完成任务:尝试恢复原来的语义的混淆项目尽可能恢复,使代码具有相同的输入输出行为作为给定的程序。

1显示用户研究的结果。虽然这些项目只有100 - 300指令,五位候选人之一没有完成任何任务,剩下的完成至少一个。只有一个候选人完成两个任务。用户研究表明,手动实现逆向分析是一个非常艰巨的任务,需要大量的时间和精力。因此,有必要将单调乏味的,冗长的,主观deobfuscation过程为一个自动化的方式没有更多的专家经验和领域知识。

2.2。程序合成

程序合成技术合成一个可执行程序满足用户意图的形式表达了一些约束(20.]。程序合成:有三个关键维度的用户意图的表达,程序的搜索空间和搜索技术。程序合成已广泛应用于以下领域:自动编程(28],窥孔优化[29日,30.),并生成最好的代码片段(31日,32]。一些工作证明的可行性计划合成deobfuscation [21- - - - - -23]。具体地说,在一个给定的程序的规范等价的程序需要在目标语言中,程序合成可以将给定的代码转化为一个语义上等价的代码写在一个特定的目标语言。代码可读性更强,更容易理解。这些作品的区别是他们实现的三个关键维度。

程序合成应用的典型案例deobfuscation oracle-guided基于组件的程序合成[21]。需要deobfuscation过程作为一个黑盒和学习一系列的目标程序的输入和输出映射。然后,它使用一个合成器来生成代码片段有相同的输入输出行为目标程序,但更容易理解。

2.3。问题定义

解释oracle-guided程序合成更清楚,我们给这个问题的定义。让我们表示需要deobfuscated的目标程序 , 是输入的一组吗 , 输出的一组吗 所以输入-输出示例 的程序 可以表示为 然后, 代表输入-输出的一个例子 其中,可以一个或多个输入变量的数量,表示

为方便描述,我们假设所有的输入和输出都是一样的类型,和程序 只有一个输出。除此之外,我们还假设的集合操作符用于混淆项目,比如加法,减法,乘法,除法,记录在组件库中

deobfuscation的目标程序 合成一个候选人程序吗 根据给定的组件库 和输入-输出示例 ,要求 有相同的输入输出行为 ,这是表达明确如下:(1)对于任何的输入 ,程序的输出 和程序的输出 (2)这个项目 更可读的

最坏的结果是,所有运营商的组件库 用完了,不能合成目标程序。理想情况下,程序可以合成一些运营商的组件库

注意,生成候选项目 可以使用全部或部分运营商的组件库吗 如果许多候选项目 满足以上条件,我们选择候选项目与最少的运营商作为deobfuscated目标程序的结果

为了更清楚地解释这个问题,这是一个例子:给定一个混淆的代码片段 是谁的内在逻辑 ,我们只有其投入产出等例子 , ,和给定的组件库

根据输入输出的例子 和给定的组件库 ,它可以产生以下候选人的程序,包括 , ,

当输入 ,程序的输出 是9,但候选人程序的输出呢 是8,这是不同于目标程序 年代输出,所以这个候选人计划排除在外。

经过很多次的验证, 有相同的输出输入吗 作为目标计划 然而, 使用更少的组件比 ,所以 最后deobfuscated结果吗

一般来说,deobfuscation问题有效地转换成程序合成问题:候选人项目相同的输入输出行为目标项目是合成使用给定的组件库。因此,最重要的是学习如何减少程序空间和提高搜索效率。

3所示。我们的方法的概述

AutoSimpler是input-output-guided deobfuscation二进制文件与数据混淆的工具。它本质上是把我们的想法付诸实践。在高级别上,AutoSimpler包含三个组件:一个模糊检测器,一个程序合成器,和一个搜索引擎。需要在一个混淆的目标程序指令,输出程序更容易理解。模糊检测器的目标是找到混淆代码片段在目标程序通过一个训练有素的机器学习模型。它通过以下步骤为高亮显示在图2一步我样品一代。这一步的主要目的是生成标记训练样本模糊检测模型。所有的样品都混淆两个开源模糊工具的母老虎,OLLVM。的细节部分4.1。1第二步。特征选择。在这一步中,我们采用熵的基本块和语法指令作为选择的特性来描述数据混淆的行为。的细节部分4.1。2第三步。分类。所选特征编码向量和用作输入到训练有素的机器学习模型。它与支持向量机(SVM)进行分类(25与梯度下降法)和逻辑回归(LR-GD) [26]。的细节部分4.1。3第四步。预测。这是检测阶段。需要在一个给定的目标代码片段的形式汇编代码。训练模型预测如果被混淆的代码片段。

程序合成器。程序合成器旨在合成候选人项目与给定组件通过观察输入输出行为的目标程序。它通过以下步骤为高亮显示在图2。合成算法的程序的细节部分4.2.1。需要在代码片段数据模糊和输出一个简化的数学表达式。例如,当输入如图1(一),输出是一个+b+c+d

搜索引擎。搜索空间是另一个关键维度在程序合成20.]。在本文中,我们选择嵌套蒙特卡罗搜索(24]随着搜索引擎推广项目合成的速度。最好地址指导搜索的问题向州当没有可用启发式。AutoSimpler框架的、嵌套的蒙特卡罗搜索中扮演两个角色。一个是观察和理解目标程序的输入和输出之间的关系。另一种是寻找候选人程序也有类似的目标程序输入输出行为。在每个迭代中获得的奖励将会改变选择一个操作符的优先级从给定的组件,从而避免重复的生成和毫无意义的搜索。的细节部分4.3

4所示。实现细节

在本节中,我们首先引入混淆指令的分类器模型检测部分4.1。然后,我们描述了合成算法的程序,并描述如何约束程序空间的上下文无关语法部分4.2。最后,我们介绍如何搜索程序嵌套蒙特卡罗搜索空间的部分4.3

4.1。混淆指令探测器

input-output-guided程序合成仅限于无路由循环程序的自动化合成。所以我们将目标程序划分为几个基本块没有循环。这些基本模块将处理AutoSimpler作为输入。

确定输入和输出变量,我们采用二元分类器找到混淆指令。尽管模糊语义可以隐藏很好,仍然可以有一些提示。现有的模糊检测的工作精度高(13,33- - - - - -37]。因此,我们的动机是使用一种分类器来检测基本块混淆。

以下4.4.1。样品一代

构建与混淆标签样本,我们提出一个代码混淆样本生成器。需要在一个源文件用C语言编写并产生混淆汇编文件混淆标签。首先,它检查源文件是否可以标记。它被认为标签与困惑只有当文件中的函数满足以下三个条件:(1)函数包含模糊点。模糊点是在这里定义为算术和逻辑运算符(如 (2)函数的输入和输出类型都是int。这意味着不需要花费额外的时间和精力来确定输入和输出变量时收集在deobfuscation阶段输入输出示例。(3)内没有循环的功能。这是因为oracle-guided程序合成这里不能处理循环使用。第二,功能满足上述三个条件被母老虎和OLLVM混淆,和函数名称标记为混淆视听。第三,如果代码转换成功,混淆代码将被编译成汇编代码海湾合作委员会。第四,以函数为一个基本块,混淆大会文件划分为基本块,并把每个函数变成一个 txt文件。

建立地面真相混淆汇编代码,我们使用两个开源的代码混淆工具,OLLVM [16和母老虎14]。他们两人都支持数据混淆,比如OLLVM的选项和虎的选项-EncodeArithmetic。OLLVM基于LLVM框架是一个开源的代码模糊处理(15,16,38]。理论上,OLLVM支持世界上任何语言和机器架构。虎是一种多样化仿真器/模糊处理语言c,它支持许多小说防御静态和动态逆向工程和devirtualization攻击。为什么我们选择这两个开源面对的是,相比之下,商业银行面对[39- - - - - -42),我们可以更容易地理解他们混淆原则,可以根据需要灵活的标签混淆代码。

在构建模糊样本的代码生成器,我们实现一个算法检测模糊点。然后,我们使用所提供的命令行OLLVM和母老虎混淆困惑点。值得一提的是,混淆文件仍在语言c .因此,获得混淆组装样品,我们使用海湾合作委员会编译器生成 年代文件。

4.1.2。特征选择

我们建议以下两种类型的特点:熵(43和语法44]。他们两人已被证明在二进制代码机器学习(有杰出的表现35- - - - - -37]。

熵的基本块。熵代表字符的统计特征频率。模糊数据涉及大量的算术和逻辑操作。这将导致一个指令的操作码数量显著增加,如添加、子,和XOR,在大多数情况下这可能大大影响熵。熵的计算如下: 在哪里 代表的频率 的性格。语法上的指令。语法是一个连续的序列N个元素从给定样本中提取。程序二进制分析N-gram-based功能被定义为一个连续的模式,一个单独的样品可以确认为二进制指令。摘要AutoSimpler生成特征向量的频率来计算操作码和使用的前N - gram操作码的最高频率。假设一段代码组成 指令。任何指令 取决于第一个指令的影响 每一个指令 在这之前。计算语法如下:

每一项的概率表达的最大似然估计(标定),这是频率统计信息。所以,有

4.1.3。分类

机器学习领域已广泛应用于二进制代码分析。一些以前的工作与此相关的区域表明,支持向量机(SVM) [25与梯度下降法)和逻辑回归(LR-GD) [26)更有效率。因此,我们选择将支持向量机和梯度下降法(LR-GD)进行分类。(我)支持向量机(SVM)。支持向量机是一种监督学习算法适合解决分类问题。其基本模式是找到最好的分离超平面特征空间最大化之间的间隔正负样本训练集。(2)逻辑回归和梯度下降法(LR-GD)。逻辑回归是一种机器学习方法用于解决两个分类(0或1)问题和估计的概率。逻辑回归介绍了s形的函数为线性回归模型的输出值的不确定性范围线性回归可以映射到的范围(0,1)。

作为监督方法,支持向量机和LR-GD依靠两个阶段。在训练阶段,该算法获得的知识通过检查训练集的类描述。检查测试集分类机制并将其成员与可用类的测试阶段。因此,数据需要标记在训练分类模型为我们所做的部分4.1。1

4.2。程序合成器
4.2.1。准备合成算法的程序

算法1基于程序描述了deobfuscation算法合成,和执行过程描述如下:步骤1输入-输出采样。这一步的目的是收集输入-输出目标程序的例子。输入混淆代码片段被看作是一个黑盒子。给输入变量一个随机值,得到相应的输出值通过模拟目标代码片段的执行。输入输出样本的数量取决于具体情况。步骤2语法的限制。根据给定的组件生成相应的语法。生成语法的目的是减少程序空间维度,减少计算量。在这里,我们选择上下文无关的语法,语法约束。的细节部分4.2.2步骤3。输出候选项目。基于上下文无关语法的约束,AutoSimpler使用嵌套的蒙特卡罗搜索来选择和生成候选项目。步骤4相似度评价。比较候选人程序的输入输出行为与目标程序。如果他们有相同的输出相同的输入,候选项目是我们正在寻找的目标。否则,它将返回失败。当测量候选人之间的输入输出行为的相似程序和目标计划,我们选择的汉明距离,过去也曾被Syntia [22]。这是因为数据模糊不仅包括算术运算也逻辑操作。州有多少位的汉明距离两个值不同,这样就可以解决这些操作。

输入:
输出:
(1)
(2) 1
(3) =生产
(4) = Nested_MCS
(5) 如果 = = 然后
(6) 返回失败的
(7) 如果
(8) 如果 然后
(9) =
(10) 返回
(11) 其他的
(12) 返回失败的
(13) 如果
(14) 结束时
4.2.2。语法的限制

语法约束AutoSimpler试图减少搜索空间的合成方案。它可以用多种形式表达,如定期、上下文无关语法和逻辑表示。在这里,我们选择上下文无关的语法,因为它是更灵活的在描述表达式。一个上下文无关语法是上下文无关短语结构规则的集合。它包含四个要素:一组非终结符号,一组终端符号,一组作品,并指定一个非终结符号开始的象征。

具体来说,上下文无关文法构造表达式与语义信息基于提供的组件。一般来说,组件库的大小决定了上下文无关语法的复杂性。因此,提供一个适当的组件库是最关键的因素之一,确保程序合成的效率和有效性。

假设我们想要的目标程序合成有两个输入参数,如 ,和给定的组件包括 因此,有四个产品的语法如下:

根据生产来源,有多个终端字符串,满足语法,等 , , , , 所有终端生成字符串可以被称为候选项目。显然,如果没有合适的搜索算法,它是必要的排气所有终端满足语法的字符串,这是一个耗费资源的操作。因此,本文介绍了嵌套的蒙特卡罗搜索合成程序上下文无关语法的指导。

4.3。嵌套的蒙特卡罗搜索算法

嵌套的蒙特卡罗搜索(24)是一个改善蒙特卡洛树搜索(45]。蒙特卡洛树搜索是一个随机算法,指导搜索对给定域的最优决策,在每个搜索迭代中四个步骤:选择、扩张、模拟和反向传播。选择下面的代码访问时,其特定使用上信心边界树(节点)45)算法来权衡勘探和开发问题。然而,其特定事业的随机性和盲目性,不能总是找到最好的结果。尤其是左派和右派节点有相同节点奖励,mct将随机选择其中一个扩张没有更合理的建议。

嵌套的蒙特卡罗搜索地址的问题引导向更好的国家当没有可用启发式。嵌套的蒙特卡罗搜索结合嵌套调用与播出的随机性和记忆最好的动作序列。特别是,嵌套的蒙特卡罗随机移动,而不是使用启发式搜索的基础水平,但使用嵌套电结合启发式选择下一步的水平。它试图搜索每个可能的移动每个低级搜索之前只有一次。此外,嵌套序列蒙特卡罗搜索记忆最好的发现到目前为止,当随机搜索结果比最好的序列。

算法2和算法3演示如何嵌套蒙特卡罗搜索工作。算法2本质上是一个基本的蒙特卡洛树搜索。它初始化根节点的状态,这是左非终结符生产的上下文无关语法。在每个迭代中,未经中华人民共和国交通部重复节点选择的操作,模拟和反向传播。首先,它以节点最大的奖励为下一个节点将扩大。第二,它模拟程序的综合状态当选择当前节点通过相似性评价和评估它。如果当前合成候选人程序的输入输出行为和目标程序是一致的,然后跳出迭代,搜索结束。如果他们不一致,继续反向传播的一步。第三,反向传播的奖励值更新仿真中的每个节点的状态。如果程序仍未终止,迭代增加1,这个过程仍在继续。

算法3的关键部分是嵌套的蒙特卡罗搜索。嵌套的蒙特卡罗搜索总是选择低级的最高奖励当试图得到一个奖励模拟。它尝试所有可能的行动在每个迭代和嵌套的低水平,找到最好的奖励。如果当前不到最好的奖励,奖励嵌套蒙特卡罗搜索更新最好的序列和奖励与新发现了一个防止错过最好的奖励最好的序列。

输入:语法、目标、IO_inputs uct_scalar、州max_iter max_time = 0, nested_level
输出:
(1) self.root.state =状态
(2) self.max_iter = max_iter
(3) start_time =时间()
(4) required_time = 0
(5) current_iter = 0
(6) current_iter max_iter而不是self.finished
(7) 如果max_time required_time _ max_time然后
(8) 打破
(9) 如果
(10) self.current_iter = current_iter
(11) 节点选择= (self.root)
(12) nested_level奖励= simu_nested(节点)
(13) back_propagation(节点,奖励)
(14) current_iter + = 1
(15) 当前时间=时间()
(16) required_time = current_time-start_time
(17) 结束时
输入:自我。节点,netsted_level
输出:best_reward
(1) best_奖励=−1
(2) 不是self.finished
(3) 如果水平= 1然后
(4) expr =生成(node.state.expr)
(5) 奖励=自我。评分(expr)
(6) 其他的
(7) 奖励= simu_nested(自我。节点,netsted_level-1)
(8) 如果
(9) 如果奖励 best_reward然后
(10) best_reward =奖励
(11) best_sequence = seq.aftermove
(12) 如果
(13) best_move = best_sequence
(14) 结束时
(15) 返回best_reward

5。实验装置

在实验中,我们要回答下列问题相关的方法:(我)研究1是什么在AutoSimpler模糊检测器的准确性?机器学习分类方法性能更好?(2)研究2:什么是程序的性能在AutoSimpler合成器吗?包括其成功率和执行时间,最关键的问题是如何确定deobfuscated结果是正确的和简化?(3)研究3:我们的方法比较Syntia如何?最大的区别是,我们使用的搜索算法的启发式,虽然Syntia是随机的。(iv)研究4:输入和输出的例子如何不同尺度影响AutoSimpler的性能?

5.1。评价指标
5.1.1。度量模糊检测

我们采用机器学习领域的广泛使用的指标精度F1-score评价模糊检测器的准确性。这是一个简介: 在TP与模糊检测样本的数量正确。《外交政策》与假模糊检测样本的数量。FN与真正的困惑未被发现,样本的数量和TN的样本数量没有困惑未被发现。TPR TP / (TP + FP)计算,计算和玻璃钢FP / (FP + TN)。

我们也使用Detection_Time评价模糊检测器的有效性,特别是测试时间。

5.1.2中。度量Deobfuscation结果

Deobfuscation旨在消除混淆项目的模糊效果,使其更容易理解和可读性。我们所知,没有预定义的指标来衡量是否deobfuscation结果更容易理解。大卫et al。23)提供一个解决方案评估的尺寸换算系数混淆对合成一个表达式。此外,我们也使用用户研究部分6。6评估deobfuscation结果。

5.1.3。AutoSimpler的性能指标

我们使用两个指标Success_RateExcution_Time评估AutoSimpler的性能。这是一个简介: 在哪里 代表的次数AutoSimpler成功合成了目标程序的deobfuscation结果。成功意味着AutoSimpler产生相同的程序输入输出行为的目标程序但比目标程序更容易理解。 是AutoSimpler找不到正确的次数deobfuscation结果。有两种情况。一是没有生成程序直到AutoSimpler执行。另一个是AutoSimpler生成候选项目符合目标程序的输入输出行为但不容易理解比原来的计划。 是时候生成输入/输出的例子。 AutoSimpler代表了时间来找到一个候选人程序使用相同的输入输出行为作为目标程序。

5.2。数据集

在实验中,我们使用两种数据源验证AutoSimpler的性能。一个是来自源代码gcc-7.4.0。实验样本的选择应该遵循普遍性的原则,这意味着实验样本应该在现实世界中存在。 是最广泛使用的编译器和含有很多语言c源代码生成其他样本,这是由一个数学表达式生成器。他们都是认为是原始样本,然后由一节中描述的方法实现4.1。1生产样品混淆。

最后,有三个实验中使用的数据集。Dataset1训练模糊检测模型。Dataset2和Dataset3是用来测试deobfuscation的准确性。每个数据集的细节描述如下:Dataset1:我们使用一个数据集OBFEYE [13),其中包含超过277000个样本具有不同个人困惑计划打乱。OBFEYE源代码的数据集来自现实世界GNU工具集gcc-7.4.0。这个数据库中的所有示例都混淆的工具OLLVM [16和母老虎14]。我们手动选择1000混淆样品从数据混淆样本(750和250年从其他类型的样品混淆)。所有样品终于分为3745基本块,其中1209是混淆代码片段,其余的都是原始的片段。Dataset2:源代码来自一个数学表达式生成器由我们。它生成750算术表达式2到5输入参数和六个常见的操作,比如添加,减法,乘法,或者,而不是。所有的750个样本由OLLVM混淆(16)的选项和母老虎14)的选项-EncodeArithmetic。因此,总共有1500数据混淆样品在这个数据集。Dataset3:来自的源代码gcc-7.4.0。我们选择300个样本,满足三个条件中提到的部分4.1。1。他们混淆了OLLVM [16)的选项和母老虎14)的选项-EncodeArithmetic

5.3。实施和评价平台

我们的原型系统,AutoSimpler的名字,使用Python v.3.7实现。具体来说,AutoSimpler利用Syntia[的代码框架22),利用反汇编程序框架顶石(46和一个CPU模拟器框架独角兽47]。

实验进行一个笔记本电脑上运行Windows操作系统和两个64位2.9 GHz Intel (R) (TM)核心i7 - 3520 cpu。

6。实验结果

在本节中,我们首先评估通过机器学习模糊检测的准确性。然后,我们显示我们的方法的准确性与OLLVM样品混淆和凶悍的女人。接下来,我们把我们的方法与Syntia,证明我们的方法是更好。第四,我们研究投入产出的影响的例子在采样时间,搜索时间和迭代。最后,我们使用一个用户研究来验证deobfuscation结果的可理解性。

6.1。评价模糊检测

准确的定位混淆AutoSimpler片段是一个先决条件。对于模糊检测,我们运用两种不同的分类器基于节中提到的两种类型的特性4.1

训练模糊检测器的分类模型,我们使用Dataset1作为训练集,使用10倍交叉验证选择最好的模型在训练阶段。应该注意的是,每个函数在所有例子中被认为是一个基本块,保存在 文件。和文件的名字是作为混淆标签。

结果。我们应用的支持向量机(SVM)分类器(25与梯度下降法)和逻辑回归(LR-GD) [26)测试。结果如表所示2。当我们运用支持向量机作为分类器,精度我们的方法是96.82%F1-score的100%。与支持向量机相比,LR-GD性能更好的分类器。分类器是LR-GD时,精度我们的方法可以达到99.29%F1-score的100%。根据结果,我们做进一步的调查,支持向量机和LR-GD有不同的损失函数。支持向量机只考虑最相关的几点学习分类器。逻辑回归的重量减少点远离地面真理通过非线性映射和相对增加的重量分最相关的分类。因此,损失函数的支持向量机直接忽略了这些指令涉及到计算但不明显。

表中的实验结果报道强调模糊检测器的性能在我们的方法是好的。特别是,准确度高达99.29%。此外,我们的模糊检测的执行时间非常快,只有29秒1000个样本。

6.2。评价Deobfuscation结果

我们所知,没有预定义的指标来衡量是否deobfuscation结果更容易理解。Syntia [22)使用的数量表达式层评估deobfuscation结果。例如,图1 (b)与数据模糊是一个代码片段,表达有87层。其deobfuscation结果如图3(一个) ,其表达层是7。这种评价指标更适合算术表达式而不是现实世界的情况下自现实世界的情况下,除了算术表达式包含其他字符。大卫et al。23)提供一个解决方案评估的尺寸换算系数混淆对合成一个表达式。

认为来自我们的实验样本包括源代码海湾合作委员会(Dataset3)和构造的算术表达式(Dataset2)。因此,我们同时使用大小演绎和表达层评价deobfuscation导致实验。

在这个实验中,我们选择了300个样本Dataset2 Dataset3,分别计算表达层和其原始大小,混淆,deobfuscated程序。表达的数量为每个样品十层,和大小范围从1 kb到11 kb。困惑之后,表现层的数量是6 - 1361,和3569 kb的大小范围从13 kb。应该强调,当我们计算表达层和大小,我们喜欢混淆代码片段,而不是整个程序。

3显示统计结果。混淆代码相比,表情合成层代码的数量减少到平均14.05%,和代码的大小平均减少到5.67%。指导AutoSimpler自动判断是否生成的结果是正确的,我们也给出了四分之三的统计结果。这个值可以设置的阈值系统中deobfuscation结果的正确性。与原始代码相比,代码简化的平均值AutoSimpler略大。这是因为AutoSimpler不能总是最简化代码。例如,混淆表达图1 (b)有时被简化为 ,如图3 (b),但最应该简化表达式

6.3。评估性能

在这个实验中,为了避免偏见,我们使用1000样本Dataset2 Dataset3。所有的样品被OLLVM[混淆16)的选项 和母老虎14模糊的) 输入这些样本的数量从2到5不等。此外,输入-输出例子我们选择的数量是50。通过许多实验,我们发现,当输入-输出的数量是50例子,AutoSimpler最高效率和准确性(细节部分6。5)。我们执行每个样本10倍和记录deobfuscation是否成功。统计结果如表所示4

从表可以看出4AutoSimpler精度在90.34%以上,大约23秒来处理一个混淆程序平均需要大约14迭代。此外,AutoSimpler成功率更高deobfuscation当处理算术表达式由自己,平均为94.16%,平均执行时间为21.97秒。这是因为其算术表达式比随机选择样本格式标准 源代码。值得一提的是,与OLLVM相比,样品混淆了虎有一个稍低的成功率和执行速度,因为他们之间有不同的数据流模糊策略。我们使用母老虎和OLLVM执行数据流模糊表达 ,分别。图4显示模糊的结果。母老虎使用组合的算术和逻辑运算,而OLLVM仅使用算术运算。显然,母老虎更为复杂的变换,所以deobfuscation过程中所花费的时间更长。

6.4。与Syntia

很难得到Syntia工作,使其不清楚Syntia定位输入和输出变量的数据集。因此,我们替换的嵌套蒙特卡罗搜索AutoSimpler mct和使用相同的1000个样本从Dataset2 Dataset3作为测试用例。输入-输出例子的数量仍然是50。此外,我们将探索常数1.42推荐。注意,我们为每个样本执行十次因为蒙特卡洛树搜索是随机的。

实验结果如表所示4。未经中华人民共和国交通部的最佳精度为90.12%。最糟糕的是85.34%,低于嵌套蒙特卡罗搜索。这是因为特定轴是一个随机搜索算法。它无法保证每次最好的结果。但嵌套蒙特卡罗搜索克服这种限制通过记忆最好的序列来提高搜索的成功率。

此外,大约需要90秒和8000年对特定迭代过程deobfuscation任务。相比之下,嵌套蒙特卡尔搜索速度更快。它是由于搜索策略相结合的嵌套调用和记录最好的序列。虽然嵌套蒙特卡罗比其特定搜索每个迭代中需要更多的时间,它通常只需要几迭代迅速找到答案。进一步分析两者的区别搜索算法,我们将在下一节中进行更深入的研究。

一般来说,与Syntia相比,AutoSimpler的准确性已经增加了5%,执行效率增加了近75%。

6.5。性能与不同的输入

最重要的维度程序合成从用户的角度描述意图的机制。输入-输出的例子是一个简单的和最有用的形式的规范(20.]。在每个迭代中嵌套的蒙特卡罗搜索,有必要比较合成候选项目当前状态的输入-输出例子目标程序提前取样。输入-输出例子的数量决定了嵌套蒙特卡罗搜索的效率和准确性。换句话说,如果数量太小,提供的输入-输出的例子描述的目标程序的意图并不明确。相反,假设有太多的输入-输出示例。在这种情况下,将大量的时间花在比较候选人之间的输入输出行为程序和目标程序在每个迭代中,从而增加了系统的额外开销。因此,这个实验关注的影响不同数量的输入-输出AutoSimpler和Syntia例子。

当讨论输入-输出例子的数量之间的关系和执行时间,我们认为抽样和搜索时间。这个实验输入-输出例子的数量设置为20岁,50岁,100年和200年,分别。然后,我们使用AutoSimpler deobfuscate相同的目标程序。deobfuscation过程在每个采样数量十倍执行,并记录平均值。

执行时间。许多实验后发现,当抽样数量是20,50岁,100年到200年,平均采样时间是4.15秒。因此,我们可以得出结论,不同的采样时间引入投入产出的数量是可以忽略的例子。

5列出了统计结果的搜索时间。嵌套的蒙特卡罗搜索比较候选项目的投入产出行为与目标程序在每个迭代中。因此,当输入-输出例子的数量较大,每一轮的时间更长。从表可以看出5当输入-输出的数量是20例子,每个迭代的平均时间是0.87秒。输入-输出例子增加到200时,在每个迭代中也增加到3.80秒的时间。

至于mct,可以看出,当输入-输出的数量是20例子,每次迭代的平均搜索时间只有3.9毫秒。与嵌套的蒙特卡罗搜索相比,其特定花少近200倍时间在每个迭代。这是因为嵌套蒙特卡罗搜索尝试所有可能的运动降低层和比较每个节点的奖励最好的奖励。因此,在每个迭代中需要花费很长的时间。

在nmc迭代。调查有多少迭代所需AutoSimpler找到deobfuscated结果成功,我们也做进一步的研究和分析实验结果。我们还画了迭代的箱线图当输入参数的数量是2和3参数根据实验结果,如图5。图5(一个)是一个箱线图当输入参数的数量是2。从图可以看出,当输入-输出例子的数量是不同的,找到所需的迭代次数deobfuscation结果成功是不同的。迭代的最小数量是1,最大迭代次数为84。他们两人出现当输入-输出的数量是20例子。从图可以看出,当输入参数的数量是2,不管输入-输出例子的数量,平均迭代次数大约是20。因此,投入产出的数量不影响迭代的例子。

5 (b)是AutoSimpler所需的迭代deobfuscate成功与三个参数。中值的迭代次数大约是9。相比之下,图5(一个),当参数的数量是2,中值迭代的数量是20。输入参数的数量越少,需要更多的迭代。这似乎是对常识。所以,我们进行了一次深入的探索。对于固定数量的操作符 在数据流组件,当输入参数2(如 ,运营商在组件设置成对组合。如果不反复使用,每个操作符的操作可能的组合的数量 当有三个输入参数的算术表达式(如 ,可能的操作组合的数量 当输入参数2,程序的搜索空间较大,所以需要更多的迭代。

在其特定的迭代。我们也画箱线图的迭代时操作的数量是2和3参数根据实验结果,如图6。从图可以看出,迭代的最小数量是21日和631年的最大迭代数是12。他们两人出现当输入-输出的数量是20例子。当输入参数的数量是2,迭代的平均中值是9478。当输入参数的数量是3,迭代的平均中值是3372。与嵌套的蒙特卡罗搜索相比,迭代处理任务的数量已经增加了3000倍。原因是嵌套的蒙特卡罗搜索记忆,此举与低水平的最好奖励。它可以有效地控制迭代的数量。

这个实验的结论如下。首先,引入的采样时间的不同数量的输入-输出的例子是微不足道的。采样时间是4秒。其次,输入参数的数量越少,需要更多的迭代。第三,nmc比mct更有效率。输入-输出的一个例子,例子是20,特定的时间花在每个迭代搜索不到nmc的近200倍。不过,需要为其特定的迭代次数完成deobfuscation任务是nmc的近3000倍。一般来说,nmc更有效的执行。

6.6。用户研究

验证deobfuscation结果的可理解性,我们组织了另一个用户研究相同的五个研究生中提到的部分2.1。这一次,每个参与者随机给定100 deobfuscation AutoSimpler简化的结果。他们仍然给了12小时完成任务:试图了解deobfuscation结果。当他们完成了所有的任务,他们可以得到这些deobfuscation的原始程序的结果。然后,这些参与者判断deobfuscation结果与原始样本具有相同的语义。

6显示了一个可理解性导致我们的用户研究。每个人都提前完成了任务,最快的参与者只花了88分钟。有两个参与者相信所有100 deobfuscation结果具有相同的语义与原始计划,和deobfuscation结果很容易理解。其他三个人的结果98年,99年和96年。这意味着有七个deobfuscation结果不符合预期。为了找到真正的原因,我们做进一步调查。他们的确被简化了从规模的角度演绎,但他们并不比原来的程序更容易理解,因为他们还包含一些逻辑运算符。

用户研究结果验证AutoSimpler deobfuscation结果确实简化了很多。

7所示。限制

仍有一定的局限性。首先,AutoSimpler只能合成无路由循环程序。换句话说,我们的方法只局限于合成直线程序。这种限制也是一个常见的问题对所有项目综合技术。在未来,它将需要延长合成一个循环的程序。

第二,尽管嵌套蒙特卡罗程序空间中搜索搜索已经显示出强大的能力,仍然会有搜索失败的情况下。因此,在未来,我们将考虑改变到另一个搜索技术MCTSnets [48),这是一种神经版本的特定算法。MCTSnets旨在保持其特定的可取的属性,同时允许一些灵活性,提高节点的选择,数据存储在内存中,基于和他们是如何传播,所有使用梯度学习。

第三,由于添加的三个限制,数据规模和实际案例实验是非常小的。在未来,更多的真实世界的情况下将被认为是评价方法的性能。

第四,实验只关注两个开源模糊工具,仍缺乏令人信服的。更大的实验计划扩展到其他商业面对。

模糊检测。赵et al。13)提出一个模糊检测方法使用深层神经网络学习的语义信息拆卸二进制预测程序的模糊处理方案。但他们不讨论定位混淆的代码片段。Tofighi et al。33)提供细粒度检测模糊转换和结构框架。与这项工作相比,相同的是我们都考虑混淆代码片段的定位。我们之间的差异在于标签模糊的方法和机器学习技术。首先,Tofighi等人使用Miasm2中间语言作为原始数据,我们使用GCC编译后生成授予文件。其次,他们使用额外的树和随机森林分类模型,我们使用逻辑回归和梯度下降法(LR-GD)。

Deobfuscation。Yadegari et al。17)提出一个通用的方法可执行代码的deobfuscation,工作程序的语义的直觉可以视为从输入值映射到输出值。我们的工作也在研究这个潜在的直觉。两者之间最大的区别是简化冗余的技术指导。Yadegari等人使用污染传播跟踪的流动从程序的输入,输出值,只保留那些能影响的输入和输出值的代码。但是我们直接使用程序合成合成deobfuscation结果与相同的行为目标程序根据输入输出示例的指导。

库根等。12)识别与系统交互的指令,然后使用各种交互影响分析,以确定哪些指令。他们使用价值依赖分析和控制流分析抛弃无趣的指令。谢里夫et al。49]提出的方法进行自动对恶意软件的反向工程模拟器。他们的语法和语义提取混淆字节码指令通过动态分析decode-dispatch-based模拟器。克鲁格尔et al。50)描述静态分析正确拆卸混淆英特尔x86的二进制文件。他们现在一般控制的基于流程的方法和统计技术处理难分解的二进制文件。

这些现有的作品分为同一类别:deobfuscation基于逆向工程。首先,他们需要大量的专家经验和领域知识。其次,逆向工程是一个乏味的、冗长的和主观的过程,分析结果将随分析师的能力。最后,这一类不是可伸缩,即使相同的模糊算法在不同的对象有不同的特征。

程序合成。Gulwani [20.描述程序合成的三个关键维度:用户意图,搜索空间和搜索技术。他还简要描述每个维度的各种技术。Jha et al。21]提供了一个无路由循环程序的自动综合方法的指导与输入输出的例子。我们也基于输入-输出合成的指导。所不同的是,他们使用可满足性模理论(SMT)解决约束搜索空间。我们用上下文无关语法。

哲学上最接近我们的工作是通过Blazytko et al。22),谁给一个名叫Syntia工具使用程序合成由输入-输出合成混淆代码示例。虽然他们的目标是与我们的相似,技术细节是不同的。两者之间最大的区别是程序的搜索技术合成。Syntia采用蒙特卡洛树搜索引导程序合成。尽管蒙特卡洛树搜索已广泛应用于各个领域,它仍然有一些严重的缺陷。最重要的是,它是随机的,导致程序合成成功率较低。我们的方法使用嵌套的蒙特卡罗与启发式搜索和记忆最好的序列,它克服了蒙特卡洛树搜索的限制。重要的是,Blazytko有假设他们知道混淆代码在哪里。相比之下,我们把这种假设通过机器学习来定位混淆代码。

Menguy et al。51)提出一种新的基于ai黑盒deobfuscation的概念,是指利用人工智能的新领域形式化程序空间,如Syntia [22]。他们以deobfuscation为优化问题,而不是一个单人游戏,促进S-metaheuristics代替特定的应用。Menguy的方法不涉及混淆代码检测,这是另一个我们之间的差异。

提出了基于程序的另一个deobfuscation方法合成由大卫et al。23),提供一个工具叫QSynth利用动态符号执行和程序合成合成程序与数据混淆。QSynth提出一种合成算法和离线列举合成原始遵循自上而下breath-first搜索。当评估deobfuscation结果的可理解性,我们认为规模减少。我们之间最大的区别是,他们不讨论定位模糊表达。

9。结论

本文描述了一种二进制文件基于项目的deobfuscation合成方法。一方面,它有一个细粒度的模糊定位混淆代码片段的检测机器学习的准确性达99.29%。另一方面,它结合了合成和启发式搜索算法的程序嵌套的蒙特卡罗搜索。我们应用的原型实现思想模糊的数据在不同的工具,包括OLLVM和凶悍的女人。我们的实验结果表明,这种方法是非常有效的定位和deobfuscating二进制文件与数据模糊,至少有90.34%的准确性。与最先进的deobfuscation技术相比,我们的方法的成功率提高了5%,和效率增加了75%。一般而言,实验表明,我们的方法是有效的简化和数据模糊混淆的二进制文件。

数据可用性

作为后续研究正在进行中,数据将不会开放。

的利益冲突

作者宣称没有利益冲突。

确认

这个项目是由中国国家自然科学基金支持下批准号。61972314和61972314和陕西省的国际合作项目批准号。2020 kwz - 013下,2021 kw-15, 2021 kw-04。