☰
CuteVirusCollection样本分析实战:分类、复现与检测特征提取
2026/10/17 14:53:08 网站建设 项目流程

简介:CuteVirusCollection 是一套按杀伤等级组织的恶意脚本集合,标签中的 狼、老虎、恶魔 对应 1~3 级威胁,由浅入深展示病毒如何从骚扰演变为系统崩溃。代码覆盖批处理、JavaScript、C、Java 等常见语言,面向学习 Windows 系统安全、计算机病毒原理或资源耗尽攻击的读者,适合在虚拟机、沙箱或快照环境中运行观察。低级样本会让鼠标乱飘、窗口跳动、弹出无休止消息;高级样本通过超长字符串刷爆内存、递归创建海量进程,使 CPU 与 RAM 不堪重负,直观体现“只需打破一根支撑就能毁掉整台计算机”。资源以 zip 压缩包发布,大小约 47KB,文件总数未单独披露,内部按灾害等级分目录,主要文件类型包括批处理脚本、JavaScript 代码以及 C/Java 源码,每个脚本均配有简略行为说明。已有 2011 人学习/下载,对于想入门恶意代码分析、系统崩溃原理或安全防御的读者,这套集合提供了可复现的参考样本,既可对比不同语言实现同一攻击的写法,也能作为后续研究更复杂威胁的基础素材。

1. 先说结论:这个“可爱病毒集合”到底能拿来干什么

我第一次拿到 CuteVirusCollection 这个样本包时,说实话没抱什么希望。资源站上的标题写着“可爱但致命”,这种夸张的措辞见多了,里面十有八九是成堆的批处理和 VBS 恶作剧。等到把它丢进虚拟机里按类型跑完,我才发现自己之前的判断错了一半——这里确实没有能造成数据毁灭的“致命”样本,但那个 deadly-viruses 标签也不算完全瞎写:不少样本在 windows-xp-7-10 上一跑,系统直接卡死、资源管理器崩溃、进程表刷屏。破坏力谈不上,干扰能力却是实打实的。

这篇不打算按资源说明书的写法带你浏览文件,而是讲拿到它之后怎么分类、怎么在隔离环境里复现、怎么从样本里提炼检测特征,顺便把我踩过的坑列出来换你走捷径。适合三类人:刚入门的恶意代码分析新手、做终端检测的蓝队同事、对 Windows 机制本身有兴趣的开发者。下面直接进入正题。

2. 拆样本库:按语言、触发方式和系统兼容性分堆

2.1 先看语言分布:batch、VBS、C、Java 各占多少

整个包从后缀看非常杂,但绝大多数能归进五类。把它们分开之后,你会发现每一类的行为模式和适用分析手段其实相当一致:

语言/格式典型扩展名运行依赖常见行为方向
Batch / Shell.bat .cmdcmd.exefork bomb、文件复制、启动项写入
VBScript / JScript.vbs .vbe .jswscript.exe / cscript.exe弹窗轰炸、注册表操作
HTML Application.htamshta.exe内嵌脚本的混合型载荷
C / C++.exe 或源码Windows API 直接调用崩溃实验、内存操作
Java.jar .class需要 JRE 环境跨平台逻辑、资源耗尽

我一般会先按这个表把所有文件归堆,再用一个脚本批量算 SHA256 去重。这里有个细节:.bat 和 .cmd 的行为不完全一样,.cmd 在 XP 上有一些额外的错误处理语义,不过放到 Win7 之后差别就很小了,分析时可以合并处理。真正的重点区别在 VBS 和 C 之间——VBS 不用编译、随便记事本就能改,它代表的是一大类“脚本型骚扰程序”;C 编译出来的 exe 则更接近传统恶意软件的初始雏形,适合用来理解 API 调用链。

2.2 按触发方式分:手动双击、自启动持久化、延时触发

分完语言,我会再按触发方式过一遍。这个维度直接决定你应该在哪一层观察它的行为:

  • 手动双击型:占了大多数,不需要任何隐藏手段,用户自己点开才生效。这类样本你直接双击就能复现,观察成本最低。
  • 自启动持久化型:会把自己复制到启动文件夹,或者通过reg add写注册表 Run 键。这类要特别注意快照时机,因为一旦跑过,它已经留在系统里了。
  • 延时触发型:用timeout、ping -n、VBS 的WScript.Sleep做延迟,几秒到几分钟后才发作。分析时别急着下结论,等够时间再看系统状态。

触发方式的判断有时能直接看出作者的水平。只做手动双击的作者通常对 Windows 机制了解不深;写了启动项或者计划任务的,说明他至少知道“用户不会主动点第二次”这个事实。这两种样本在防御视角下的检测难度完全不同。

2.3 目标系统差异:XP、Win7、Win10 表现完全不同

