我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

CuteVirusCollection:安全复现Windows病毒行为样本的教学实践

CuteVirusCollection:安全复现Windows病毒行为样本的教学实践 简介这是一份面向计算机安全初学者与爱好者的趣味性恶意软件样本合集以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 HostXP / 7 / 10Batch (.bat/.cmd)无限开窗、关机循环、目录刷屏cmd.exeXP / 7 / 10C (.c/.exe)进程 fork 炸弹、内存占用、窗口抖动需自行编译7 / 10Java (.jar)跨平台弹窗、线程耗尽JRE7 / 10Shell (.sh)类 Unix 行为模拟Git Bash / WSL10这张表的意义在于你拿到包之后不用一个个点开猜先看扩展名就知道它大概会干什么、需要什么运行时。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 HostWSH直接支持.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设成2Hidden 属性。参数上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右键「结束任务树」一次干掉所有子进程。如果任务管理器也被窗口挡住用CtrlShiftEsc直接调出或者WinR输入taskkill /im cmd.exe /f /t/t参数会连同子进程一起杀。关机循环类样本用的是shutdown /s /t 0或shutdown /r /t 0/s关机/r重启/t 0表示立即。想取消在它执行前赶紧敲shutdown /a/a是 abort。这个命令窗口期很短所以看到关机提示第一反应就是WinR然后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递归开窗窗口数量太多任务管理器刷新不过来。解决不要一个个点关闭。用CtrlShiftEsc调出任务管理器切到「详细信息」标签找到cmd.exe右键「结束任务树」。如果任务管理器无响应按CtrlAltDel选「注销」注销会强制结束所有用户进程。注销后如果还有残留重启虚拟机。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/跑一遍看能不能命中已知样本。命中后再拿正常文件测一遍确认不误报。这一步做完你就有了一个从「样本」到「检测」的完整闭环比单纯跑一遍样本有价值得多。从那以后我每次拿到新的样本集都强制先打快照、断网、录屏、提规则四步走完才动手分析。这套习惯帮我省了至少三次重装系统的麻烦。希望帮到你。本文还有配套的精品资源点击获取
返回列表