0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二进制代码相似度比较研究技术汇总

清欢科技 来源:清欢科技 作者:清欢科技 2022-10-13 08:59 次阅读

在对二进制应用程序进行安全分析过程中,二进制代码相似度比较技术是重要的技术手段之一,基于此技术,可以实现对恶意代码极其变种的追踪,已知漏洞检测、补丁存在性检测。该技术基础理论依据是如果源代码中存在的属性(恶意代码、已知漏洞、漏洞修复补丁)即使相同源代码编译出不同的二进制代码(cpu架构、OS、编译选项等会直接导致编译出来的二进制会存在较大的差别),这些属性在二进制代码中也是存在的(好像是废话,不然编译构建工具就有问题了)。因此若在一个样本二进制文件中已知存在上述类型的属性,如果发现另外一个待检测二进制代码和样本二进制代码相似,那么可以认为待检测二进制代码也存在相同类型的属性。

我们知道编译生成二进制代码的影响因素非常的多,同一套源代码基于不同因素的组合可以生成非常多不同二进制程序。

CPU架构:X86、ARM、MIPS、PPC、RISC-V;

架构位数:32bits、64bits;

OS:Linux、Windows、Android鸿蒙、VxWork;

编译选项:O0~O3;

安全编译选项:BIND_NOW、NX、PIC、PIE、RELRO、SP、FS、Ftrapv等;

按这些选项可以有5x2x5x4x8 =1600个组合,从中可以看出二进制代码相似度比较技术不管是学术界还是工业界来说都是一个挑战技术。但是基于广阔的应用前景,20多年来学术界一直在不停的探索和研究新的方法想来解决这个技术挑战,并且也取得了一定的成果,下面就该方面的技术进行一些梳理,让大家对二进制代码相似度比较技术有一个大致的了解。

源代码到二进制代码的生成过程

pYYBAGNGp_2Ab1jJAAClwC8Ks0Y533.png

从源代码编译生成二进制过程中,有很多有助于理解代码意图的信息会被丢失,比如:函数名称、变量名称、数据结构定义、变量类型定义、注释信息等;因为二进制代码是给CPU运行用的,因此这些信息对计算机来说不是必须的,但这些信息对人类来理解代码是有很大帮助的,这就大大的提升了二进制代码语义理解的难度。其次,为了更好的保护二进制代码的知识产权或最大程度的提升对二进制代码的理解难度,还会对二进制代码进行混淆处理,使得混淆后的二进制代码与编译器编译出来的二进制之间又存在很大的不同。

从历史发表的二进制代码相似度比较技术论文统计来看,有61种二进制代码相似性比较方法,这些在不同研究场所发表的数百篇论文涵盖了计算机安全、软件工程、编程语言和机器学习等计算机科学领域,主要发表在IEEE S&P、ACM CCS、USENIX Security、NDSS、ACSAC、RAID、ESORICS、ASIACCS、DIMVA、ICSE、FSE、ISSTA、ASE、MSR等顶级刊物上。根据上述论文得到如下统计数据:

输入比较:一对一(21种)、一对多(30种)、多对多(10种);

比较方法:大多数方法使用单一类型的比较:相似性(42种)、等效性(5种)和相同(2种);即使方法中仅使用一种类型的比较,它也可能有不同的输入比较不同;

分析粒度:分为输入粒度、方法粒度;有8中不同的比较粒度,分别是指令级、基本快、函数以及相关集合、执行轨迹、程序。最常见的输入粒度是函数(26个),然后是整个程序(25个)和相关的基本块(4)。最常见的方法粒度是函数(30个),然后是基本块(20);

语法相似性:通过语法方法来捕获代码表示的相似性,更具体地说,它们比较指令序列。最常见的是序列中的指令在虚拟地址空间中是连续的,属于同一函数。

语义相似性:语义相似性是指所比较的代码是否具有类似的效果,而语法相似性则是指代码表示中的相似性。其中有26种计算语义相似度的方法。它们中的大多数以基本块粒度捕获语义,因为基本块是没有控制流的直线代码。有三种方法用于捕获语义:指令分类、输入-输出对和符号公式。

结构相似度:结构相似性计算二进制代码的图表示上的相似性。它位于句法和语义相似性之间,因为图可以捕获同一代码的多个句法表示,并可以用语义信息注释。结构相似性可以在不同的图上计算。常见的有控制流图CFG、过程间控制流图ICFG、调用图CG;(子)图同构—大多数结构相似性方法是检查图同构的变化,其中涉及到方法有K子图匹配、路径相似性、图嵌入。

基于特征的相似度:计算相似性的常见方法(28种)是将一段二进制代码表示为向量或一组特征,使得类似的二进制代码具有相似的特征向量或特征集。这里应用最多的是利用机器学习来实现。

Hash匹配相似度:对于多维向量数据相似度快速匹配,通常使用局部敏感hash算法LSH来实现。

跨架构比较方法:对不同CPU架构二进制代码的相似度比较,通常跨体系结构方法通过计算语义相似性来实现。方法之一是通过转换成与架构无关的中间语言IR来处理(7种),另外一种是使用基于特征的相似性方法(9种)。

分析类型:从分析类型来看有:静态分析、动态分析、数据流分析3种类型;

归一化方法:语法相似性方法通常会对指令进行规范化,来尽量减少语法上的差异;有33种方法使用指令规范化。具体的包括操作数移除法、操作数归一化法、助记符归一化法

论文发表的时间、发表刊物、技术方法汇总

poYBAGNGqAWABLO7AARTgKRVwF8195.png

不同二进制代码相似度比较方法的具体应用情况

