多维代码特征提取技术浅析

最近我把《代码审计 C/C++实践》一书中关于描述SCA工具的技术点之一——多维代码特征提取技术重新阅读了一下,理解一下多维代码特征提取技术以及在SCA工具中的运用。

SCA工具需要对知识库(或称为源库我认为更合适)中的软件代码提取特征值,特征值提取分为五个级别,包括函数级、类级、文件级、包级和项目级。根据同源匹配粒度的精度选项,产品可以根据不同的特征值算法建立起相应特征值并入库建立索引,这些特征值索引库就是我们所说的同源分析中的源,是同源分析的基础。

特征值索引库生成技术从函数、类、文件、包、项目五个级别提取相应的特征值,这些特征值就是大家所说的代码指纹。下面我们对5个级别分别进行简单阐述。

一、函数级提取特征

原始代码会首先经过词法分析器,提取标识符、常量、关键字、运算符等标识单元,然后利用符号表进行规范化处理,以此生成函数级特征指纹。在函数级别抽取的特征包括:函数编号、函数代码的摘要值、函数包含的词法标识、函数的抽象语法树特征向量、函数程序依赖图的特征向量、对应源文件开始的行号、对应源文件结束的行号、函数描述文本等。

二、类级提取特征

在类级别抽取的特征包括:类编号、类代码的摘要值、类包含的词法标识、类的抽象语法树特征向量、类的程序依赖图的特征向量、对应源文件开始的行号、对应源文件结束的行号、类描述文本。

三、文件级提取特征

在文件级别抽取的特征包括:文件编号、文件代码的摘要值、文件包含的词法标识、文件的程序依赖图的特征向量、文件的描述文本。

四、包级提取特征

包是一个汇总特征,在包级别抽取的特征包括包编号、包下属的文件、类和函数特征,以及包的描述文本。

五、项目级提取特征

项目也是一个汇总特征,在项目级别抽取的特征包括项目编号、项目下属的包级别的特征,以及项目的描述文本。

基于特征库的匹配算法,则是从文本、标识、语法、语义四个方面进行匹配,称为指纹匹配算法。在每个方面存在三种匹配方式,第一种是依据摘要的匹配方式;第二种是依据特征向量或特征向量哈希值的匹配方式;第三种是针对标识袋(Bag-of-tokens)的部分索引的匹配方式。

(1)基于文本摘要的识别匹配算法

对于摘要特征,匹配算法可以精确匹配到相同摘要值的函数、类、文件以及包含该函数、类、文件的包和项目。

(2)基于词法的识别匹配算法

对于词法分析生成的标识袋特征,匹配算法可以利用其部分索引快速定位相似的函数、类、文件以及包含该函数、类、文件的包和项目。

(3)基于语法的识别匹配算法

对于语法分析生成抽象语法树的特征向量或其哈希值特征,匹配算法可以近似定位目标函数、类以及包含该函数、类的文件、包和项目。

(4)基于语义的识别匹配算法

对于语义分析生成程序依赖图或值依赖图的特征向量或其哈希值特征,匹配算法可以近似定位目标函数、类以及包含该函数、类的文件、包和项目。

各个级别对象所使用的特征提取方法如下表所示。

其中对应级别对象直接使用的特征提取方法用“√”表示,通过推导方式来提取特征的用“〇”表示,不适用相应级别对象的特征提取方法用“×”表示。

表   各级别对象的特征提取方法

特征提取

方法

 对象           

文本

标识

语法

语义

函数

×

×

文件

项目

下面按照上面表中的不同对象进行提取方法简单描述。

(1)函数级别的特征提取

函数级别的特征通过标识、语法和语义等特征提取方法提取,下面分别描述。

首先通过标识计算函数特征。需要将源代码仓库中的代码片段解析为<符号,频数>的集合并存储,而对于二进制代码,首先需要对二进制代码进行反汇编,依据汇编代码提取代码片段集合。每个代码片段有全局唯一的ID,通过统计所有的符号,生成全局符号频数表。接着利用在关键技术部分介绍的“子块重叠过滤”的思想,建立“部分索引”,具体过程如下:

设相似度为θ,为平衡精确度和召回率,θ可取70%;

查询全局符号频数表,将代码片段中的符号按全局频数升序排列;

设代码片段中总符号数为N,选取前N - θN + 1个符号,建立符号-代码片段的反向索引。

其次通过语法计算函数特征。通过构建源代码函数级别的抽象语法树,以及二进制代码对应汇编代码的控制流图,构建语法级别的特征向量,并将特征向量存入数据库。抽象语法树上的特征分为树的节点个数、深度以及树的前向遍历顺序等类别,函数控制流图上的特征分为如下两类:

跳转指令。具体地,本项目将跳转指令分为个数、位置与跳转目标

