接着上一篇,现在明确问题:在汇编克隆搜索文献中,有四种类型的克隆[15][16][17]:Type1.literally identical(字面相同);Type2.syntactically equivalent(语法等价);Type3.slightly modified(稍作修改);Type4.semantically similar(语义相似)。文章主要关注类型4克隆,虽然汇编代码有可能在语法上不同,但是在源代码层次函数的功能逻辑是相同的。例如,有混淆和没有混淆的相同代码,或者不同版本的之间的补丁源代码。

  本文使用以下概念:

function:汇编函数

source function:用源代码(eg.C++)写的源函数

repository funcation:存储库中索引的汇编函数

target function:要查询的汇编函数(query)

问题定义:给定一个目标函数ft,搜索问题是从仓库中取出top-k repository funcations(fs属于RP),通过它们的语义相似度进行排名,这样就可以视为Type4克隆。

  Asm2Vec模型总体工作流程如图所示:

步骤1:给定汇编函数的存储库,首先为这些函数构建神经网络模型,只需要汇编代码作为训练数据不需要任何先验知识。

步骤2:在训练阶段后,模型为每一个存储库的函数生成一个向量表示。

步骤3:给定一个没有经过该模型训练的目标函数ft,使用该模型来生成它的向量表示。

步骤4:使用余弦将ft的向量与存储库中的其他向量进行比较,相似性检索排名前k的候选项作为结果。

  训练过程是一次性的工作,可以有效地学习查询的表示。如果向存储库中添加了新的汇编函数,将按照步骤3中的相同过程来估计其向量表示。该模型可以定期进行再训练,以保证向量的质量。

汇编代码的表示学习

  接下来讨论汇编代码的表示学习模型。具体来说,本文的设计基于PV-DM模型[20]。PV-DM模型基于文档中的tokens来学习文档表示,然而,文档是按顺序排列的和汇编代码不一样,汇编代码可以表示为图形,并具有特定的语法。首先介绍一下原始的PV-DM神经网络,它是用来学习文本段落的向量表示,然后建立Asm2Vec模型,并描述它是如何在给定函数的指令序列下进行训练的,最后阐述如何将控制流图建模为多个序列。

  PV-DM模型是为文本数据而设计的,它是原word2vec模型的扩展,它可以为每个单词和每个段落共同学习向量表示。给定一个包含多个句子的文本段落,PV-DM在每个句子上应用一个滑动窗口。滑动窗口从句子的开头开始,每一步向前移动一个单词。例如在图中滑动窗口的大小为5。第一步,滑动窗口包含五个词“the‘’,“cat”,“sat”,“on”和“a”。中间的单词“sat”作为目标,周围的单词作为上下文。在第二步中,窗口向前移动一个单词包含“cat”,“sat”,“on”,“a”和mat,其中“on”是目标。每一步,PV-DM模型执行一个多层次预测任务(如图)

它将基于当前段ID把当前段映射成向量,基于文档中的word ID把每个word映射成向量。通过softmax分类中的单词表来平均这些向量和预测目标词。反向传播的分类错误将用于更新这些向量。

  PV-DM是为按顺序排列的文本数据而设计的,然而,汇编代码比纯文本更具有丰富的语法。它包含与纯文本在结构上不同的操作,操作流和控制流。这些差异需要不同的模型架构设计,而PV-DM无法解决这些问题。

Asm2Vec 模型

  汇编函数可以用控制流程图(CFG)来表示,本文将控制流程图建模为多个序列,每一个序列对应着一个包含线性排列的汇编指令的潜在执行路径。给定一个二进制文件,使用IDA pro反汇编去提取汇编函数及其基本块和控制流程图列表。

  首先介绍Asm2Vec模型流程图中的步骤1和步骤2工作细节:

我们训练模型为每一个存储库的函数产生一个数值向量。下面是该模型用来处理汇编代码的神经网络结构:

(The proposed Asm2Vec neural network model for assembly code)

  首先,将存储库中的每一个函数映射成一个向量。收集了存储库中所有独特的tokens,在汇编代码中将操作和操作数视为tokens,将每一个token t 映射为一个数值向量t1和另一个数值向量t1`,在训练后t1表示为词汇语义,t1向量可视化了tokens之间的关系。t1`是用来做token预测的。所有的函数向量表示和token向量t1都初始化为在0附近的小随机值,所有的t1`向量都随机化为0。用一种定义2xd来把一条指令的操作和操作数联系起来。

  然后,把存储库中的函数生成多个指令序列seqs,假设序列的顺序是随机的。每个序列有多条指令,当前的那条指令的定义包含了当前那条指令的所有的操作数和当前指令的一个操作。常量tokens被规范为十六进制形式。

  对于函数中的每个序列seq,神经网络从序列的开端开始遍历指令。收集一个序列中的当前指令,之前一个指令和之后一个指令,忽略边界(当前seq)之外的指令。提出的模型试图在存储库函数中最大化以下逻辑概率:

对于在给定的当前汇编函数和附近指令的情况下,它最大化了在当前指令处看到token的日志概率。直觉上是使用当前函数的向量和附近指令提供的上下文来预测当前指令。相邻指令提供的向量捕获有词汇语义关系。函数的向量记住了在特定环境下所能预测的东西。它为区分当前函数和其他函数在指令层次建模。

  模型具体步骤流程:

1.对于一个给定的函数fs,通过之前构造的字典,首先查找它的向量表示。

2.为附近(一前一后)的指令建模:针对每条指令,先对其进行操作数的向量平均操作,然后对指令的操作和得到的平均向量进行连接合并操作。

3.将前指令连接合并得到的向量,后指令连接得到的向量,和给定函数找到的向量,三者进行平均操作。

  

Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(一)的更多相关文章

  1. Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(二)

    接着上篇Asm2Vec神经网络模型流程继续,接下来探讨具体过程和细节. 一.为汇编函数建模  二.训练,评估   先来看第一部分为汇编函数建模,这个过程是将存储库中的每一个汇编函数建模为多个序列.由于 ...

  2. Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization

    用于理解恶意软件的内部工作原理,并发现系统中的漏洞,逆向工程是一种耗费人工的却很重要的技术.汇编克隆搜索引擎是通过识别那些重复的或者已知的部件来帮助逆向工程师的工作,要想设计健壮的克隆搜索引擎是一项挑 ...

  3. 【Code clone】Distributed Code Clone Detection Based on Index

    1 摘要  随着软件产业的发展,代码克隆现象越来越常见,随之带来的安全漏洞.可维护性.产权等问题也引起人们重视.代码克隆按照复制程度分为4类:完全复制.修改名称.更换顺序和自实现.现有的代码克隆检测工 ...

  4. 机器学习&恶意代码检测简介

    Malware detection 目录 可执行文件简介 检测方法概述 资源及参考文献 可执行文件简介 ELF(Executable Linkable Format) linux下的可执行文件格式,按 ...

  5. 3. Dubbo原理解析-Dubbo内核实现之动态编译 (转)

    转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 我们运行的Java代码,一般都是编译之后的字节码 ...

  6. 将百分制转换为5分制的算法 Binary Search Tree ordered binary tree sorted binary tree Huffman Tree

    1.二叉搜索树:去一个陌生的城市问路到目的地: for each node, all elements in its left subtree are less-or-equal to the nod ...

  7. binary heap

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  8. state-of-the-art implementations related to visual recognition and search

    http://rogerioferis.com/VisualRecognitionAndSearch2014/Resources.html Source Code Non-exhaustive lis ...

  9. Top 40 Static Code Analysis Tools

    https://www.softwaretestinghelp.com/tools/top-40-static-code-analysis-tools/ In this article, I have ...

随机推荐

  1. PyCharm2019 激活码

    因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需要我做一个爬虫项目,当然java也可以做爬虫,但是还是没有python这样方便,所以也开始学习Python啦!!! ...

  2. Spring Boot 2.0 教程 | @ModelAttribute 注解

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站: https://www.exception.site/springboot/spring-boot-model-attribute Spri ...

  3. 初探React与D3的结合-或许是visualization的新突破?

    自诞生之初截止目前(2016年初),React可以说是前端界最流行的话题,如果你还不知道React是何物,你就该需要充充电了. d3是由纽约时报工程师开源的一个绘制基于svg的数据可视化工具,是近几年 ...

  4. gdb常用命令记录

    gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...

  5. ASP.NET Core WebAPI控制器返回类型的最佳选项

    前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...

  6. 从锅炉工到AI专家(10)

    RNN循环神经网络(Recurrent Neural Network) 如同word2vec中提到的,很多数据的原型,前后之间是存在关联性的.关联性的打破必然造成关键指征的丢失,从而在后续的训练和预测 ...

  7. 从锅炉工到AI专家(1)

    序言 标题来自一个很著名的梗,起因是知乎上一个问题:<锅炉设计转行 AI,可行吗?>,后来就延展出了很多类似的问句,什么"快递转行AI可行吗?"."xxx转行 ...

  8. 前端笔记之JavaScript(九)定时器&JSON&同步异步/回调函数&函数节流&call/apply

    一.快捷位置和尺寸属性 DOM已经提供给我们计算后的样式,但是还是觉得不方便,因为计算后的样式属性值都是字符串类型. 不能直接参与运算. 所以DOM又提供了一些API:得到的就是number类型的数据 ...

  9. Babel presets stage

    在一些新框架的代码中,常基于es6/7标准来书写代码.鉴于这些标准被没有被浏览器广泛支持,我们一般使用babel来将使用e6/7标准书写的代码降级编译(或者说转译)为浏览器可解析的es3/5代码. 以 ...

  10. 我是这样理解HTTP和HTTPS区别的

    为何要用https? http协议的缺点 通信使用明文,内容可能被窃听(重要密码泄露) 不验证通信方身份,有可能遭遇伪装(跨站点请求伪造) 无法证明报文的完整性,有可能已遭篡改(运营商劫持) 用htt ...