pYYBAGNGqAmADxvWAADoMUuBQ_s268.png

从上表中可以看出二进制代码相似度比较主要应用于漏洞查找,其次是补丁分析和恶意代码分析;

针对上述不同的技术方法,分别从鲁棒性、准确度评估与比较、性能指标3个维度进行评测,结果如下:

poYBAGNGqA6ARnB9AARbK0K2eBU214.png

总结:二进制代码相似性比较技术随着研究的持续进行,学术界虽然取得的一定的进步和成果,但仍然还有很多挑战在等着攻克,小片段的二进制代码比较,源代码与二进制的相似度比较、数据相似度比较、语义关系、可扩展性、混淆、比较方法等等都是后续需要持续研究的方向。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    795

    浏览量

    41643
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68524
收藏 人收藏

    评论

    相关推荐

    hex格式和二进制的区别

    HEX格式和二进制在多个方面存在显著的区别。以下是对这两者的对比: 一、定义与表示方式 HEX格式 : HEX,全称为Intel HEX,是一种用于存储和传输数据到嵌入式系统(如单片机)的文件格式
    的头像 发表于 11-18 15:24 452次阅读

    ASCII码和二进制的转换关系

    。ASCII码使用7位二进制数来表示128个不同的字符,包括大小写英文字母、数字0-9以及一些控制字符和标点符号。后来,ASCII码被扩展到了8位,即ASCII-8BIT,可以表示256个不同的字符。 二进制
    的头像 发表于 11-10 09:50 1020次阅读

    二进制编码器的精度与分辨率

    编码器是一种将模拟信号(如电压、温度等)转换为二进制代码的设备。它通常包含一个模数转换器(ADC),该转换器通过比较输入信号与一系列参考电压来确定输入信号的值。编码器的输出是一个二进制
    的头像 发表于 11-06 09:56 350次阅读

    二进制编码器在机器人中的应用

    二进制信号,为机器人提供精确的状态信息。 二进制编码器的工作原理 二进制编码器是一种将物理量(如位置、速度等)转换为二进制代码的设备。在机
    的头像 发表于 11-06 09:48 375次阅读

    二进制编码器的种类及特点

    二进制编码器是一种电子电路,用于将二进制信号转换为其他格式,如十进制、格雷码等。以下是一些常见的二进制编码器种类及其特点: 优先编码器(Priority Encoder) : 特点 :
    的头像 发表于 11-06 09:47 459次阅读

    二进制编码器应用场景 二进制编码器与模拟编码器比较

    限性。 二进制编码器概述 二进制编码器是一种将输入信号转换为二进制代码的设备。它通常用于数字系统中,将模拟信号或非二进制信号转换为
    的头像 发表于 11-06 09:45 387次阅读

    二进制编码器工作原理 如何选择二进制编码器

    二进制编码器是一种数字电路,它将输入的二进制代码转换为对应的输出信号。在数字系统中,编码器用于将数据从一种形式转换为另一种形式,以便于处理和传输。 二进制编码器工作原理 输入与输出关系
    的头像 发表于 11-06 09:44 669次阅读

    二进制处理中的一些技巧

    二进制和十进制的处理中,有时候一些小技巧是很有用的。 1、把十进制数转换成二进制数 (1)在MATLAB中有一个函数dec2bin,可以把正整数转换为2
    的头像 发表于 07-05 11:51 565次阅读

    二进制串行计数器工作原理是什么?

    在数字电路设计中,计数器是一种非常关键的组件,用于测量时间、计数事件或跟踪状态变化等。其中,二进制串行计数器作为一种常用的计数器类型,在多种应用场景中都发挥着重要作用。本文将对二进制串行计数器
    的头像 发表于 05-28 15:52 841次阅读

    如何实现二进制和BCD码数据的相互转变?

    如何实现二进制和BCD码数据的相互转变? 二进制码是将十进制数字表示为二进制数和十进制数的一种表示方法。在计算机系统中,
    的头像 发表于 02-18 14:51 3531次阅读

    鸿蒙二进制数组创建

    你data是非unsigned char。你里面的数据就会转换错乱,导致二进制的数据无法再转换成正确的字符串 代码实例 错误的代码例子:   //接收
    的头像 发表于 01-31 15:24 1265次阅读

    二进制、八进制、十六进制在现实当中有什么意义?

    二进制、八进制、十六进制在现实当中有什么意义? 二进制、八进制和十六进制在现实生活中有着广泛的应
    的头像 发表于 01-16 11:14 5363次阅读

    10进制转换为二进制的算法

    进制转换为二进制是计算机科学中非常基础且重要的概念之一。在理解和应用计算机科学的基础知识时,掌握这个算法是至关重要的。 在开始讲解十进制转换为二进制的算法之前,让我们回顾一下十
    的头像 发表于 01-15 10:32 3264次阅读

    10进制转换为二进制的算法

    二进制的算法可以分为两个步骤:整数部分转换和小数部分转换。下面将详细介绍这两个步骤。 首先,我们来讨论整数部分的转换。整数部分的转换是比较简单的,我们可以通过不断地进行除2取余的操作来得到二进制数的每一位。 具体的步骤如下
    的头像 发表于 01-11 09:14 2346次阅读

    labview二进制字符串转数值

    LabVIEW是一种图形化编程环境,用于实时数据采集、信号处理以及自动化控制等领域。它采取了数据流编程的思想,用户可以通过将各种功能模块进行连接,轻松搭建起复杂的系统。 在LabVIEW中,二进制
    的头像 发表于 01-05 16:20 2650次阅读