位置三个维度,其中位置和跳转目标位置使用相对位置进行编码,能够较为准确地抽象控制流图中的控制流特征。

函数调用指令。该特征能够一定程度刻画函数的功能,例如如果仅调用字符串拼接函数,可能执行的是字符串操作功能。基于控制流图中的跳转指令特征和函数调用特征,以函数为单位计算特征值。这一步将特征向量计算为局部敏感的哈希值。

最后通过语义计算函数特征。首先对源代码进行值依赖分析。对二进制代码而言,仅反汇编是不够的,因为汇编代码在不同的指令架构中以及不同的操作系统中均有不同的结构,为构建统一的值依赖模型带来困难。为克服这个问题,本项目基于中间语言对二进制代码建立值依赖模型。国际上已存在很多类型中间语言,例如RREIL、Vine、BAP、LLVM IR等。本项目将基于RREIL语言实现二进制代码到中间语言的提升,从而消除指令架构、操作系统等在值依赖上的差异,使用统一的框架分析值依赖关系。对源代码或中间代码对应的中间表示进行进一步的值依赖分析,计算常量值并去除不可达路径,从而将中间代码进一步归一化,按照值依赖的依赖关系(即依赖图中的指向关系),构建各依赖子图上的特征向量,存入数据库。

对二进制代码而言,根据编译选项,同一个源代码可以有多个二进制目标码的表现形式。通常要考虑到几个重要的编译选项类别,比如目标平台、调试与否、动态或静态链接,以及其他一些优化选项,而且不同的编译器的特点也不尽相同。因此,需要就二进制的多种编译状态进行函数特征提取,从而能够判断多个编译器、多个编译选项的二进制文件,实现识别匹配。

(2)类级别的特征提取

如果分析的是面向对象语言的源代码,则类级特征通过函数特征推导得出。同时计算匹配到的函数占类中所有函数的比例,根据阈值决定类级的推导结果。

(3)文件级别的特征提取

文件级别的特征通过文本特征提取方法提取。具体而言,首先将该项目分解为包和文件,并将包进一步分解为多个文件。文本特征通过MD5的方式求得。对于二进制代码,基于字节流的方式计算MD5值。

此外,通过类和函数级别的特征推导文件级别的特征。通过计算匹配到的类和函数占文件中所有类与函数的比例,根据阈值决定文件级的推导结果。

(4)包与项目级别的特征提取