包名里写的是 windows-xp-7-10,但同一份样本在这三个系统上的表现差很远,我实际测试后的结论是:

样本类型Windows XPWindows 7Windows 10
Batch 批处理全部生效大部分生效中文路径或编码问题可能闪退
VBS 弹窗全部生效全部生效部分被系统策略阻止
.hta 文件正常执行正常执行mshta 被限制或直接无法启动
C 崩溃程序正常崩溃正常崩溃可能触发 Windows 错误报告后恢复
Java 程序需手动装 JRE需手动装 JRE需手动装 JRE

XP 上没有 UAC,权限模型几乎是“登录即管理员”,所以老样本在那里最容易还原出原始效果。Win7 引入了 UAC,但只要样本不触发管理员提权弹窗就能跑,复现难度也不大。Win10 是最麻烦的,AMSI 会拦截一部分脚本类样本,受控文件夹访问和微软自带的 Defender 也会中途插手。我的建议是:第一轮全量行为复现用 Win7 虚拟机,XP 留给兼容性验证,Win10 只用来做“哪些会被拦下来”的对抗性观察。

2.4 隔离环境 checklist:动手之前先确认这些

复现任何样本之前,我会强制自己走一遍这个清单,缺一项都不开跑:

  • 虚拟机快照已建立,且确认快照点早于任何样本操作的写入时间。
  • 关闭宿主机与虚拟机之间的共享文件夹、拖拽、剪贴板共享,通通设成禁用。
  • 虚拟机内关掉远程桌面、网络共享,除非你要特意观察网络行为。
  • 准备一个只读目录存放样本原件,把要执行的副本单独复制到桌面或临时目录。
  • 打开任务管理器、Process Monitor、Sysmon 日志窗口,确认采集工具在样本启动前已经就位。

我第一次跑这套样本时没关共享文件夹,结果某个批处理自带copy逻辑,把文件复制到了映射到宿主机的路径里。虽然没启动、也没造成实际破坏,但气氛一下子紧张不少。从那之后,隔离检查就再没跳过。

3. 四类典型样本复现:从弹窗轰炸到 CPU 占满的思路与步骤

3.1 批处理 fork bomb:三行代码为什么能让机器卡死

这个包里最不缺的就是批处理炸弹,典型写法是这个:

@echo off :loop start %0 goto loop

逻辑很简单:批处理运行到start %0时,会启动一个新的 cmd.exe 进程来执行当前脚本本身;新进程又继续执行同一行代码,于是再启动两个、四个、八个……进程数指数增长,直到把系统资源吃光。更极端的姿势是把整个结构压成一行%0 | %0,通过管道两边同时加载自身,速度更快。

复现步骤:

  1. 在 Win7 虚拟机的桌面新建bomb.bat,粘贴上面代码并保存。
  2. 先打开任务管理器,切到“进程”标签,确认 cmd.exe 进程数为 0。
  3. 双击bomb.bat,立刻切回任务管理器看进程数。
  4. 观察 CPU 和内存占用,通常 5 秒内系统就开始卡顿、鼠标响应变慢。
  5. 终止手段:在任务管理器里强制结束所有 cmd.exe,或者直接关闭虚拟机电源,回到快照。

这个样本最值得看的一点不是代码本身,而是它暴露出的 Windows 进程模型:cmd.exe 是独立进程,start是异步创建、不等待返回,所以进程膨胀根本不受限。杀软对这种纯脚本炸弹的检测也比较考验策略,后面第五部分我会讲怎么用行为日志抓它。

3.2 VBS 弹窗轰炸:用户交互层的可用性攻击

VBS 弹窗是另一种高频样本,核心循环长这样:

Do CreateObject("WScript.Shell").Popup "你被盯上了", 0, "CuteVirus", 48 Loop

Popup的第一个参数是正文,第二个参数 0 表示无限等待用户关闭,第三个是标题,48 是图标样式编号。这个循环会一直弹窗,用户每点一次“确定”,下一个弹窗立刻出现,根本没有断点。如果直接关窗口,wscript.exe 可能还在后台继续跑。

复现时要注意区分 wscript.exe 和 cscript.exe:默认双击 .vbs 用 wscript,弹窗场景下 wscript 更流畅;cscript 是控制台版,弹窗行为略有差异。终止方式是打开任务管理器直接结束 wscript.exe 进程,而不是去一个个点掉弹窗。

这个样本放到 Win10 上可能出现另一种景象:系统弹窗变成 UAC 确认或 Smartscreen 提醒,甚至脚本直接被阻止执行。这本身就是很好的对比实验——同一段代码在不同版本的 Windows 脚本宿主策略下,命运完全不同。

3.3 崩溃型样本:C 代码里最常见的几种崩溃姿势

包里还有一部分 C 编写的崩溃实验程序,源码角度通常逃不出这几类:

