接着上篇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. mysql逆向生成 java 实体类

    import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.sql.Connecti ...

  2. SpringCloud(2)---SpringCloud入门篇

    SpringCloud理解篇 一.微服务概述 1.什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一 ...

  3. 经典案例复盘——运维专家讲述如何实现K8S落地

    经典案例复盘——运维专家讲述如何实现K8S落地 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上,除少数访问量 ...

  4. Lucene 07 - 对Lucene的索引库进行增删改查

    目录 1 添加索引 2 删除索引 2.1 根据Term删除索引 2.2 删除全部索引(慎用) 3 更新索引 数据保存在关系型数据库中, 需要实现增.删.改.查操作; 索引保存在索引库中, 也需要实现增 ...

  5. 【ASP.NET Core快速入门】(十六)MVC开发:DbContextSeed初始化

    前言 由于我们现在每次EF实体模型变化的时候每次都是手动更改,我们想通过代码的方式让他自动更新,或者程序启动的时候添加一些数据进去 DbContextSeed初始化 首先,在Data文件夹下添加一个A ...

  6. 【转载】CentOS 7部署ASP.NET Core应用程序

    看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不扯淡,直接进入正题.您有任何问题请在评论区留言. 1.环境 ...

  7. [解决方案]SystemError: Parent module '' not loaded, cannot perform relative import的解决方案

    缺陷:__mian__不能使用相对导入 PEP 328 Relative Imports and __name__ 中说明: Relative imports use a module's __nam ...

  8. C#线程安全使用(二)

    刚才想了半天文章应该起什么名字,最后决定起名为<线程安全使用>,线程安全这个词很难理解,感觉就像托管这词一样,但是托管翻译成英文是managed,我通常把他翻译成被管理,这样就好理解多了, ...

  9. 支持异步写入的日志类,支持Framework2.0

    因为工作需要需要在XP上运行一个C#编写的Winform插件,我就用Framework2.0,因为存在接口交互所以想保留交易过程的入参出参. 考虑到插件本身实施的因素,就没有使用Log4.NLog等成 ...

  10. Python面向对象:杂七杂八的知识点

    为什么有这篇"杂项"文章 实在是因为python中对象方面的内容太多.太乱.太杂,在写相关文章时比我所学过的几种语言都更让人"糟心",很多内容似独立内容.又似相 ...