[实践]“这不是刚才那个吗?”👯‍♂️恶意软件原始版本 vs. 变种,用AI进行基因检测(相似度分析)

大家好,各位追根究底的安全研究员们! 🕵️‍♂️

网络安全的世界是一场无休止的“捉迷藏”。当安全厂商检测到某个恶意软件时,黑客们会在几天后(甚至几小时后)发布一个稍微修改过的“变种(Variant)”。

有的是换了件外套,有的是做了“整形手术”,有的是换了武器……种类繁多。🎭

此时,分析师要确定“这个新家伙是不是以前那个?”的工作,就叫做代码相似度分析(Code Similarity Analysis)。

过去,我们不得不盯着BinDiff之类的工具,看得眼睛都快瞎了,但现在AI可以瞬间比较两段代码的“基因”。今天,我们将利用AI进行一次实践,来找出恶意软件原始版本和变种之间的“找不同”。🔍


1. 为什么要进行相似度分析? 🤷‍♀️

超过90%的恶意软件都是现有代码的重复利用。因为没有必要每次都重新发明轮子。

  • 逃避检测: 为了躲避杀毒软件的签名(指纹)检测,只改变变量名或函数顺序。
  • 功能升级: 在现有勒索软件中添加“信息窃取”功能,或加强加密算法。
  • 攻击者溯源(Attribution): 可以获得“咦?这种编码风格,和去年活跃的‘Lazarus’组织有95%的相似度?”之类的线索。

2. [准备] 准备原始代码和变种代码 (反编译) 📂

为了进行分析,我们需要通过Ghidra或IDA等工具恢复成C语言形式的伪代码(Pseudocode),而不是二进制(EXE)状态。

📁 [Sample A] 原始勒索软件 (Original)

C

// 原始版本:简单的文件加密循环
void EncryptFiles() {
    char* key = "1234"; // 脆弱的硬编码密钥
    FileInfo file = FindFirstFile("*.*");
    while (file) {
        XOR_Encrypt(file, key); // 简单XOR加密
        file = FindNextFile();
    }
}

📁 [Sample B] 变种勒索软件 (Variant)

C

// 变种:密钥生成方式变更及功能添加
void ProcessData() { // 函数名已更改
    char* key = GenerateRandomKey(); // 通过随机密钥生成进行强化
    FileInfo f = FindFirstFile("*.*");
    while (f) {
        if (IsSystemFile(f)) continue; // [变更点] 跳过系统文件(安全机制)
        AES_Encrypt(f, key); // [变更点] 算法更改为AES
        f = FindNextFile();
    }
}

一眼看去,结构相似,但细节变化很大,对吧?我们把这个交给AI来处理。


3. 请求AI进行“基因检测” 🧬

如果只是简单地说“比较这两个”,AI只会找出文本上的不同。我们想要的是“功能性/逻辑性差异”,因此需要精心编写提示词。

🗣️ [Prompt] 相似度分析提示词

[角色] 您是恶意软件逆向工程专家。

>

[任务] 比较分析下面提供的两段C代码(Sample A,Sample B)。

>

Sample A是原始恶意软件,Sample B被认为是其变种。

>

[要求]

>

1. 相似度分数: 基于两段代码的逻辑结构和流程,估算相似度,范围在0-100%之间。

2. 主要变更(Diff): 忽略变量名更改等细微之处,重点说明算法、逻辑、功能性增减方面的差异。

3. 变种意图: 推断攻击者如此修改代码的原因(例如,逃避检测、功能增强等)。

>

[Sample A 代码]

>

(粘贴上述原始代码)

>

[Sample B 代码]

>

(粘贴上述变种代码)


4. [结果] AI的精密分析报告 📝

AI知道变量名从file变为f并不重要。相反,它指出了核心逻辑的变化。

🤖 AI分析报告

>

1. 📊 相似度估算:约70%

>

– 依据: 文件遍历循环(FindFirstFile -> while -> FindNextFile)的整体框架(Structure)是相同的。但在内部处理逻辑中检测到了重要变化。

>

2. 🔄 主要变更(Key Differences)

>

– 加密强度增强: 简单的XOR运算已更改为高级加密标准AES。

– 密钥管理方式: 硬编码的密钥(”1234″)已更改为通过GenerateRandomKey()动态生成的方式,使得解密更加困难。

– 增加安全机制: 添加了IsSystemFile()检查逻辑。这是为了防止加密Windows重要文件导致系统无法启动。

>

3. 😈 变种意图推断

>

该变种的制作者发现旧版本很容易被安全厂商解密,因此升级了加密算法,迫使受害者不得不支付赎金。此外,似乎还有意提高系统稳定性,以避免“跑路(只收赎金不恢复)”的争议。


5. 实践的核心要点:Diffing(差异分析)的艺术 ✨

通过本次实践,我们可以获得以下见解:

  1. 控制流图(CFG)的重要性: 即使变量名发生变化,While循环中包含If语句的结构也不容易改变。AI能够很好地识别这种结构相似性。
  2. 噪声消除: 通过告诉AI“忽略变量名更改”,我们能够专注于真正重要的功能性差异。
  3. 制定应对策略: 我们可以确定分析方向,例如:“啊,这次的变种使用了AES。那么我们应该针对密钥在内存中生成的时候进行攻击。”

🎉 总结

今天,我们利用AI分析了恶意软件的“族谱”(?)。

过去,我们不得不盯着两个显示器,玩“找不同”游戏,看得眼睛都快充血了,但现在AI可以帮我们完成初步工作,我们就能专注于更高级的任务——“理解攻击者的意图”。

下一次,我们将综合至今所学的所有分析内容,进行“最终恶意软件分析报告自动生成”的实践,为本系列画上圆满的句号。

愿您的分析始终清晰明了!加油! 💪



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注