第二十五讲:恶意代码分析(二)——勒索软件、远控木马与Rootkit
好,我们接着往下聊。上一讲我们把恶意代码分析的框架搭起来了,这一讲咱们直接上硬菜——勒索软件、远控木马、Rootkit。这三样东西,说白了就是恶意代码界的“三座大山”。我在做应急响应那几年,几乎天天跟它们打交道。嗯,咱们一个一个来拆。
一、勒索软件分析——不只是解密那么简单
勒索软件,现在已经是黑产界的“顶流”了。你想想看,一个病毒跑起来,直接把你的文档、数据库、照片全锁了,然后弹个窗口让你交比特币。我见过最狠的一次,是某公司财务系统被锁,整个月账目全废了。
1.1 勒索软件的典型行为链
勒索软件的执行流程其实挺固定的。我个人习惯把它分成四个阶段:
- 投放阶段:钓鱼邮件、漏洞利用包、U盘摆渡。最常见的是邮件附件,一个伪装成发票的宏文档。
- 持久化阶段:写注册表、创建计划任务、替换系统文件。我见过一个样本,把自己注册成系统服务,名字叫“WindowsUpdateService”,乍一看真以为是微软的。
- 加密阶段:遍历磁盘,用AES或RSA加密文件。这里有个关键点——勒索软件通常不会加密系统目录,否则系统崩了它自己也跑不了。
- 勒索阶段:弹出勒索信,修改桌面壁纸,甚至播放语音。有些还会威胁“不交钱就公开数据”。
核心知识点:勒索软件加密文件时,通常会先写入一个临时文件(比如 .encrypted),然后删除原文件。如果你在取证时发现大量同名但扩展名不同的文件,基本可以断定是勒索软件干的。
1.2 实战分析:一个WannaCry变种的静态分析
我记得有一次分析一个WannaCry的变种。样本是32位PE文件,没加壳。用IDA打开后,第一件事就是看导入表。
// 关键导入函数
CreateFileW
WriteFile
CryptEncrypt
CryptAcquireContextW
InternetOpenA
InternetOpenUrlA
看到CryptEncrypt和InternetOpenUrlA同时出现,基本可以断定是勒索软件。为什么?因为加密文件需要调用加密API,而联网是为了下载公钥或上传受害者信息。
再往下看,我发现它调用了GetLogicalDrives和FindFirstFile。嗯,这是典型的遍历磁盘行为。我当时在调试器里设了个断点,发现它跳过了C:\Windows目录。这个逻辑其实挺聪明的——系统目录崩了,勒索软件自己也没法运行了。
避坑指南:分析勒索软件时,千万不要在真实环境中运行样本。我曾经有个同事,在虚拟机里跑勒索软件,结果忘了关共享文件夹,宿主机文件全被加密了。从那以后,我每次分析勒索软件都先断网,再用Process Monitor监控文件操作。
二、远控木马分析——藏在暗处的“遥控器”
远控木马,说白了就是攻击者在你电脑上装了个“后门”,他想干嘛就干嘛。我见过最嚣张的一个远控,攻击者直接用受害者的摄像头拍了一张照片,然后发到受害者邮箱里,附言“你的密码是123456”。
2.1 远控木马的通信机制
远控木马的核心是C2(命令与控制)通信。常见的通信方式有:
| 通信方式 | 特点 | 检测难点 |
|---|---|---|
| HTTP/HTTPS | 伪装成正常网页访问 | 流量加密后难以识别 |
| DNS隧道 | 将数据编码在DNS查询中 | DNS流量通常不被监控 |
| WebSocket | 长连接,实时性强 | 与正常WebSocket难以区分 |
| ICMP隧道 | 利用ping命令传输数据 | 防火墙通常放行ICMP |
我个人最头疼的是DNS隧道。为什么?因为企业网络里DNS查询量巨大,你很难从海量流量里找出那几条异常的。我曾经处理过一个案例,攻击者把窃取的数据编码成子域名,每次查询一个不同的域名,比如a1b2c3.malicious.com。防火墙一看是DNS请求,直接放行。
2.2 远控木马的持久化技巧
远控木马为了不被清除,会用各种手段把自己藏起来。我总结了几种常见的:
- 注册表Run键:最老套但最有效。写一个键值到
HKCU\Software\Microsoft\Windows\CurrentVersion\Run,开机自启。 - 计划任务:设置一个每小时执行一次的任务,就算你删了主程序,它也能从备份恢复。
- DLL劫持:替换系统DLL,比如
version.dll,当正常程序加载这个DLL时,恶意代码就执行了。 - WMI事件订阅:利用Windows Management Instrumentation,设置一个永久事件订阅,系统启动时自动触发。
注意:WMI持久化非常隐蔽,常规的杀毒软件很难检测到。我建议你在分析远控木马时,用Autoruns工具检查所有WMI事件订阅。我曾经在一个样本里发现它订阅了__InstanceCreationEvent事件,只要系统创建新进程,它就自动注入。
三、Rootkit检测——与隐藏者博弈
Rootkit,这是恶意代码里的“隐身衣”。它直接修改操作系统内核,让你看不到它的文件、进程、注册表项。我刚开始做逆向时,觉得Rootkit很神秘,后来发现它其实就是利用了操作系统的一些“后门”机制。
3.1 Rootkit的工作原理
Rootkit的核心是“挂钩”(Hooking)。它通过修改系统调用表或函数指针,拦截你对系统信息的查询。比如,当你用Task Manager查看进程时,系统会调用ZwQuerySystemInformation。Rootkit就挂钩这个函数,把恶意进程的信息过滤掉。
我画了一张图,帮你理解Rootkit的挂钩机制:
3.2 Rootkit检测方法
检测Rootkit,说白了就是“比谁更底层”。我常用的方法有:
- 交叉视图检测:用不同方式获取系统信息,对比差异。比如,用
Task Manager和WinDbg分别枚举进程,如果结果不一致,说明有Rootkit在搞鬼。 - 内核模块扫描:用
!process 0 0命令列出所有进程,检查是否有隐藏模块。我习惯用lm命令查看已加载的内核模块,如果发现没有数字签名的驱动,就要警惕了。 - SSDT检查:用
!ssdt命令查看系统服务描述表,检查是否有函数被挂钩。正常的SSDT应该指向ntoskrnl.exe的代码段,如果指向了未知地址,基本可以确定被挂钩了。
个人经验:我曾经遇到一个Rootkit,它挂钩了ZwQueryDirectoryFile,让dir命令看不到它的文件。但我用WinDbg直接读取磁盘扇区,还是找到了。所以,检测Rootkit的关键是“换一个视角”——你从用户态看不到,就从内核态看;从内核态看不到,就从硬件层看。
四、总结与实战建议
好,这一讲的内容就这些。勒索软件、远控木马、Rootkit,这三类恶意代码各有各的“绝活”。勒索软件靠加密文件要钱,远控木马靠C2通信偷数据,Rootkit靠挂钩技术藏自己。但它们的共同点是——都会留下痕迹。
我个人建议,你在分析恶意代码时,养成三个习惯:
- 先静态后动态:先用IDA、PEview等工具看结构,再用调试器跑。别一上来就双击运行。
- 监控系统变化:用Process Monitor、Regshot等工具记录系统状态变化。我每次分析前都会拍一个“快照”,分析完再对比。
- 保持怀疑:如果某个进程看起来正常但行为可疑,别放过它。我曾经因为一个“svchost.exe”的异常网络连接,揪出了一个隐藏了半年的APT攻击。
嗯,这一讲就到这里。记住,恶意代码分析不是一蹴而就的事,需要耐心和细心。下次遇到勒索软件,别慌,按我们讲的步骤来,一步步拆解它。
公众号:蓝海资料掘金营,微信deep3321