接着上一篇,现在明确问题:在汇编克隆搜索文献中,有四种类型的克隆[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. HTTPS 到底加密了什么?

    关于 HTTP 和 HTTPS 这个老生常谈的话题,我们之前已经写过很多文章了,比如这篇<从HTTP到HTTPS再到HSTS>,详细讲解了 HTTP 和 HTTPS 的进化之路,对的没错, ...

  2. Zabbix4.0.3解决中文乱码

    字体下载地址:https://github.com/hejianlai/Zabbix/raw/master/font/msyh.ttf放到以下目录,可能你的路径和我的不一样用find查出来cd /us ...

  3. 『The Captain 最短路建图优化』

    The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...

  4. Owin学习笔记(一) Owin的前生今世

    ASP.NET框架至今为止已经存在了数十年了,大量的网站使用ASP.NET框架进行开发.随着网站应用开发技术的进步,  许多网站应用开发框架有了新的流行趋势 轻量化 模块化 可移植 ASP.NET框架 ...

  5. Python2中文处理纪要

    python2不是以unicode作为基本代码字符类型,碰到乱码的几率是远远高于python3,但即便如此,相信很多人,也不想随意的迁移到python3,这里就总结几个我平常碰到的问题及解法. 文件中 ...

  6. OAuth2.0 原理简介

    写在前面: 在正式介绍OAuth2.0之前我们先来看一个场景:小李是一个文艺小青年, 经常喜欢出去旅游并且把自己旅行中的美景照片分享到各大社交网站上,比如朋友圈,新浪微博.小李马上要向女朋友求婚了,他 ...

  7. 【Java基础】【26网络编程】

    26.01_网络编程(网络编程概述)(了解) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下, ...

  8. 设计模式总结篇系列:享元模式(Flyweight)

    我们都知道,Java中的String类具有如下特性:String是一个不可变类,当直通过用字符串方式使用String对象时,Jvm实际上在内存中只存有一份,且存在字符串常量池中.当对字符串直接进行修改 ...

  9. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的eFUSE. 在i.MXRT启动系列第二篇文章 Boot配置(BOOT Pin, eFUSE) 里痞子 ...

  10. Jenkins结合.net平台综合之权限修正和文件排除

    笔者在发布项目的时候遇到这样一个问题,第一次发布的时候成功发布,然后再次发布失败.但是这个问题很快就排除了,这里提出来是为了帮助遇到这个问题的小伙伴,以顺利避开坑.之所以会这样是因为我们在设置权限的时 ...