[深入]“那个函数,真的只是复制吗?”🕵️‍♂️ AI揭露分析师遗漏的隐秘子程序

大家好,致力于深度分析的安全研究员们!🦅

我们在分析恶意软件时最常犯的错误是什么?那就是“假设(Assumption)”。

在main函数中,我们会遇到无数的CALL指令。“嗯,FUN_00401200?看内部,它接收两个参数并循环?那它肯定只是一个像strcpy或memcpy一样的字符串复制函数。跳过!”

…当你这样跳过时,你可能已经落入了恶意软件作者的陷阱。😱 恶意软件作者经常将解密逻辑或反调试代码隐藏在分析师可能因懒惰而跳过的“看似简单的子程序”中。

今天,我们将通过与AI的交叉验证,实践一种高级技术,来找出分析师容易无意中忽略的子程序(Subroutine)中隐藏的“爪牙”。


1. 子程序的困境:“我必须看遍所有这些吗?”😫

恶意软件由数百、甚至数千个函数组成。逐一拆解它们是不可能的。因此,我们凭经验通过观察“模式”来判断。

  • 模式A:循环并计数直到0 -> 这是strlen(计算字符串长度)。(跳过)
  • 模式B:将字节从源移动到目标 -> 这是memcpy(内存复制)。(跳过)

但是,如果那个函数在复制的同时解码恶意shellcode呢?💣


2. 实践场景:伪装函数 FUN_CopyOrNot 🎭

假设你在Ghidra中发现了以下C伪代码。

// 分析师容易误认为是“简单复制”的代码
void FUN_CopyOrNot(byte *dest, byte *src, int length) {
  int i;
  for (i = 0; i < length; i = i + 1) {
    byte bVar1 = src[i];
    // ... 某种复杂的变量赋值 ...
    if ((i % 5) == 0) {
        // 分析师可能随意忽略的条件语句
        dest[i] = bVar1 ^ 0x41; 
    } else {
        dest[i] = bVar1;
    }
  }
  return;
}

人眼粗略一看,它看起来像一个将src移动到dest的复制函数。中间虽然有一些if语句,但很容易就将其视为“哦,这可能是填充处理或编码”而忽略。

然而,这里面隐藏着一个去混淆逻辑,它每隔5个字节执行一次XOR 0x41(键’A’)操作。如果忽略这一点,你将在后续代码中看到错误的数据。


3. AI交叉验证:“怀疑,再怀疑”🧐

现在,我们将这段代码交给AI,尝试进行交叉验证。这里的关键不是问“简单总结一下”,而是问“找出异常之处”。

❌ 糟糕的提示(一般总结)

“这个函数是做什么的?” -> AI回答:“这是一个将源数组按给定长度复制到目标数组的函数。它根据特定条件修改值。”(太平凡了,感觉不到危险)

✅ 好的提示(用于交叉验证)

[角色设定]

你是一名安全分析专家,负责发现恶意软件的隐藏技术。

>

[目标]

下面的代码看起来像一个简单的内存复制函数(memcpy)。但我怀疑这个函数具有“副作用(Side Effect)”。

>

[请求事项]

>

1. 精确指出此函数与标准库函数(strcpy, memcpy等)在结果上有什么不同。

2. 如果存在数据被篡改(Modification)的行,请找出它们并解释其含义(XOR, Shift等)。

3. 推断这种技术在恶意软件中主要用于什么目的。

>

[代码] (粘贴上述代码)


4. AI的分析结果:“抓住了!”🚨

输入正确的提示后,AI会像显微镜一样仔细分析代码。

🤖 AI分析报告

>

1. 异常检测 (Anomaly Detection) 此函数并非简单的memcpy。标准复制函数会原样传输数据,但此函数执行条件性数据篡改。

>

2. 核心逻辑分析

>

– if ((i % 5) == 0): 每当索引是5的倍数时,就会发生分支。

– dest[i] = bVar1 ^ 0x41;: 执行XOR 0x41运算。这并非简单的复制,而是“内联解密(Inline Decryption)”过程。

>

3. 分析师建议 经过此函数处理的数据(dest)与原始数据(src)内容不同。如果src是加密的shellcode,那么dest将包含可执行的攻击代码。绝不能将此函数标记为“简单复制”并跳过!


5. 我们的应对:重命名函数 (Renaming) 🏷️

多亏了AI,我们避开了陷阱。现在,回到Ghidra,只有一件事要做。

  1. 右键点击函数名 FUN_CopyOrNot
  2. 点击 Rename Function
  3. 更改为 Decryption_Copy_XOR_41

现在,在所有调用此函数的地方,都能直观地知道:“啊!那是用来解密的!” 这样正确分析一个子程序,有时能像魔法一样解开整个程序的流程。🗝️


💡 今日小贴士 (Takeaway)

  • 不要忽视子程序:魔鬼藏在细节(辅助函数)中。
  • 与标准函数进行比较:问问AI,“这和strcpy是100%一样的吗?”
  • 寻找魔术数字:如果代码中间突然出现0x41、0xFF等常量,务必怀疑。
  • 将AI用作“红队”:反向提问,“我是否遗漏了任何漏洞或技巧?”

希望您的分析视野能与AI一起变得更广更深!下期我们将带来分析的精髓,“分析报告自动化”。

逆向愉快!💻✨



Comments

发表回复

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