Page 293 - 《软件学报》2025年第8期
P. 293
3716 软件学报 2025 年第 36 卷第 8 期
模型输入的形式. 考虑到包含程序语义的操作码序列具有顺序性、上下文依赖性并具有一定的语法结构 (例如函
数调用、条件跳转等固定的操作组合), 这与自然语言句子具有高度的相似性. 与理解自然语言句子逻辑含义时考
虑的单词顺序和含义相似, 程序中的操作码也时按照特定顺序排列, 并反映了程序的结构和逻辑. 因此考虑使用能
够理解语言上下文和语义的 BERT 自然语言处理模型帮助解析操作码序列, 并从中学习程序的语义特征表示. 由
于 BERT 的预训练任务 MLM 和 NSP 都无法直接满足本文的任务需求, MCBA 仅使用 BERT 作为编码器来获取
程序操作码字符串的向量表示形式, 并使用 [CLS] 向量作为程序特征向量. MCBA 将静态分析得到的操作码序列
组合成一个带空格的长句子, 整体输入到 BERT 进行编码处理得到代表当前样本的 [CLS] 向量, 如图 3 所示.
损失 NSP 损失 + MASK 损失
FC(21128, Softmax)
FC(2, Softmax)
归一化
FC(768,
池化层输出 tanh) FC(768,GELU)
0 1 2 3 4 5 6 … 512
隐藏状态 Transformer 编码器×12
归一化
前向传播 (3072,GELU→768)
归一化
多头自注意力 (768,12)
输入:
Attention mask 1 1 1 1 1 … … … 1
Token_type_embeddings 768 768 768 768 768 … … … 768
Position_ids 0 1 2 3 4 … … … 511
Input_ ids 101 5 589 2 694 12 827 5 378 … … … 4 944
Sentence add mov cmp jmp … … … sub
图 3 向量嵌入
操作码助记符本身极为简洁, 与自然语言有所差异. 因此考虑将其转换为更接近自然语言的词语, 例如: mov
转换为 move、jmp 转换为 jump 等. 此外, 考虑到自然语言句子本身不会过长和模型开销的实用性等因素, BERT
模型输入上限限制在 512 个单词. 然而, 虽然恶意软件的体积较小, 但其操作码数量往往超过 512 个. 现有的相关
工作 [32,33] 直接将提取的操作码按顺序截断, 只取小于 512 个操作码进行分析. 虽然这些工作已经被证明是有效的,
但这种方式会丢弃掉大量与分类任务相关的有价值信息. 考虑到 BERT 进行上下文计算生成向量的过程是资源密
集型的, 输入数据的大小无法直接扩展. 本文设计了 BERT 滑动窗口的方式进行向量嵌入, 以更多的利用程序指令
信息. MCBA 将最大输入形式的 BERT 作为滑动窗口对程序操作码字符串进行处理, 使用 512 个操作码作为一个
处理单元, 获得多个 BERT 向量输出. 然后将代表每个输出整体特征的 [CLS] 向量拼接, 生成代表整个程序的特征
向量 (如图 1 和图 3 所示). 需要注意的是虽然随着 BERT 滑动窗口数量的增加, 模型可以提取更多特征信息, 但其
所需的计算资源也将迅速增长. 经过实验 (第 4.4 节) 评估, MCBA 的 BERT 的窗口数量设置为 3 个.
3.3 基于几何中位数子空间和瓶颈自编码器的模型优化训练和分类
为了提高系统的稳定性, 提高在概念漂移场景下的性能表现, 本节对模型训练过程进行优化, 通过特征映射和
降维, 提取与任务目标相关的有效特征. 在自然语言理解领域的相关研究中, 模型在不同数据集上的性能变化一直