#include <stdlib.h> void overflow(void) { char buf[4]; buf[0] = 'A'; overflow(); // 无限递归,栈空间耗尽导致栈溢出 } int main(void) { overflow(); return 0; }

这个overflow函数每递归一层就会在栈上分配新的栈帧,但函数内不释放、不返回,栈帧持续累积,最终触发栈溢出。Windows 的异常处理会捕获到访问违规(0xC0000005),然后弹出“程序已停止工作”的错误报告窗口。

另一种常见姿势是除零或空指针解引用,代码更短:

int main(void) { volatile int x = 0; return 1 / x; }

复现这类样本的价值在于理解进程崩溃与系统崩溃的区别:C 程序崩溃只是单个进程退出,Windows 本身不会挂掉;而批处理 fork bomb 是系统层面资源耗尽,两者表现、检测和恢复手段完全不同。很多刚入门的人把这两类混为一谈,实际排查起来天差地别。

3.4 蠕虫型样本:把自己复制到启动目录的静态分析

标着 worms 标签的样本,严格说没有真正意义上的蠕虫——没有网络传播模块,绝大多数只是模拟“自我复制 + 持久化”。批处理里的典型写法是:

@echo off copy /Y "%~f0" "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\"

%~f0在批处理里表示当前脚本自身的完整路径,%APPDATA%展开成当前用户的应用数据目录。执行之后,脚本会被复制到当前用户的“启动”文件夹,下次登录 Windows 时自动执行,这是最基础的自启动持久化手段。

VBS 版本则喜欢写注册表:

Set sh = CreateObject("WScript.Shell") sh.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\CuteVirus", WScript.ScriptFullName

RegWrite 的第一个参数是注册表路径,最后一个参数是写入的启动项命令。下次用户登录时,这个脚本会被自动执行一遍。分析和防御视角下,这两种持久化方式对应完全不同的检测点:启动文件夹可以监控文件创建事件,注册表 Run 键需要监控注册表写操作,二者缺一不可。

4. 踩坑记录:隔离失效、误报干扰和系统不兼容的排查手册

4.1 共享文件夹没关干净,样本把启动项写进了宿主可见目录

现象:批处理类的持久化样本在虚拟机里跑完,检查快照时发现启动文件夹里多了文件,而且这个启动文件夹正好位于共享目录的映射范围内,宿主机上能看到同样的文件。

原因:创建虚拟机时为了拷样本方便开了共享文件夹,没有在复现前关掉。样本的copy指令不知道什么是“宿主机边界”,它只知道有路径就写。

解决:在虚拟机属性里把“共享文件夹”“拖拽”“剪贴板共享”全部禁用,然后把样本原目录设成只读并复制一份到虚拟机本地桌面再执行。从那以后我多了一条习惯:所有样本包原件永远放在宿主机一个固定目录里,通过只读共享的方式拷进虚拟机,执行副本必须落在虚拟机本地盘。

4.2 批处理双击闪退,没有任何行为

现象:.bat 文件双击之后窗口一闪而过,没有弹窗、没有文件复制、没有进程爆炸,一切安静得像没发生过。

原因:脚本保存成了带 BOM 的 UTF-8 编码,cmd.exe 在 Win7 和 Win10 上解析第一行时会被 BOM 干扰,直接导致整段脚本无法正确执行。XP 的 cmd 反而对这类问题更宽容,所以会出现同一份文件在不同系统上行为完全不同的怪现象。

解决:用记事本另存为 ANSI 或 GBK 编码,注意不要选 UTF-8。如果脚本里含有中文注释或字符串,编码选错还会出现乱码路径、复制到错误位置的情况。现在我自己批量处理这个包里文件的第一步,就是写个小脚本统一把 .bat 转成 GBK 编码。

4.3 杀毒软件中途拦截,行为日志只采了一半

现象:动态复现到一半,Defender 弹窗提示发现恶意软件并隔离了文件,后续的持久化行为完全没发生,Sysmon 日志里只有前半段进程创建记录。

原因:虚拟机虽然隔离了网络,但系统自带的实时防护还在运行。Defender 会在文件创建或进程启动时根据特征库判定,直接拦掉一部分样本。

解决:对分析用虚拟机,我会在系统设置里关闭实时保护,并把样本目录加入排除项。如果连关闭都做不到,或者你想锻炼“带杀软环境下的对抗能力”,那就反过来把这种行为差异本身当作观察目标——记录杀软在哪个进程上拦的、用的什么特征、什么时候判定,这也是攻防里非常有价值的信息。

4.4 Win10 上 .hta 执行效果与预期完全不符

现象:一个 .hta 文件在 Win7 里能正常弹窗,换到 Win10 双击后只有瞬间闪过一个窗口,随后什么都没有。

原因:Windows 10 对 mshta.exe 的默认策略收紧了不少,部分版本直接把 HTML Application 的完整能力限制住,脚本里的 ActiveX 操作被拒绝执行或根本不会加载。

