引言
如果说挖矿病毒是“温水煮青蛙”式的消耗,那勒索病毒就是“一刀毙命”式的摧毁。
它不偷偷摸摸地占用你的 CPU,而是大张旗鼓地加密你的所有文件,然后弹出一个窗口,告诉你:想拿回数据?先交赎金。没有讨价还价,没有技术协商,只有倒计时和比特币地址。
2017年5月12日,WannaCry 勒索病毒在短短几天内席卷全球150多个国家,感染超过30万台电脑。英国的医院取消了手术,西班牙的电信公司瘫痪,中国的加油站无法刷卡,大学的毕业论文被锁死。它利用的是美国国家安全局(NSA)泄露的“永恒之蓝”漏洞,传播速度之快,影响范围之广,在恶意软件史上都是罕见的。
但 WannaCry 不只是一个“破坏工具”。它是一个工程化程度极高的恶意软件系统,有着清晰的分层架构、完整的加密引擎、精细的文件处理逻辑,以及对分析者层层设防的反调试机制。
这篇文章会从勒索病毒的技术原理讲起,带你完整走一遍 WannaCry 的释放、持久化、载荷解密、DLL 加载、文件加密流程,然后给出具体的排查和防御方案。最后,我会从逆向分析的角度,拆解它的每一个核心模块。
第一部分:勒索病毒是什么?
1.1 勒索病毒的技术原理
勒索病毒的核心逻辑只有三步:
加密:用加密算法把受害者机器上的文件全部加密,使文件无法正常打开。
勒索:弹出提示窗口,告知受害者“你的文件已被加密”,要求支付赎金(通常是比特币)才能获得解密密钥。
威胁:设定倒计时,过期不候,或者威胁公开受害者的数据。
和挖矿病毒不同,勒索病毒不依赖长期驻留,它追求的是在最短时间内完成加密,然后迅速消失。加密速度越快,被发现的概率越低,攻击者的收益越高。
1.2 勒索病毒 vs 挖矿病毒
| 维度 | 挖矿病毒 | 勒索病毒 |
|---|---|---|
| 目标 | 长期占用 CPU/GPU 算力 | 短时间内加密所有文件 |
| 驻留时间 | 数周至数月 | 数小时至数天 |
| 对用户的影响 | 电脑变慢、电费上涨 | 文件无法打开、业务中断 |
| 攻击者收益 | 持续挖矿收益 | 一次性赎金 |
| 典型家族 | XMRig、CoinMiner | WannaCry、LockBit、Mallox |
| 检测难度 | 中(行为明显) | 高(加密后才发现) |
挖矿是“偷电”,勒索是“绑架”。
1.3 勒索病毒的常见类型
加密勒索:加密文件,要求支付赎金才能解密。WannaCry、LockBit 属于这一类。
数据窃取+勒索:先窃取数据,再加密文件,威胁不交赎金就公开数据(双重勒索)。这是近年来的主流模式。
屏幕锁定:不加密文件,只锁定屏幕,要求支付“罚款”。多见于早期勒索软件。
MBR 勒索:修改主引导记录,导致系统无法启动。Petya 属于这一类。
第二部分:WannaCry 是怎么感染你的机器?
2.1 传播途径
WannaCry 的传播主要依靠“永恒之蓝”(EternalBlue)漏洞,这是 NSA 开发的 SMB 协议漏洞利用工具,针对 Windows 系统的 445 端口。
传播流程:
扫描局域网和互联网上开放 445 端口的 Windows 机器
利用永恒之蓝漏洞在目标机器上执行代码
植入 WannaCry 释放器,启动加密流程
被感染的机器继续扫描其他机器,形成蠕虫式传播
不需要用户点击任何东西,只要你的机器开放了 445 端口且没有打补丁,就可能被感染。
2.2 感染后的完整行为链
以我们分析的样本为例,WannaCry 从运行到加密会经历以下阶段:
第一阶段:释放与移动
程序运行后,首先用计算机名作为种子生成一个随机目录名(如C:\ProgramData\abcdefgh123\),然后将自身复制到该目录,并命名为tasksche.exe。
第二阶段:持久化
在注册表HKLM\Software\WanaCrypt0r和HKCU\Software\WanaCrypt0r下写入值名wd,记录工作目录路径,确保重启后能找到自己。
第三阶段:释放加密载荷
从自身资源节释放加密文件,包括t.wnry(加密的 DLL 载荷)、c.wnry(配置文件)等。
第四阶段:解密载荷
读取t.wnry,验证"WANACRY!"魔数,用 RSA 私钥解密 AES 密钥,再用 AES 解密出 DLL。
第五阶段:加载 DLL,启动加密
手动加载解密后的 DLL,调用导出函数TaskStart,启动多线程并发加密。
第六阶段:加密文件
遍历磁盘,加密所有目标文件,修改壁纸,弹出勒索提示。
第三部分:怎么判断自己中了勒索病毒?
3.1 常见症状
文件后缀被修改(WannaCry 会添加
.WNCRY、.WCRY等后缀)桌面壁纸被替换成勒索提示
弹出窗口显示赎金金额、比特币地址和倒计时
文件无法正常打开,提示“文件已损坏”或“格式不支持”
磁盘上出现
@Please_Read_Me@.txt、@WanaDecryptor@.exe等文件
3.2 排查工具
文件后缀检查:看文件是否被批量重命名
勒索提示文件:搜索
README、DECRYPT、RECOVER等关键词进程检查:任务管理器中是否有陌生进程占用 CPU
网络连接:TCPView 看是否有到陌生 IP 的连接
3.3 关键特征
文件被批量加密,扩展名被修改
桌面壁纸被替换
弹出勒索窗口
出现比特币地址和倒计时
注册表中出现
WanaCrypt0r相关键值
第四部分:怎么防御和清除勒索病毒?
4.1 防御措施(最重要的部分)
勒索病毒的防御比清除更重要,因为一旦文件被加密,恢复的难度极大。
1. 打补丁
WannaCry 利用的是永恒之蓝漏洞(MS17-010)。微软在 2017 年 3 月就发布了补丁,但很多机器没有更新。及时打补丁是最有效的防御手段。
2. 关闭不必要的端口
445 端口是 SMB 协议端口,WannaCry 通过它传播。如果不是必须,关闭 445 端口或限制访问。
3. 备份,备份,备份
这是唯一 100% 有效的恢复手段。定期备份重要文件到离线存储或云端。备份要离线,否则勒索病毒会加密备份文件。
4. 不点陌生链接和附件
虽然 WannaCry 主要靠漏洞传播,但其他勒索软件(如 LockBit)常通过钓鱼邮件传播。
5. 安装靠谱的杀软,开启实时防护
火绒、360、Windows Defender 都能拦截已知勒索软件。
6. 限制管理员权限
勒索病毒通常需要管理员权限才能加密系统文件。日常使用普通用户账户,降低风险。
4.2 清除步骤(如果已感染)
第一步:立即断网
拔掉网线或关闭 WiFi,防止勒索病毒继续加密网络共享文件。
第二步:不要重启
WannaCry 在加密完成后可能会删除自身,重启可能导致内存中的密钥丢失。
第三步:结束恶意进程
在任务管理器中找到tasksche.exe或@WanaDecryptor@.exe,结束任务。
第四步:删除恶意文件
删除C:\ProgramData\<随机名>\、C:\Intel\<随机名>\等目录下的tasksche.exe。
第五步:清理持久化
删除注册表HKLM\Software\WanaCrypt0r和HKCU\Software\WanaCrypt0r。
第六步:全盘杀毒
用火绒或 Windows Defender 全盘扫描。
第七步:评估恢复方案
如果有备份,直接恢复
如果没有备份,可以尝试 NoMoreRansom 等平台提供的解密工具(WannaCry 的部分密钥已被执法机构公开)
如果都不行,重装系统是最后的方案
4.3 关于解密
WannaCry 的解密密钥由攻击者服务器保管。虽然 FBI 后来通过追踪比特币交易找到了攻击者的主私钥,但普通受害者很难通过技术手段自行解密。
不要支付赎金。支付赎金不仅助长犯罪,而且不一定能拿到解密密钥。
第五部分:从分析者视角看 WannaCry
前面讲的是“普通人怎么处理”,这一部分讲“分析者怎么看”。以我们分析的样本为例,完整拆解它的行为链。
5.1 样本基本信息
文件类型:32位 PE 可执行文件(释放器)+ 解密后的 DLL(加密引擎)
关键字符串:
WANACRY!、WNcry@2ol7、tasksche.exe、t.wnry、TaskStart比特币钱包:
13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94、12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw、115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn释放目录:
C:\ProgramData\<随机名>\、C:\Intel\<随机名>\、%TEMP%\<随机名>\持久化:
HKLM\Software\WanaCrypt0r+HKCU\Software\WanaCrypt0r,值名wd
5.2 释放器分析
随机目录名生成(sub_401225)
用计算机名作为种子,生成一个随机目录名。每个受害者的目录名不同,但同一台机器每次生成的目录名固定。
移动到隐蔽目录(sub_401B5F)
将自身复制到C:\ProgramData\<随机名>\或C:\Intel\<随机名>\,并命名为tasksche.exe。选这两个目录是因为它们所有用户可写,权限宽松。
持久化(sub_4010FD)
在HKLM\Software\WanaCrypt0r和HKCU\Software\WanaCrypt0r下写入值名wd,记录当前工作目录。双写是为了在权限不足时用 HKCU 作为备份。
资源释放(sub_401DAB)
从自身资源节"XIA"/0x80A释放加密文件,包括t.wnry、c.wnry等。
比特币钱包(sub_401E9E)
内置三个比特币钱包地址,随机选择一个。
命令执行(sub_401064)
调用CreateProcessA执行系统命令:
attrib +h .:隐藏当前目录icacls . /grant Everyone:F /T /C /Q:赋予 Everyone 组完全控制权限,扫清加密文件的权限障碍
5.3 载荷解密分析
t.wnry 文件结构
text
t.wnry ├── "WANACRY!" (8字节魔数) ├── RSA 加密的 AES 密钥 (256字节) └── AES-CBC 加密的 DLL 数据
解密流程(sub_4014A6)
打开文件,验证
"WANACRY!"魔数读取 256 字节 RSA 加密的 AES 密钥
用 RSA 私钥解密 AES 密钥
用 AES 密钥初始化 AES 上下文
读取 AES-CBC 加密的 DLL 数据
用 AES 解密 DLL
返回解密后的 DLL
手动 DLL 加载(sub_402924)
解密后的 DLL 不通过LoadLibrary加载,而是手动解析 PE 导出表,找到TaskStart函数地址,直接调用。
为什么手动加载?
绕过 Windows DLL 加载机制
不触发
LoadLibrary监控不暴露 DLL 的导入表
5.4 加密引擎分析
TaskStart 调度(sub_10005AE0)
解密后的 DLL 导出TaskStart,它是加密的总调度器。它创建五个线程并发执行:
线程1:加密文件
线程2:遍历磁盘
线程3:修改壁纸
线程4:加密网络共享
线程5:清理
AES 密钥扩展(sub_10005DC0)
校验密钥长度,存储密钥和 IV,生成轮密钥。WannaCry 使用 AES-128,10 轮。
AES 轮函数(sub_10006280)
使用 T 盒优化,每轮只需查表 + 异或,速度比逐字节操作快很多。
ZIP 文件解析(sub_4061E0)
WannaCry 专门处理 ZIP 文件——解析 ZIP 内部结构,逐个加密里面的文件,再重新打包。确保 ZIP 内部数据完全不可恢复。
MS-DOS 日期时间解析(sub_406191)
读取 ZIP 条目的原始时间戳,加密后重新写回,让文件看起来“没被动过”。
zlib 解压缩(sub_4043B6)
释放器和加密 DLL 都内嵌了 zlib inflate 实现,用于解压资源节和 ZIP 条目。
5.5 密钥生成机制
WannaCry 采用双层非对称加密:
text
攻击者服务器 ├── 生成一对主密钥(RSA-2048) │ ├── 主私钥(攻击者保留) │ └── 主公钥(嵌入样本) │ └── 每个受害者 ├── 生成一对临时密钥(RSA-2048) │ ├── 临时私钥(用主公钥加密后存在 .eky 文件里) │ └── 临时公钥(存在 .pky 文件里) │ └── 生成随机 AES 密钥 ├── AES 密钥(用临时公钥加密后存在 .eky 文件里) └── 用 AES 密钥加密文件
为什么无法通用解密?
主私钥不在样本里,只在攻击者服务器上
临时私钥被主公钥加密,只有攻击者能解密
AES 密钥被临时公钥加密,只有攻击者能解密
每个受害者的密钥都是独立的。
5.6 家族判断
综合以上特征,判断该样本属于WannaCry / WanaCrypt0r家族,具体特征:
使用永恒之蓝漏洞传播
释放
tasksche.exe、t.wnry、c.wnry比特币钱包地址固定
注册表键
WanaCrypt0r持久化加密文件后缀
.WNCRY、.WCRY桌面壁纸替换为勒索提示
5.7 检测建议
YARA 规则示例:
yara
rule Ransomware_WannaCry_Release { meta: description = "Detects WannaCry ransomware dropper" author = "your_id" date = "2026-09" strings: $s1 = "WANACRY!" ascii $s2 = "WNcry@2ol7" ascii $s3 = "tasksche.exe" ascii $s4 = "t.wnry" ascii $s5 = "TaskStart" ascii $s6 = "WanaCrypt0r" wide ascii $s7 = "13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94" ascii $s8 = "12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw" ascii $s9 = "115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn" ascii condition: uint16(0) == 0x5A4D and 4 of them }IOC 列表:
| 类型 | 内容 |
|---|---|
| 文件路径 | C:\ProgramData\<随机名>\tasksche.exe |
| 文件路径 | C:\Intel\<随机名>\tasksche.exe |
| 注册表键 | HKLM\Software\WanaCrypt0r\wd |
| 注册表键 | HKCU\Software\WanaCrypt0r\wd |
| 比特币地址 | 13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94 |
| 比特币地址 | 12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw |
| 比特币地址 | 115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn |
| 文件名 | t.wnry、c.wnry、.eky、.pky、.res |
| 命令 | attrib +h .、icacls . /grant Everyone:F /T /C /Q |
行为特征:
创建
ProgramData或Intel下的随机目录写
Software\WanaCrypt0r注册表键从资源节
"XIA"/0x80A释放文件创建多个线程并发加密
修改文件时间戳保留原始时间
解析 ZIP 文件逐个加密内部文件
修改桌面壁纸
弹出勒索提示窗口
第六部分:WannaCry 的工程化设计
WannaCry 之所以能在短时间内造成全球性影响,不仅因为永恒之蓝漏洞的威力,更因为它的工程化设计。
1. 分层架构
释放器负责落地和调度,加密逻辑封装在加密的 DLL 中。静态分析释放器看不到加密逻辑,必须动态解密才能分析。
2. 双层加密
RSA-2048 + AES-128,每个受害者独立密钥。即使抓到一个受害者的密钥,也无法解密其他受害者的文件。
3. 手动 DLL 加载
绕过 Windows 加载机制,不触发LoadLibrary监控。
4. 动态 API 解析
通过GetProcAddress动态获取文件操作 API,不暴露在导入表中。
5. 多线程并发
同时加密磁盘、网络共享、修改壁纸,最大化加密速度。
6. ZIP 文件深度处理
逐个加密 ZIP 内部文件,确保数据完全不可恢复。
7. 时间戳保留
加密后恢复文件原始时间戳,隐藏加密痕迹。
8. 多组件释放
释放t.wnry、c.wnry、taskdl.exe、taskse.exe等多个组件,各司其职。
结语
WannaCry 是勒索病毒的经典案例,也是恶意软件工程化的代表作。
它的技术原理不复杂:加密文件、索要赎金。但它的实现极其精细:分层架构、双层加密、手动 DLL 加载、多线程并发、ZIP 深度处理。
对于普通人,防御 WannaCry 的核心是打补丁、关端口、备份数据。一旦感染,恢复的难度极大,不要支付赎金。
对于安全从业者,理解 WannaCry 的行为链和加密机制,能帮助你写出更精准的检测规则,在企业环境中更快地发现和响应。WannaCry 虽然已经过去多年,但它的设计思路被后来的勒索软件广泛借鉴。理解 WannaCry,是理解勒索软件生态的起点。