简介:这是一份面向计算机安全初学者与爱好者的趣味性恶意软件样本合集,以JavaScript、C、Java、Shell、批处理等语言实现,按灾害等级分为狼、老虎、恶魔三档,涵盖弹窗骚扰、鼠标乱移、窗口漂移、内存溢出、进程炸弹、命令提示符无限开启等典型破坏手法,适合在隔离虚拟机中观察病毒行为、理解系统资源耗尽原理与进程管理机制。压缩包为zip格式,整体约47KB,体量轻巧便于快速部署测试。目前已有2001人学习下载,说明其在安全教学与实验演示场景中具有一定参考价值。读者可借此直观认识从低级骚扰到系统崩溃的递进式攻击逻辑,掌握RAM溢出、处理器超负荷、输入输出占用等资源耗尽路径,并对照分类视图梳理不同等级样本的触发条件与表现,为后续恶意代码分析与防御策略学习打下感性基础。
1. 从 CuteVirusCollection 说起:一套能安全复现的 Windows 病毒行为样本集
很多人第一次听到「病毒集合」四个字,脑子里立刻浮现的是杀软弹窗、系统崩溃、文件被加密。CuteVirusCollection 恰恰相反,它是一套刻意做成「小型、无害、讨厌、有趣」的 Windows 恶意软件行为样本集,覆盖 Windows XP、7、10 三个世代,用 JavaScript、C、Java、Shell、Batch 等语言写成,主打的是「可爱但致命」的反差感——行为上模拟蠕虫、崩溃、炸弹、弹窗骚扰,但设计上不破坏真实数据、不联网传播、不加密文件。它解决的是一个很具体的痛点:安全初学者、课程设计者、CTF 出题人想演示「病毒到底怎么动起来的」,却不敢碰真实样本,也没有一个能放心在虚拟机里跑的教学素材。这套集合就是给这类人准备的,适合拿来做行为观察、杀软告警演示、课堂实验,不适合拿去当武器,也不适合在生产机上运行。
2. 样本分类与运行环境:先搞清楚你手里拿的是什么
2.1 按语言和行为拆开看这套集合
CuteVirusCollection 的价值不在于「多」,而在于「分类清晰」。它把样本按实现语言和行为类型两个维度切开,方便你按需取用。常见做法是先把目录按语言分桶,再在桶内按行为打标签。
| 语言 | 典型行为 | 依赖 | 适用系统 |
|---|---|---|---|
| JavaScript (.js/.jse) | 弹窗轰炸、文件隐藏、启动项写入 | Windows Script Host | XP / 7 / 10 |
| Batch (.bat/.cmd) | 无限开窗、关机循环、目录刷屏 | cmd.exe | XP / 7 / 10 |
| C (.c/.exe) | 进程 fork 炸弹、内存占用、窗口抖动 | 需自行编译 | 7 / 10 |
| Java (.jar) | 跨平台弹窗、线程耗尽 | JRE | 7 / 10 |
| Shell (.sh) | 类 Unix 行为模拟 | Git Bash / WSL | 10 |
这张表的意义在于:你拿到包之后不用一个个点开猜,先看扩展名就知道它大概会干什么、需要什么运行时。JavaScript 和 Batch 类样本几乎零依赖,双击即触发,最适合做第一轮观察;C 和 Java 类需要编译或 JRE,适合做进阶实验。
2.2 虚拟机隔离:跑之前必须做的三件事
血泪经验第一条:永远不要在宿主机上双击任何样本,哪怕它标着「无害」。无害指的是不破坏数据,不代表不骚扰你——无限弹窗、任务栏刷屏、启动项被改,这些足够让你重启三次。
第一步,装一台干净的 Windows 虚拟机。VMware 或 VirtualBox 都行,快照功能是后悔药,跑之前先打一个干净快照。
第二步,断网。把虚拟机的网络适配器设成「仅主机」或直接禁用,避免样本里万一有联网逻辑(哪怕作者说没有)造成意外。
第三步,关掉或调低宿主机的共享文件夹和剪贴板共享,防止样本通过共享通道影响宿主机。
# 以 VirtualBox 为例,创建快照(命令行方式) VBoxManage snapshot "Win10-Lab" take "clean-before-virus" \ --description "干净状态,跑样本前必打" # 跑完样本后一键回滚 VBoxManage snapshot "Win10-Lab" restore "clean-before-virus"这段命令的逻辑很简单:take是打快照,restore是回滚。参数"Win10-Lab"换成你自己的虚拟机名,"clean-before-virus"是快照名,随便起但要有辨识度。跑完任何一个样本,不管有没有出问题,都回滚一次,保证下一个样本在干净环境里跑。这一步不做,后面观察到的现象会互相污染,实验结论全是错的。
提示:快照回滚不会清理虚拟机磁盘里的残留文件,如果样本往系统目录写了东西,回滚后仍在。稳妥做法是每个样本跑完直接删虚拟机重建,或者用「链接克隆」模式。
3. 逐类复现:JavaScript、Batch、C 三类样本怎么跑怎么看
3.1 JavaScript 样本:用 WSH 观察弹窗与文件隐藏
JavaScript 类样本是这套集合里最容易上手的。Windows 自带的 Windows Script Host(WSH)直接支持.js和.jse文件,双击就跑,不需要装任何东西。常见的行为有两种:一种是while(true)循环弹alert,另一种是调用FileSystemObject把文件属性改成隐藏。
// 模拟:无限弹窗 + 隐藏指定目录下的文件 // 仅用于虚拟机内行为观察,请勿在宿主机运行 var shell = new ActiveXObject("WScript.Shell"); var fso = new ActiveXObject("Scripting.FileSystemObject"); // 弹窗轰炸,每 500ms 一次 while (true) { shell.Popup("CuteVirusCollection demo", 0, "Alert", 64); WScript.Sleep(500); } // 隐藏 C:\Demo 下所有文件(实际样本会先判断目录存在) // var folder = fso.GetFolder("C:\\Demo"); // var files = new Enumerator(folder.Files); // for (; !files.atEnd(); files.moveNext()) { // files.item().Attributes = 2; // 2 = Hidden // }逻辑说明:ActiveXObject("WScript.Shell")拿到 shell 对象,Popup方法弹窗,第二个参数0表示不自动关闭,64是信息图标。WScript.Sleep(500)让循环每半秒一次,避免瞬间卡死。下面注释掉的隐藏逻辑用FileSystemObject遍历目录,把Attributes设成2(Hidden 属性)。参数上,Attributes是位掩码,2是隐藏,4是系统文件,组合用6。
跑这类样本时,任务管理器里会看到wscript.exe进程。想停掉它,直接在任务管理器结束进程,或者命令行taskkill /im wscript.exe /f。观察重点是:弹窗频率、是否写入启动项(看HKCU\Software\Microsoft\Windows\CurrentVersion\Run)、文件属性有没有被改。
3.2 Batch 样本:cmd 无限开窗与关机循环的排查
Batch 类样本的行为更「讨厌」——它不破坏数据,但能让你的桌面在十秒内被 cmd 窗口铺满。典型写法是start cmd套在循环里,或者用shutdown命令做关机循环。
@echo off REM 模拟:无限开窗,每个窗口再开新窗口 REM 仅限虚拟机,宿主机跑会直接卡死 :loop start cmd /k "echo CuteVirusCollection && goto loop" goto loop逻辑说明::loop是标签,start cmd /k开一个新 cmd 窗口并执行后面的命令,goto loop跳回标签,形成递归开窗。/k参数表示执行完命令后不关闭窗口。这个脚本跑起来后,窗口数量指数增长,几秒内就能吃满桌面。
遇到这种情况,别慌着一个个关窗口。正确做法是打开任务管理器,找到「Windows 命令处理程序」或cmd.exe,右键「结束任务树」,一次干掉所有子进程。如果任务管理器也被窗口挡住,用Ctrl+Shift+Esc直接调出,或者Win+R输入taskkill /im cmd.exe /f /t,/t参数会连同子进程一起杀。
关机循环类样本用的是shutdown /s /t 0或shutdown /r /t 0,/s关机,/r重启,/t 0表示立即。想取消,在它执行前赶紧敲shutdown /a,/a是 abort。这个命令窗口期很短,所以看到关机提示第一反应就是Win+R然后shutdown /a。
注意:部分样本会把
shutdown命令复制到系统目录并改名,导致shutdown /a找不到原命令。稳妥做法是提前在虚拟机里备份一份shutdown.exe,或者直接用快照回滚。
3.3 C 与 Java 样本:编译、运行与进程观察
C 类样本需要自己编译,常见的是 fork 炸弹和窗口抖动。fork 炸弹在 Windows 上不像 Linux 那么直接,通常用CreateProcess循环创建自身进程来模拟。
// 模拟:进程自我复制,观察任务管理器进程数增长 // 编译:gcc -o bomb.exe bomb.c // 仅限虚拟机,宿主机跑会耗尽进程资源 #include <windows.h> int main() { while (1) { STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; // 启动自身的新实例 CreateProcess(NULL, "bomb.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); // 不等待子进程,继续循环 } return 0; }逻辑说明:CreateProcess启动一个新进程,第一个参数是程序路径(NULL表示用命令行),第二个参数"bomb.exe"是要执行的命令。FALSE表示不继承句柄,0是创建标志。循环里不调用WaitForSingleObject,所以父进程不会等子进程,进程数会快速上涨。
编译命令gcc -o bomb.exe bomb.c,需要 MinGW 或 Visual Studio 的命令行环境。跑起来后,任务管理器里bomb.exe进程数每秒翻倍,很快就能把系统拖慢。停止方法是taskkill /im bomb.exe /f /t,/t杀进程树。
Java 类样本通常是.jar文件,跑之前确认虚拟机里装了 JRE。运行java -jar sample.jar,观察线程数和窗口数量。Java 样本的好处是跨平台,在 Windows 10 上跑和在 Linux 上跑行为基本一致,适合做对比实验。
4. 避坑与排查:跑样本时最容易翻车的五个点
4.1 现象:双击 .js 没反应,或提示「没有打开方式」
原因:Windows 10/11 默认把.js关联到了别的程序,或者 WSH 被组策略禁用。很多精简版系统会关掉 WSH 来「优化性能」。
解决:先确认 WSH 是否可用,命令行跑cscript //?,有输出说明正常。没输出就去「启用或关闭 Windows 功能」里勾上「Windows Script Host」。如果.js关联错了,右键文件 →「打开方式」→ 选Microsoft Windows Based Script Host,并勾选「始终使用此应用」。
4.2 现象:Batch 样本跑完,cmd 窗口关不掉,任务管理器也卡
原因:样本用了start cmd /k递归开窗,窗口数量太多,任务管理器刷新不过来。
解决:不要一个个点关闭。用Ctrl+Shift+Esc调出任务管理器,切到「详细信息」标签,找到cmd.exe,右键「结束任务树」。如果任务管理器无响应,按Ctrl+Alt+Del选「注销」,注销会强制结束所有用户进程。注销后如果还有残留,重启虚拟机。
4.3 现象:C 样本编译报错「undefined reference to CreateProcess」
原因:编译时没链接 Windows API 库,或者用了错误的编译器(比如在 Linux 环境下编译 Windows 代码)。
解决:确认在 Windows 环境下用 MinGW 或 MSVC 编译。MinGW 下命令是gcc -o bomb.exe bomb.c -lkernel32,-lkernel32显式链接 kernel32 库。MSVC 下用cl bomb.c,它会自动链接。如果是在 WSL 里编译,需要装mingw-w64交叉编译工具链,命令是x86_64-w64-mingw32-gcc -o bomb.exe bomb.c。
4.4 现象:样本跑完,虚拟机重启后行为还在
原因:样本写入了启动项或计划任务,快照回滚只恢复磁盘状态,不恢复注册表和计划任务(如果快照是在写入之后打的)。
解决:跑样本前打快照,跑完立刻回滚,不要等重启。如果已经写入启动项,手动清理HKCU\Software\Microsoft\Windows\CurrentVersion\Run和HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce,以及任务计划程序里的可疑条目。稳妥做法是每个样本跑完直接删虚拟机重建。
4.5 现象:杀软把样本包整个删了,或者阻止运行
原因:样本虽然无害,但行为特征和真实病毒重合,杀软按行为拦截。
解决:在虚拟机里临时关闭实时防护,或者把样本目录加入排除列表。注意,这只在隔离虚拟机里做,宿主机千万别关杀软。如果杀软直接删文件,去隔离区恢复,或者重新解压样本包。
提示:部分样本会被 Windows Defender 标记为「潜在不受欢迎软件」,这是正常的,不代表样本真有害。判断标准是看它有没有联网、加密、删除真实文件的行为。
5. 进阶玩法:把样本变成教学演示和检测规则
跑通样本只是第一步,这套集合真正的价值在于「可改造」。我一般会拿它做两件事:一是录屏做行为演示,二是提取特征写检测规则。
录屏演示时,用 OBS 或 Windows 自带的 Xbox Game Bar 录下样本从双击到触发的全过程,重点录任务管理器、注册表编辑器、文件属性窗口的变化。录完回滚快照,下一个样本接着录。这样一套素材下来,课堂上一放,比讲十页 PPT 都直观。
提取检测规则时,重点看三个地方:进程创建链(比如wscript.exe启动cmd.exe)、注册表写入路径(Run、RunOnce)、文件属性变更(Hidden 属性批量设置)。把这些特征写成 YARA 规则或 Sigma 规则,就是一份现成的检测作业。
rule CuteVirus_JS_Popup { meta: description = "检测 CuteVirusCollection 中的 JS 弹窗样本" author = "lab" strings: $a = "WScript.Shell" ascii $b = "Popup" ascii $c = "WScript.Sleep" ascii condition: all of them }逻辑说明:strings段定义要匹配的字符串,$a、$b、$c分别对应样本里的关键 API 调用。condition段all of them表示三个字符串全部命中才告警,降低误报。参数上,ascii表示按 ASCII 编码匹配,如果样本用了 Unicode 编码,改成wide。这条规则只针对 JS 弹窗类样本,Batch 和 C 类需要另写规则,匹配start cmd、CreateProcess等特征。
验证规则时,用yara -r rule.yar sample_dir/跑一遍,看能不能命中已知样本。命中后,再拿正常文件测一遍,确认不误报。这一步做完,你就有了一个从「样本」到「检测」的完整闭环,比单纯跑一遍样本有价值得多。
从那以后我每次拿到新的样本集,都强制先打快照、断网、录屏、提规则,四步走完才动手分析。这套习惯帮我省了至少三次重装系统的麻烦。希望帮到你。
本文还有配套的精品资源,点击获取