浅述机器学习在源代码分析上的应用
字数 1951 2025-08-18 11:39:00
机器学习在源代码分析中的应用教学文档
一、背景介绍
源代码分析是信息安全领域的重要组成部分,特别是在恶意代码检测方面。随着机器学习技术的发展,其在源代码分析领域的应用日益广泛。本教学文档将系统介绍机器学习在源代码分析中的各种应用方法。
二、传统源代码分析方法
1. 正则表达式匹配
- 通过编写特定规则模式检测恶意代码
- 示例规则:
'(array_map[\s\n]{0,20}\(.{1,5}(eval|assert|ass\\x65rt).{1,20}\$_(GET|POST|REQUEST).{0,15})' '(call_user_func[\s\n]{0,25}\(.{0,25}\$_(GET|POST|REQUEST).{0,15})'
2. 信息熵方法
- 基于编码前后内容信息熵差异检测Webshell
- 计算公式:
H(X) = -ΣP(xi)log2P(xi) - 工具示例:NeoPI
3. 模糊哈希(CTPH)
- 用于文件相似性比较
- 工作原理:
- 使用弱哈希计算文件局部内容
- 特定条件下对文件分片
- 使用强哈希计算每片哈希值
- 连接部分哈希值与分片条件构成结果
三、基于特征提取的机器学习方法
1. 主观特征提取
- 需要领域专家参与选取特征
- PHP Webshell检测特征示例:
| 文档特征 | 基本特征 | 高级特征 |
|---|---|---|
| 单词数量 | 注释数量 | 文件操作数量 |
| 不同单词数量 | 字符操作函数数量 | ftp操作数量 |
| 行数 | 执行类函数调用次数 | 数据库操作数量 |
| 平均每行单词数 | 系统函数调用数量 | ActiveX控件调用数量 |
四、自然语言处理技术在源代码分析中的应用
1. N-Grams模型
- 经典自然语言处理技术
- 简化概率计算:
P(w1,w2,...,wT) ≈ ΠP(wi|wi-n+1,...,wi-1) - 应用实例:Google Ngram Viewer
2. 条件随机场(CRF)
- 概率无向图模型
- 关键概念:
- 马尔科夫独立性假设
- 全局马尔科夫性
- 团和最大团
- 词性标注示例:
定义特征函数: f3: li-1是介词且li是名词时=1,否则=0 f4: li-1和li都是介词时=1,否则=0
3. Word2Vec
- 词向量计算工具
- 包含两种模型:
- CBoW模型:输入上下文预测词
- Skip-gram模型:输入词预测上下文
- 著名关系示例:
queen = king - man + woman
五、专门针对源代码的机器学习模型
1. 基于OP CODE的N-Grams方法
- 使用PHP VLD工具获取OP CODE序列
- 统计不同OP CODE排列的出现频率
- 将频率数据组成向量输入分类器
2. 基于CRF的变量重命名
- 分析步骤:
- 识别程序中的未知元素(变量)和已知元素(常量、函数名)
- 推导依赖关系图
- 使用训练得出的分值表确定变量名
3. 基于抽象语法树(AST)的深度学习方法
- 处理流程:
- 生成AST
- 提取AST中的路径
- 路径编码:
value_path = [value1; path; value2] - 神经网络结构:
- 全连接层:3d维→d维
- 注意力机制:
ɑi = softmax(č_i^T * attn) - 聚合代码向量:
v = Σɑi * č_i - 预测层
六、总结与展望
源代码分析技术的发展经历了从字节流到词法再到语法的演进过程:
-
字节流层面:
- 方法:正则匹配、信息熵、模糊哈希
- 特点:语言无关,但需要频繁更新规则
-
词法层面:
- 方法:N-Grams、CRF、Word2Vec
- 特点:考虑词序列,但忽略语法结构
-
语法层面:
- 方法:基于AST的路径分析
- 特点:准确率高,自适应性强,但需为每种语言开发前端编译器
未来发展方向:
- 基于语义的分析方法
- 更复杂的深度学习模型
- 跨语言通用分析框架
参考资料
- NeoPI工具:https://github.com/Neohapsis/NeoPI
- Kornblum J. Identifying almost identical files using context triggered piecewise hashing[J]. Digital Investigation, 2006
- 胡建康等. 基于决策树的Webshell检测方法研究[J]. 网络新媒体技术, 2012
- A statistical interpretation of term specificity and its application in retrieval. S Jones,2004
- Lafferty J等. Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data[J]. Proceedings of Icml, 2001
- Mikolov T等. Efficient Estimation of Word Representations in Vector Space. CoRR abs/1301.3781 (2013)
- Raychev V等. Predicting program properties from "big code"[C]. ACM Sigplan-sigact Symposium, 2015
- Alon U等. code2vec: Learning Distributed Representations of Code[J]. 2018