接着上篇Asm2Vec神经网络模型流程继续,接下来探讨具体过程和细节。

一.为汇编函数建模 

二.训练,评估

 

先来看第一部分为汇编函数建模,这个过程是将存储库中的每一个汇编函数建模为多个序列。由于控制流图的原始线性布局覆盖了一些无效的执行路径,不能直接使用它作为训练序列。相反,可以将控制流程图建模为边缘覆盖序列和随机游动,除此之外,还要考虑函数内联等编译器优化。

1.1选择性被扩张. 函数内联这种技术,用被调用函数的主体替换调用指令。扩展了原来的汇编函数,并通过删除调用开销提高了其性能。它显著地修改了控制流图,是汇编克隆搜索[12][13]的一个主要挑战。本文采用让函数调用指令有选择地被调用函数的主体展开,BinGo[12]内联所有标准库调用,以确保语义正确。本文不用内联任何库调用,因为库调用tokens之间的词汇语义已经被模型很好地捕获了(之前提到过的这些训练汇编代码不包含任何库内联调用,直接用普通的汇编代码训练Asm2Vec模型,得到三类tokens(操作数,操作,库函数调用)每一个token的200维数值向量)。对于递归调用的处理,采用被调用函数的入度和出度比作为解耦指标,决定被调用函数是否展开。

设置阈值为0.01,调用别人为出度,被别人调用为入度。如果发现被调用函数比调用函数具有相当的长度,展开后类似于被调用函数。因此,添加一个额外的度量来过滤掉冗长的调用:

如果被调用函数长度占调用函数长度的比小于0.6,或者调用函数小于10行指令,则内联被调用函数。

1.2边缘覆盖.  为了生成一个汇编函数的多个序列,从已经内联扩张的控制流程图中随机采样所有的边,直到原始图中的所有边都被覆盖。对于每条采样边,将它们的汇编代码串联起来,形成一个新的序列。这样,可以确保控制流程图被完全覆盖。及时控制流程图中的基本快被分割或者合并,模型也可以产生类似的序列。

1.3随机路线.  CACompare[13]使用随机输入序列来分析汇编函数的I/O行为,随机输入模拟有效执行流上的随机路线。受此方法的启发,本文通过在已经扩展的CFG上用填充多个随机路线的方式针对一个汇编函数进行扩展汇编序列。Dominator是一个在控制流分析和编译器优化中广泛使用的盖帘。如果一个基本必须通过另一个基本块才能到达另一个基本块,那么该基本块就占主导地位。多个随机游走将使覆盖主导其他块的基本块(主导块)的概率更高。这些主导块可以指示循环机构,也可以覆盖重要分支条件。使用随机路线可以被认为是一种自然方法来优化处理那些主导块。

第二部分主要是训练的过程,评估的流程,以及实验所用的相关配置。

训练过程算法如下:

  算法1针对存储库中的每一个函数,通过边采样和随机路线的方式生成了序列。对于每个序列,它遍历每个指令并应用Asm2Vec更新向量(第10行到第19行)。如算法1,训练过程不需要等效汇编函数之间的ground-truth映射。

  对于给定一个查询ft,用一个向量表示它,初始化为接近0的很小值。然后用神经网络遍历关于此函数的每一个序列和每一条指令。在每一个预测步骤中,针对token t生成的两个向量t,和t1(用来做预测的),只传播错误给查询ft向量,整个训练结束后,就有了函数ft的向量和属于存储库中函数的向量和所有tokens字典D中由token t生成的两个向量t, t1组成的向量相同,搜索匹配的衡量,通过计算向量之间的余弦相似度。

  可扩展性对于二进制克隆搜索很重要,因为存储库中可能有数百万个程序集函数,在大规模的汇编代码上训练Asm2Vec是可行的。一个类似的文本模型已经被证明可以扩展到数十亿个文本样本来训练[21]。在本文研究中,使用成对相似性来搜索最近邻居。在低维固定长度向量之间进行两两搜索是快速的。

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(一)

    接着上一篇,现在明确问题:在汇编克隆搜索文献中,有四种类型的克隆[15][16][17]:Type1.literally identical(字面相同):Type2.syntactically equ ...

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

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

  3. [LeetCode] 108. Convert Sorted Array to Binary Search Tree 把有序数组转成二叉搜索树

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  4. [LeetCode] 109. Convert Sorted List to Binary Search Tree 把有序链表转成二叉搜索树

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  5. LeetCode 108. Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目 ...

  6. [leetcode]426. Convert Binary Search Tree to Sorted Doubly Linked List二叉搜索树转有序双向链表

    Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers ...

  7. [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  8. [LeetCode] 240. Search a 2D Matrix II 搜索一个二维矩阵 II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

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

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

随机推荐

  1. 「造个轮子」——cicada 设计一个配置模块

    前言 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口.路由的配置. 因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议. 最终其实还是按照我之前的想法来做了 ...

  2. 死磕 java集合之TreeMap源码分析(一)- 内含红黑树分析全过程

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历. 继承体系 Tr ...

  3. 【java设计模式】(5)---装饰者模式(案例解析)

    设计模式之装饰者模式 一.概念 1.什么是装饰者模式 装饰模式是在不使用继承和不改变原类文件的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.    这一个解释 ...

  4. jenkins修改数据存放路径

    如果是用tomcat做容器的话,则在./bin/catalina.sh文件添加以下语句即可:export JENKINS_HOME="存放路径(需存在)" 例如:

  5. C#版 - Leetcode 414. Third Maximum Number题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  6. C++版 - Leetcode 400. Nth Digit解题报告

    leetcode 400. Nth Digit 在线提交网址: https://leetcode.com/problems/nth-digit/ Total Accepted: 4356 Total ...

  7. c# 中的封装、继承、多态详解

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  8. 手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志

    前言 不久前,因为需求的原因,需要实现一个操作日志.几乎每一个接口被调用后,都要记录一条跟这个参数挂钩的特定的日志到数据库.举个例子,就比如禁言操作,日志中需要记录因为什么禁言,被禁言的人的id和各种 ...

  9. leetcode — valid-palindrome

    /** * Source : https://oj.leetcode.com/problems/valid-palindrome/ * * * Given a string, determine if ...

  10. Perl IO:read()函数

    read()函数 read()函数用于从文件句柄中读取指定字节数的数据并写入到一个标量中.如果文件句柄是以Unicode方式打开的,则表示读取指定字符数而非字节数. 有两种read方式: read F ...