解决:做完整复现时优先选择 Win7 虚拟机,Win10 只用来做兼容性对比。包名虽然写 win7-10,但实际效果分布不均匀,不能拿 Win10 的结果当最终结论。

5. 进阶用法:拿这些样本反向训练检测能力

5.1 用 Sysmon 把样本行为变成可检索的事件

样本跑完就回滚快照,等于白跑。我会在虚拟机里装 Sysmon,默认配置就够用,关键看三个事件 ID:1 是进程创建,11 是文件创建,12/13 是注册表写入。

以批处理 fork bomb 为例,正常双击一个脚本只会产生少量进程创建事件,但 bomb 运行后几秒内就会出现大量cmd.exe进程创建记录。用 PowerShell 可以快速框出异常:

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational'; ID=1} | Where-Object { $_.Message -match 'cmd.exe' } | Select-Object -First 20 TimeCreated, Message

这条命令会从 Sysmon 日志里抓出最近 20 条包含 cmd.exe 的进程创建事件。正常操作下这是一个个零散记录,fork bomb 场景下会出现连续几十条同一父进程派生相同命令行的事件,趋势一眼就能看出来。平时我会把日志导出成 CSV 再画个简单的时间分布,哪个节点进程数陡增,样本的爆发点就在哪里。

5.2 把样本特征写成 YARA 规则用于批量分类

样本量一旦超过几十个,人眼一个个看源码效率太低,我会用 YARA 先做静态筛选。这个包里的批处理炸弹高度模板化,规则可以写成这样:

rule Cute_BatchForkBomb { meta: description = "Detect simple batch fork bomb pattern" strings: $a = "%0" nocase $b = "start" nocase $c = ":loop" nocase condition: filesize < 10KB and all of them }

条件里要求文件小于 10KB、同时命中%0、start、:loop三个字符串。命中这种规则的文件大概率是批处理炸弹的变体。写完后用 YARA 命令行对整个样本目录扫一遍:

yara -r cute_rules.yar samples_dir

这个思路同样适用于 VBS 弹窗类样本,把Popup、Do、WScript.Shell作为组合特征。规则的价值不只是“找出已知”,它把之前手工分析的经验固化成了可复用资产,后续收到任何新样本都可以先过一遍规则,秒级分类。

5.3 从特征码视角转向行为视角:样本包是最好的训练场

这个样本包里很多程序只要把字符串改一改、变量名换一换,静态特征就会大变,但行为几乎不变。比如 fork bomb 可以换成 PowerShell 版本、用cmd /c start拼接不同参数,YARA 规则很可能失效,Sysmon 上的行为检出示警却依旧成立。

把同一个样本的原始版和改造版都跑一遍,对比它们在杀毒软件检测、Sysmon 日志、进程树三个层面上的差异,是理解“特征检测 vs 行为检测”最直观的实验。行为检测关注“做了什么”,不是“长什么样”,所以应对变种的能力强得多,代价是误报也高。

6. 收个尾:这个集合适合谁,以及我常用的批量分析技巧

先说结论。CuteVirusCollection 对三类人是有实际价值的:刚入门的分析者可以用它当恶意代码的“解剖标本”——结构简单、源码可见、覆盖了批量处理、脚本宿主持久化、崩溃异常几大基础主题;做终端检测的人可以用它做监控数据集的种子,验证 Sysmon 或 EDR 对持久化、进程洪泛的感知能力;对系统机制感兴趣的开发者则能通过观察 cmd.exe 的进程派发、wscript 的宿主模型来补课。想在这里面找到能“实战部署”的破坏性武器,那就会失望,这个集合压根不在那个层级。

最后分享一个每次拿包都会先做的事——批量静态提取索引:

Get-ChildItem -Recurse -Include *.bat,*.cmd,*.vbs,*.js,*.hta | ForEach-Object { [PSCustomObject]@{ Name = $_.Name SHA256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash SizeKB = [math]::Round($_.Length / 1KB, 2) FirstLine = (Get-Content $_.FullName -TotalCount 3) -join ' | ' } } | Export-Csv -Path sample_index.csv -NoTypeInformation -Encoding UTF8

这个脚本会扫出所有脚本类样本的文件名、哈希、大小和头三行内容,生成一个 CSV 索引。先看头三行能迅速判断样本类型,哈希能用来去重和关联杀软报毒名,大小能筛掉那些空壳文件。整套操作不跑任何样本,纯静态,安全又高效。

从那以后,我拿到任何陌生样本包,都强制自己先走一遍这个静态提取流程,算完哈希、看完前几行脚本、分出危险等级,才会决定要不要上虚拟机动态执行。这个习惯帮我省下过不少回滚时间,也让每一次分析都有据可查。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询