包和项目级别的特征通过文件特征推导得出。根据上一级别得到匹配的文件的个数,计算匹配的相似度。根据预设的阈值决定包与项目级别的推导结果。

     (结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核--内存管理(一)任务空间管理

目录 一、引言 二、基本概念梳理 三、用户态进程内存管理 ------>3.1、用户态 ------>3.2、内核态 ------>3.3、内存管理结构 ------>3.4、mm_struct ------>4.5、vm_area_struct 四、内核态结构 ------>4.1、32位内核态结构 ------>4.2、64位…

全网最细!Vue3实现路由缓存~

1、设置缓存对应的数据 需要在全局状态管理中&#xff0c;或者当前组件中添加数据&#xff08;本次演示在全局状态管理中&#xff0c;使用的是 pinia&#xff09; const coreStore defineStore(coreStore, {state () {return {// 缓存页面路由数组及组件cacheRoutes: [],inclu…

2018年4月26日 Go生态洞察:Go新品牌形象及标识发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

从代码执行,看单片机内存的分配

1、单片机执行指令过程详解 单片机执行程序的过程&#xff0c;实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行&#xff0c;即取指令--分析指令--执行指令。 取指令的任务是&#xff1a;根据程序计数器PC中的值从程序存储器读…

C语言基础介绍

1. C语言基础知识 C语言是一种计算机编程语言&#xff0c;是一门用于编写系统软件和应用软件的高级语言。C语言的基础知识包括&#xff1a; 数据类型&#xff1a;C语言中的数据类型包括整型、浮点型、字符型等。 变量&#xff1a;C语言中使用变量来存储数据&#xff0c;变量必…

Spring RabbitMQ那些事(2-两种方式实现延时消息订阅)

目录 一、序言二、死信交换机和消息TTL实现延迟消息1、死信队列介绍2、代码示例(1) 死信交换机配置(2) 消息生产者(3) 消息消费者 3、测试用例 三、延迟消息交换机实现延迟消息1、安装延时消息插件2、代码示例(1) 延时消息交换机配置(2) 消息生产者(3) 消息消费者 3、测试用例 …

python类的伪私有属性__X

1 python类的伪私有属性__X python类的伪私有属性&#xff0c;是为了避免实例内的命名空间冲突。 1.1 变量名压缩__X &#xff08;1&#xff09;描述&#xff1a;python的class语句内&#xff0c;开头有两个下划线&#xff0c;但结尾没有两个下划线的变量名&#xff0c;会自…

[Linux]进程创建➕进程终止

文章目录 1.再谈fork()函数1.1fork()创建子进程 OS都做了哪些工作?1.2对上述问题的理解1.3写时拷贝进行父子进程分离的优势1.4了解eip寄存器和pc1.5了解进程的上下文数据1.6对计算机组成的理解1.7fork常规用法1.8fork调用失败的原因 2.进程终止2.1进程终止时操作系统要做的工作…

输入一个数n,输出大写字母X c++ 描述 用例输入 1 4 用例输出 1 d d c c b b a b b c c d d

输入一个数n&#xff0c;输出大写字母X c 描述 用例输入 1 4 用例输出 1 d d c c b b a b b c c d d 以下是使用C编写的输出大写字母X的程序&#xff1a; #include <iostream> #include <cmath> int main() {int n;std::cout << "请输入一个数n&…

人工智能-注意力机制之Transformer

Transformer 比较了卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;和自注意力&#xff08;self-attention&#xff09;。值得注意的是&#xff0c;自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此&#xff0c;使用自注意力…

13年老鸟总结,性能测试方法汇总+性能响应很慢排查方法(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试包含哪…

windows的bat文件(学习笔记)

简介 通过windows的cmd执行的批处理&#xff0c;扩展名可以是.bat或.cmd&#xff08;类似linux的shell脚本&#xff09; 所有语句符号不区分大小写 帮助提示信息&#xff1a;命令 /? 1 基本语法 (1) 注释&#xff1a;rem 注释文本不执行 (2) 关闭盘符输出&#xff1a;e…

Java实现-数据结构 2.时间和空间复杂度

.如何衡量一个算法的好坏&#xff1a;时间复杂度和空间复杂度 算法效率分为时间效率和空间效率&#xff0c;时间效率称为时间复杂度&#xff0c;空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数&#xff0c;它描述了算法的运行时间&#xff0c;一个算法执…

读书笔记:《宽客人生:依曼纽尔·德曼》

金融工程&#xff0c;也叫数量金融&#xff0c;洞察了证券价值与不确定性之间的关系。 布莱克-斯科尔斯模型可以告诉我们如何利用标的股票来复制期权&#xff0c;以及复制期权的成本&#xff0c;做市商利用此来复制期权&#xff0c;以规避无法从其他人那里购买合适价格的期权的…

vim+xxd编辑十六进制的一个大坑:自动添加0x0a

问题描述 今天在做一个ctf题&#xff0c;它给了一个elf文件&#xff0c;我要做的事情是修复这个elf文件&#xff0c;最后执行它&#xff0c;这个可执行文件会计算它自身的md5作为这道题的flag。我把所有需要修复的地方都修复了&#xff0c;程序也能成功运行&#xff0c;但是fl…

奇怪的问题 a==1 a==2 a==3

a 1 && a 2 && a 3 题目很简单&#xff0c;只要让if语句中的判断条件成立即可。 if (a 1 && a 2 && a 3) {console.log(win!!!); }首先分析题目&#xff0c;题目的意思只要我们能够让a同时与1,2,3相等的话&#xff0c;那么此时就成功了…

【电路笔记】-快速了电阻

电阻类型 文章目录 电阻类型1、概述2、电阻器的组成类型2.1 碳电阻器2.2 薄膜电阻器2.3 绕线电阻器 3、总结 电阻器是所有电子元件中最基本、最常用的元件&#xff0c;人们几乎认为电阻器是理所当然的&#xff0c;但它们在电路中起着至关重要的作用。 1、概述 有许多不同类型的…

SpringCloud之Gateway(统一网关)

文章目录 前言一、搭建网关服务1、导入依赖2、在application.yml中写配置 二、路由断言工厂Route Predicate Factory三、路由过滤器 GatewayFilter案例1给所有进入userservice的请求添加一个请求头总结 四、全局过滤器 GlobalFilter定义全局过滤器&#xff0c;拦截并判断用户身…

深入解析:如何开发抖音票务小程序

当下&#xff0c;开发抖音票务小程序成为了吸引年轻用户群体的一种创新方式。本文将深入解析如何开发抖音票务小程序&#xff0c;探讨关键步骤和技术要点。 1.确定需求和功能 考虑到抖音的用户特点&#xff0c;可以加入与短视频相关的票务功能&#xff0c;如在线购票、观影记录…

[网络] 3. HTTP 3 与 HTTP 2 有什么区别

协议不同 HTTP2 是基于 TCP 协议实现的 HTTP3 是基于 UDP 协议实现的QUIC HTTP3 新增了 QUIC 协议来实现可靠性的传输握手次数 HTTP2 是基于 HTTPS 实现的&#xff0c;建立连接需要先进行 TCP 3次握手&#xff0c;然后再进行 TLS 3次握手&#xff0c;总共6次握手。 HTTP3 只需要…