using System;
using System.Collections.Generic;
using System.Linq;
using MemScanEDR.Models;
namespace MemScanEDR.Services;
///
/// 无监督基线检测引擎 —— 第一层过滤
/// 使用统计异常检测方法(Z-score + 重构误差),无需恶意样本训练
/// 核心逻辑:正常程序内存结构高度规整,恶意程序偏离基线
///
public class BaselineEngine
{
private readonly BaselineLibrary _baselineLibrary;
private readonly double _globalAnomalyThreshold;
public BaselineEngine(BaselineLibrary? library = null, double threshold = 0.50)
{
_baselineLibrary = library ?? BaselineLibrary.CreateDefault();
_globalAnomalyThreshold = threshold;
}
///
/// 分析进程特征,返回异常分数和判定结果
///
public BaselineResult Analyze(MemoryFeatures features)
{
var result = new BaselineResult();
// 1. 找到最匹配的基线
var baseline = _baselineLibrary.FindBestMatch(features.ProcessName, features.ExePath);
if (baseline == null)
{
result.IsAnomalous = false;
result.AnomalyScore = 0;
result.Details = "无匹配基线,跳过异常检测";
return result;
}
result.BaselineName = baseline.Name;
// 2. 转换特征为向量
var featureVector = features.ToFeatureVector();
// 3. 计算 Z-score 异常分数 (Mahalanobis-like)
var (anomalyScore, deviantFeatures) = baseline.CalculateAnomalyScore(featureVector);
// 4. 计算重构误差
var reconstructionError = baseline.CalculateReconstructionError(featureVector);
// 5. 综合分数:Z-score 异常 + 重构误差加权
var combinedScore = anomalyScore * 0.6 + reconstructionError * 0.4;
combinedScore = Math.Min(combinedScore, 1.0);
result.AnomalyScore = combinedScore;
result.DeviantFeatureCount = deviantFeatures.Count;
result.DeviantFeatureIndices = deviantFeatures;
result.ReconstructionError = reconstructionError;
result.IsAnomalous = combinedScore > _globalAnomalyThreshold;
// 6. 生成可解释性说明
result.Details = GenerateExplanation(features, baseline, deviantFeatures, combinedScore);
// 7. 判定分类
result.Classification = combinedScore switch
{
< 0.25 => BaselineClassification.Normal,
< 0.50 => BaselineClassification.BenignVariance,
< 0.75 => BaselineClassification.Anomalous,
_ => BaselineClassification.HighlyAnomalous
};
return result;
}
///
/// 快速预判 —— 仅基于元数据,不读内存
///
public BaselineResult QuickPreAnalyze(ProcessInfo proc, List regions)
{
var extractor = new FeatureExtractor();
var features = extractor.QuickExtract(proc, regions);
return Analyze(features);
}
private static string GenerateExplanation(MemoryFeatures f, BaselineProfile baseline,
List deviantFeatures, double score)
{
var parts = new List();
if (score < 0.25)
{
parts.Add("进程内存结构符合正常程序基线");
return string.Join("; ", parts);
}
// 命名特征索引对应的含义
var featureNames = new Dictionary
{
{0, "未签名"}, {1, "非系统路径"}, {2, "临时路径"},
{5, "系统进程名"}, {6, "父进程异常"},
{12, "RWX页比例高"}, {13, "匿名可执行页"}, {14, "RWX私有页"},
{18, "内存PE头"}, {19, "PE与磁盘不一致"},
{20, "可疑API"}, {21, "敏感字符串"}, {22, "签名匹配"}, {23, "高危签名"},
{24, "高熵代码段"}, {25, "最大熵值"}, {26, "高熵区域数"},
{29, "非标准端口连接"}, {30, "可疑端口"}, {31, "境外连接"},
{35, "无磁盘映射模块"}, {36, "临时目录模块"}
};
foreach (var idx in deviantFeatures.Take(5))
{
if (featureNames.TryGetValue(idx, out var name))
parts.Add(name);
}
parts.Add($"异常分数={score:F2}");
if (f.RwxPrivatePages > 0 && f.IsSystemProcessName)
parts.Insert(0, "严重警告: 系统进程存在RWX私有内存");
if (f.PeMismatchDisk)
parts.Insert(0, "严重警告: Process Hollowing 检测");
return string.Join("; ", parts);
}
}
///
/// 基线检测结果
///
public class BaselineResult
{
/// 使用的基线名称
public string BaselineName { get; set; } = "";
/// 综合异常分数 [0-1]
public double AnomalyScore { get; set; }
/// 是否判定为异常
public bool IsAnomalous { get; set; }
/// 偏离特征数量
public int DeviantFeatureCount { get; set; }
/// 偏离特征索引列表
public List DeviantFeatureIndices { get; set; } = new();
/// 重构误差
public double ReconstructionError { get; set; }
/// 分类结果
public BaselineClassification Classification { get; set; }
/// 可解释性详情
public string Details { get; set; } = "";
}
///
/// 基线分类结果
///
public enum BaselineClassification
{
/// 完全正常
Normal,
/// 良性偏差(如开发工具、安全软件的正常表现)
BenignVariance,
/// 异常偏离基线
Anomalous,
/// 高度异常
HighlyAnomalous
}