VIBRANT:用于二进制相似性检测的可视化内存表示分析方法
《Journal of Systems and Software》:VIBRANT: Visual in-memory representation analysis for binary similarity detection
【字体:
大
中
小
】
时间:2026年07月22日
来源:Journal of Systems and Software 3.8
编辑推荐:
摘要:二进制代码相似性检测在逆向工程、漏洞检测以及恶意软件分析中至关重要,尤其是在没有源代码的情况下。尽管基于深度学习的方法已取得一定进展,但大多数方法并未能够准确捕捉真实的运行时行为,这限制了它们在处理优化和混淆后的代码时的执行语义建模能力。我们提出了VIBRANT这一BCSD
摘要:二进制代码相似性检测在逆向工程、漏洞检测以及恶意软件分析中至关重要,尤其是在没有源代码的情况下。尽管基于深度学习的方法已取得一定进展,但大多数方法并未能够准确捕捉真实的运行时行为,这限制了它们在处理优化和混淆后的代码时的执行语义建模能力。我们提出了VIBRANT这一BCSD框架,该框架将函数执行轨迹表示为内存状态演化视频,并利用孪生3D卷积神经网络来计算相似度。通过建模细粒度的动态内存变化,VIBRANT能够在具体执行过程中对内存状态演化进行建模,从而为二进制函数提供更丰富的行为表征。我们实现了VIBRANT,并将其与现有的最先进方法进行了对比测试。实验结果表明,VIBRANT在跨优化和抗混淆匹配方面具有更高的准确率,同时在现实世界的漏洞搜索场景中也表现出良好效果。
引言:二进制代码相似性检测能够识别两个二进制代码片段(如函数)之间的相似程度。作为二进制分析中的基础技术,BCSD被广泛应用于各种现实世界的安全应用中。例如,受知识产权保护的二进制文件与可疑二进制文件之间的相似性可能表明存在软件抄袭的情况;同样,通过将待分析二进制文件中的函数与漏洞特征库进行匹配,也可以识别出已知的易受攻击函数。此外,BCSD还被广泛用于恶意软件检测、第三方库检测、许可证违规检测、取证分析以及补丁分析等领域。
从可执行文件中提取语义本身就十分困难,而在编译多样性(如不同的优化策略和工具链)以及有意进行的代码转换(如混淆处理)情况下,相似性评估更是极具挑战性。传统的BCSD方法依赖于指令序列和控制流图等静态的句法或结构特征,这类方法较为脆弱——编译器的优化和转换虽然可能改变代码的句法和结构,但却不会影响其功能表现。而当代码的可见性降低时,比如经过剥离处理的二进制文件、经过过度优化的代码或经过打包处理的代码,静态方法的效果会更差。例如,UPX之类的打包工具会隐藏代码内容,使得无法通过静态分析恢复原始的指令流,从而严重限制了纯粹的静态分析方法的应用。
为提升鲁棒性,一些动态方法开始比较函数的执行语义。早期的研究方法是让两个函数在相同的输入上执行,然后比较输出结果,但仅比较输出会忽略许多有用的中间状态。基于轨迹的方法则是在预定义的输入上执行函数,并收集描述运行时行为的轨迹信息,如内存访问情况或函数调用行为。然而,许多动态方法仍然依赖手工设计的特征,这些特征需要相关领域的专业知识,而且可能无法捕捉到细粒度的语义信息,从而限制了方法的准确性和泛化能力。
深度学习的出现为BCSD带来了新的发展,它减少了人工特征工程的需求。大多数方法将代码嵌入到向量空间中,通过计算向量空间中的距离来衡量相似性。以往的研究要么学习指令级的语义特征,要么学习控制流图级别的表示形式,还有一些方法则结合了语义和结构信息。尽管这些方法取得了不错的效果,但仍然存在一些局限性:大多数学到的表示形式主要是静态的,对于编译多样性及各种代码转换的适应性不足。那些试图融入动态信息的方法,往往依赖手工提取的特征或不完整的轨迹信息,这可能无法准确捕捉真实的执行语义。因此,要实现可靠的相似性检测,就需要找到能够全面且准确地反映函数动态行为的表示方法。
在本文中,我们提出了VIBRANT这一基于内存视频的新方法,旨在解决上述问题,为现实世界中的二进制代码相似性检测提供有力支持。当函数执行时,其内存状态会随着指令流的推进而不断变化,这些状态变化构成的轨迹便反映了函数的运行时行为。每个状态都包含了全局内存、栈内存和堆内存区域中的信息,从而提供了关于变量变化、函数调用模式以及动态数据结构生命周期的多元视角。我们将每个内存状态转换为结构化的视觉表示形式——即灰度图,并将整个执行轨迹视为一部视频,这样基于视觉的模型就能够学习到函数的运行时语义。
VIBRANT主要针对一种常见的BCSD应用场景,即通过保持语义不变的二进制转换(如编译器优化和代码混淆)产生的语义等价函数。我们并不涉及更广泛的问题,即独立实现的函数之间是否具有功能等价性——因为这类情况并不在我们当前的数据集中,也不属于本研究的范畴。具体而言,我们会让两个二进制函数在完全相同的输入和环境中执行,从而收集它们的执行轨迹。随后,我们将每条轨迹转换为内存视频,并使用由两个共享权重的3D卷积神经网络组成的孪生网络来处理这些视频对。与那些依赖手工设计特征或忽视时间依赖性的方法不同,我们的3D-CNN模型能够同时建模空间结构(如不同内存区域)和时间演化过程(如函数状态的变化),从而学习到能够捕捉跨区域关联和状态转换规律的时空嵌入向量。最后,该孪生网络会输出两个函数之间的相似度得分,帮助我们在经过语义保持型二进制转换后的函数中对等价函数进行匹配。
VIBRANT通过比较特定输入下的执行轨迹来实现基于轨迹细粒度的函数匹配,这种方法在处理那些行为取决于输入条件的场景时非常有用,比如那些受功能标志控制或依赖配置参数的逻辑模块。虽然VIBRANT可以配合任何能够生成有效输入的机制使用,但在实际实现中,我们采用了开发者提供的测试套件,以便于开展测试工作。
我们实现了VIBRANT,并在现实世界的BCSD任务上将其与现有的最先进方法进行了对比测试。实验结果显示,VIBRANT在跨优化和抗混淆函数匹配方面的精度分别比最强的基准方法高出19.0%和11.2%。在现实世界的漏洞搜索任务中,VIBRANT的精确度也比现有最先进方法高出了14.3%。综上所述,我们的主要贡献包括:首先,我们提出了基于内存状态视角的执行语义表示方法,将执行轨迹编码为内存视频,从而提供了超越传统仅基于语义或结构信息的静态表示的更为全面的动态特征;其次,我们将BCSD问题转化为内存视频间的比较问题,并设计了能够学习时空嵌入向量的3D-CNN孪生网络,用于计算函数相似度;最后,我们实现了VIBRANT并公开了其原型代码,大量实验结果表明,该方法相比现有的最先进方法具有显著的优势。
问题定义:BCSD是一项旨在估算二进制函数之间相似程度的基础任务。在本研究中,我们关注的是在保持语义不变的二进制转换条件下的相似性评估,这类转换包括跨编译器的优化处理以及代码混淆操作。需要指出的是,此处所讨论的相似性概念仅限于在 such转换作用下、从同一源代码功能衍生出的不同二进制版本之间的相似性,因此这种相似性更接近于“经过转换后的等价性”,而非传统的BCSD概念。
传统BCSD方法:由于二进制相似性分析是逆向工程和代码重构成效的核心技术,因此相关研究十分丰富。现有的技术通常被分为静态方法和动态方法两类,前者仅依据反汇编后的代码来推断相似性,后者则结合运行时的实际数据来进行相似性判断。
整体架构:图1展示了VIBRANT的整体框架。对于给定的两个二进制函数,VIBRANT会在相同的输入和执行环境下让它们运行,通过跟踪整个执行过程中的内存状态来捕捉它们的动态行为,随后再利用孪生网络来评估在保持语义不变的转换条件下的相似性。具体而言,VIBRANT会在每条指令执行完成后记录当前的内存状态,也就是进程地址空间中的数值,之后我们将这些内存数值进行转换……
实验环境:我们在一台运行着Ubuntu 22.04操作系统的服务器上对VIBRANT进行了测试,该服务器配备了AMD EPYC 9754处理器、1.5 TB的RAM内存以及八块NVIDIA L20显卡。
评估方式:我们的评估工作围绕以下六个研究问题展开:第一,VIBRANT在检测函数对之间的相似性时具有多高的准确率?第二,VIBRANT与现有的最先进方法相比表现如何?第三,当函数库的大小不同时,VIBRANT和各类基准方法的性能有何差异?第四,不同的内存视频表示形式以及孪生网络架构会对VIBRANT的检测效果产生怎样的影响?第五,实验设置因素又会如何影响检测结果?
有效性威胁:一个可能影响研究有效性的因素在于我们数据集中所包含的程序类型。目前版本的VIBRANT仅支持可执行的二进制文件,无法直接处理独立的库文件——比如Trex数据集中的LibTomCrypt、SQLite和Zlib等库。出现这一限制的原因是,库函数通常不会独立执行,它们依赖于外部应用程序的调用以及运行时的上下文环境。不过,通过构建最小化的库测试案例,或许可以缓解这一问题。
局限性与讨论:目前,VIBRANT仅用于评估在保持语义不变的转换条件下的二进制代码相似性,这类转换主要包括编译器优化和代码混淆处理。因此,我们的评估重点在于处理那些不受转换影响的函数匹配问题,而非更广泛的语义相似性检测。虽然我们采用的基于内存轨迹视频的3D-CNN技术有可能在一定程度上捕捉到超出严格功能等价之外的语义相似程度,但要验证这一假设,还需要一个包含语义上相似但功能并不完全等价的函数对的测试基准集……
结论:我们提出了VIBRANT这一二进制代码相似性检测框架,该框架能够从执行轨迹中学习函数的动态执行语义。VIBRANT会将函数的运行时行为编码为内存视频,再通过采用3D-CNN编码器的孪生网络结构来学习时空嵌入向量,从而实现相似性度的量化评估。实验结果表明,无论是在跨优化还是跨混淆的测试环境中,VIBRANT的表现始终优于现有的最先进方法,同时在现实世界的应用场景中也展现出了良好的实用性。
作者贡献说明:王泽旭负责文章的写作、修订与编辑工作,以及原始稿件的撰写、软件实现和方法论设计;童伟远负责写作、修订与编辑,原始稿件撰写、方法验证以及整体方法论设计;方建斌负责写作、修订与编辑,以及原始稿件撰写工作;陈云天负责软件实现、方法论设计以及数据整理工作;王伟负责写作、修订与编辑,同时还承担监督工作、概念构思以及项目管理工作;唐占勇则负责写作、修订与编辑,同时承担监督职责、项目管理工作、资金筹措工作以及概念构思工作。
利益冲突声明:各位作者声明自己不存在任何可能影响本研究结果的已知财务利益或个人关系。
致谢:本研究得到了中国国家自然科学基金(项目编号为62372373)的支持。
作者名单:王泽旭、童伟远、方建斌、陈云天、王伟、唐占勇
单位:西北大学计算机科学学院,高级计算与软件安全西安重点实验室,中国西安710127
生物通微信公众号
生物通新浪微博
今日动态 |
人才市场 |
新技术专栏 |
中国科学人 |
云展台 |
BioHot |
云讲堂直播 |
会展中心 |
特价专栏 |
技术快讯 |
免费试用
版权所有 生物通
Copyright© eBiotrade.com, All Rights Reserved
联系信箱:
粤ICP备09063491号