简介CuteVirusCollection 是一份面向计算机安全爱好者与开发者的趣味实验性病毒样本集合覆盖 Windows XP/7/10 环境。资源以 JavaScript、C、Java、批处理及 Shell 脚本等形式按危害等级分类展示狼、虎、恶魔三级案例从弹出无限消息、随机移动鼠标/窗口到制造超大字符串耗尽 RAM、无限开启命令提示符窗口、递归 fork 炸弹再到永久递归的恶魔级批处理完整呈现了多种资源耗尽与系统干扰的典型实现思路。包体极小仅 47KB适合快速下载由于上游未提供具体文件总数与文件明细暂不展开。该资源已有 2011 人学习适合用来观察恶意代码的触发逻辑、理解系统资源耗尽原理也可作为开发安全演示或 CTF 学习的小型参考但请务必在隔离环境中运行。1. 一个“可爱但致命”的病毒集合它到底能做什么、你该不该碰很多人第一眼看到 CVC 这个名号会觉得它只是一个“可爱但致命”的病毒集合段子直到你在隔离环境里亲手触发一次才会意识到“可爱”只是文件命名的伪装。这个项目把 C、Java、JavaScript、Shell、批处理脚本打包成一套小型恶意样本覆盖从弹窗风暴、批处理自复制到 fork 炸弹的典型行为测试目标明确指向 Windows XP / 7 / 10。它解决的是恶意样本分析里最尴尬的问题真病毒不能随便跑、教学样本又不典型。CVC 把两者折中适合安全课设、行为观察、防御规则验证也适合给刚入门的同学做一个“不敢乱点”的纪律训练。我最初是因为研究某个跨平台系统的诱饵投递链才找到这类合集后来它变成我每次搭实验环境都固定复用的样本库。2. CVC 仓库结构与多语言分类C、Java、JS、Batch、Shell、CHTML 各在哪CVC 这类仓库不会按“病毒家族”归档而是按“宿主语言”归档。你拿到压缩包后第一眼看到的不是virus/、worm/这种分类而是src/c、src/java、src/batch这类目录。这个设计其实是合理的同一个攻击意图在不同语言下会有完全不同的触发方式、运行依赖和防御绕过效果。如果上来就按名字找“炸弹”你反而容易错过那些藏在注释里、看起来人畜无害的启动脚本。2.1 顶层目录与文件形态解压之后典型的目录分布是这样的C 源码放在单独的 C 目录下里面是纯.c文件Java 目录里是.java源码偶尔附带打包说明Batch 目录最杂乱从.bat到.cmd都有JS 目录里是给浏览器用的脚本Shell 目录则是用来在 Linux 子系统或容器里跑的。比较特殊的是 CHTML 这一类它并不是一个正式标准更像是“可内嵌进 HTML 的一句话恶意脚本”页面加载即执行适合观察浏览器默认策略对自动行为的容忍度。目录/文件形态代码宿主触发方式观测重点建议测试系统batch/*.bat批处理双击或cmd /c调用cmd.exe 进程数暴涨Windows XP / 7 优先c/*.cC 源码编译后运行 exe内存占用或进程耗尽对应编译器体系java/*.javaJava 源码java运行 classJVM 堆溢出带 JRE 的任意 Windowsjs/*.jsJavaScript浏览器加载 HTML弹窗/页面刷爆老 IE 与 Win10 对比shell/*.shShell 脚本Bash 环境执行进程表写满Linux 容器更合适chtml/*.html内联脚本片段直接打开页面页面自动执行行为取决于浏览器策略注意一个常见误区看到.js就以为要用 Node.js 跑实际上 CVC 里的 JS 大多是为浏览器设计的必须配合一个 HTML 壳才能触发。直接丢给 Node 只会得到一堆语法错误还容易让你误判“这个样本没效果”。2.2 为什么同一套效果要用四种语言真实攻击链从来不是单语言的。钓鱼附件里常见 Batch 加 VBS 的组合网页挂马用 JS 和 CHTML 片段内网横向移动时又变成 Shell 或 PowerShell 脚本最后在目标机器上落地的破坏载荷往往是 C 或 Java 写的一次性炸弹。CVC 把这些形态收在同一仓库等于把一条完整的投递链拆开摆在你面前入口脚本层负责触发驻留载荷层负责持续生效系统破坏层负责把机器拖垮。多语言并存还有一层好处是便于对比防御效果。同一个“进程翻倍增长”的逻辑在 Batch 里会被 Windows 的权限隔离打断在 Shell 里会被进程表上限限制在 C 里则取决于内存分配速度。你在实验报告里写“同一种攻击在不同宿主下的表现差异”比单纯复现一个样本要有说服力得多。2.3 平台边界的三个差异CVC 的 README 里没有细说但你在真实环境里很快就会撞到三个边界。第一个是批处理在 Windows XP 上双击即跑没有权限弹窗自我复制链非常顺畅到了 Windows 10智能应用控制可能在中途把子进程创建挂起脚本执行一半就断了。第二个是 JVM 堆的默认上界老版本 JRE 的默认堆比较小内存炸弹两三分钟就能憋爆新版本 JRE 默认堆变大同样代码可能要跑十分钟才有反应容易让人误以为样本失效。第三个是 C 源码的移植性问题仓库里的 C 代码默认走的是 Linux 的fork语义Windows 没有对应的系统调用直接用 Windows 工具链编译会失败需要改写成内存分配型死循环或者放到 Linux 子系统里跑。我自己就在 Win7 上踩过这个坑用 32 位工具链编译一个内存消耗型 C 程序结果进程地址空间上限只有 1.5GB 左右任务管理器里内存曲线一直不涨我一度以为是源码被精简过了。后来换成 64 位工具链效果才出来。这类边界不会写进任何文档只能靠环境对照测试摸出来。3. 核心机制拆解死循环、自复制与内存炸弹到底怎么生效CVC 里真正“致命”的部分归纳起来就三类持续消耗 CPU 的死循环、让进程翻倍的自我复制、把物理内存快速吃干净的内存炸弹。这三类行为在操作系统层面有不同的表现特征观测手段也不一样。下面挑几种典型实现拆开讲代码我做了精简只留核心逻辑避免把整个仓库直接搬进来。3.1 批处理自复制与无参死循环echo off rem CVC demo仅限隔离虚拟机演示进程耗尽 :loop start %~f0 goto loop这段逻辑不复杂每一轮start都会创建一个新的cmd.exe进程来执行同一个批处理文件新进程又回到:loop标签继续start。表象是 cmd.exe 进程数一轮比一轮多最终把系统进程表撑满。关键点在%~f0它取当前脚本的完整路径避免相对路径在中文目录或带空格的路径下解析失败导致自复制链断裂。如果你想放慢节奏观察可以在start前加一行ping -n 2 127.0.0.1 nul这样每轮之间会停顿大约一秒进程数增长曲线更平滑方便截图和写实验记录。观测位置是任务管理器里的 cmd.exe 进程计数一般从 1、2、4、8 的数量翻倍开始到几十个时系统已经明显卡顿。这时候不要试着“关闭所有进程”直接断电回滚快照即可。3.2 Shell 的 fork 炸弹管道与后台的配合bomb() { bomb | bomb } bomb这行是经典写法。bomb | bomb通过管道创建两个子进程同时递归调用自身把整轮调用推到后台让当前 shell 立刻空闲出来继续执行下一轮。效果是对系统进程表的持续写入超过pid_max后新进程创建失败系统表现为“连打开一个计算器都会报错”。参数层面的关键在于不能省去掉它就成了单线程死循环只会占用一个进程而非写满进程表。管道符号|决定了每轮的子进程数量改成两个管道就是每轮三个子进程增长更快。注意在 Windows 的 Linux 子系统里fork 语义和原生 Linux 有差异这个脚本的行为可能从“进程表写满”退化成“当前终端卡死”更适合放到容器里观察。3.3 C 的内存炸弹malloc 以后必须 memset/* CVC demo内存型炸弹仅限隔离系统 */ #include stdlib.h #include string.h int main(void) { size_t n 100; while (1) { char *p malloc(64 * 1024 * 1024); /* 每次分配 64MB */ if (p) memset(p, 0, 64 * 1024 * 1024); /* 强制换入物理内存 */ } return 0; }C 炸弹有个容易看走眼的细节只调malloc不碰内存操作系统可能一直给虚拟地址空间物理内存却涨得很慢因为页面还没被实际换入。加了memset之后每一页都会真实被写入物理内存占用曲线立刻上升。64 * 1024 * 1024这个值可以按需调设成 16MB 适合慢速演示设成 256MB 会在几秒内让系统假死。仓库里有些 C 源码默认是 fork 炸弹写法那是在 Linux 语义下的实现。Windows 上没有fork()如果你坚持在 Windows 环境编译需要把它改写成这种内存型逻辑。这不是偷懒而是适配目标平台。3.4 JS 弹窗风暴与 CHTML 内联触发!doctype html html headmeta charsetutf-8titleCVC demo/title/head body script while (true) { window.open(, _blank); } /script /body /html这个页面在打开瞬间就开始请求新窗口。现代浏览器对window.open有弹窗拦截机制只拦截“非用户手势触发的打开动作”所以这个死循环可能只弹几个窗口就被拦住了但在老版本的 XP 自带浏览器上它是真正意义的弹窗风暴标签页会以肉眼可见的速度膨胀最后只能强制结束进程。另外一个变体是用confirm循环while (true) { confirm(CVC demo: continue?); }confirm是同步阻塞的点一次确定立刻弹下一个现代浏览器对它的拦截规则比弹窗宽松所以在 Win10 上效果反而更稳定。CHTML 片段在 CVC 里通常就是把类似循环内联进 HTML 的短脚本不依赖单独的外部.js文件模拟的是攻击者把恶意代码直接写进网页源码的场景。4. 安全复现虚拟机配置、参数设定与触发前后检查这部分是 CVC 真正区别于“下载一个病毒直接跑”的关键。我的习惯是每个样本只在虚拟机里跑虚拟机装完系统后第一件事是打快照第二件事是关掉一切可能外联的网络通路第三件事才把源码放进去。顺序不能反因为一旦样本已经被执行任何清理都是亡羊补牢。4.1 虚拟机参数怎么给配置项推荐值理由客户机系统Windows 7 SP132 位XP 驱动难找Win10 权限拦截干扰行为观察内存1~2GB1GB 能让内存炸弹更快产生可见效果CPU1~2 核避免进程炸弹连累宿主机网络仅主机模式确保样本无法外联剪贴板/拖放禁用防止样本读取宿主机内容快照开机后立即打一个干净基线实验后的唯一后悔药网络这块强调一下不要用 NATNAT 虽然不开放入站连接但样本可以主动访问外网。仅主机模式下虚拟机和宿主机之间只有一块隔离网卡虚拟机外部通联基本为零适合观察纯本地行为。4.2 源码进入虚拟机的三种办法常见做法是共享文件夹但我建议把共享设置为只读或者更保险一点把源码目录做成 ISO 镜像挂载进去。这样可以避免“样本在虚拟机里运行时反过来修改宿主机目录”的意外。宿主机是 Linux 的话一条命令就能生成 ISOgenisoimage -o cvc.iso -R src/镜像挂载后在虚拟机里把它拷到本地目录比如C:\samples。这一步处理完之后关掉共享或卸载 ISO再开始实验。整个过程遵循一个原则样本从进入虚拟机那一刻起就和外界没有任何读写通道。4.3 触发后的进程采样与检查清单触发样本前先导出一份注册表自启动项和计划任务的基线触发后再导一次对比差异。批处理写注册表自启动是常见操作不提前留基线的话靠肉眼很难发现多了一条隐藏的 Run 项。# 进程数采样脚本记录实验期间的进程增长曲线 import subprocess, time, csv csv_path rC:\samples\proc_count.csv with open(csv_path, w, newline) as f: w csv.writer(f) w.writerow([timestamp, proc_count]) for i in range(120): out subprocess.check_output([tasklist, /FO, CSV, /NH]).decode(gbk, errorsignore) lines [l for l in out.splitlines() if l.strip()] w.writerow([time.time(), len(lines)]) time.sleep(0.5)这段脚本用tasklist /FO CSV /NH取纯 CSV 格式的进程列表不依赖任何额外工具。gbk编码是因为中文 Windows 的控制台默认代码页是 GBK不指定编码会乱码。采样间隔设为 0.5 秒能捕捉到进程翻倍的中间状态又不会因为采样太频繁占用太多 CPU 影响实验现象。跑完直接恢复快照不需要手动杀进程。触发前的检查也可以自动化先扫源码里的自启动关键字。grep -RniE reg add|schtasks|startup|runkey|persist src/这里-i忽略大小写-E使用扩展正则把注册表写入和计划任务相关调用全部列出来。CVC 里有些“无害”样本会在注释里藏一段注册表写入命令不扫一遍直接跑容易让实验结论失真。5. 避坑排查我在复现 CVC 时踩过的四个坑CVC 表面上是“小样本集合”但复现过程的坑密度比想象中高。下面四条是我实际踩过的每个都按“现象、原因、解决”写清楚希望能帮你绕开。5.1 在宿主机直接打开 HTML 炸弹弹窗关到手抽筋现象双击某个.html文件后浏览器瞬间弹出十几个窗口越关越多最后只能强制结束进程。原因我把它当成“普通网页”预览忽略了 CVC 里所有 HTML 相关文件都可能是恶意载荷浏览器对本地文件的执行没有任何边界保护。解决从那以后凡是仓库里出现的.html、.htm、.chtml一律拷进虚拟机再开。虚拟机里开完直接回滚快照不花时间清理。5.2 快照没打成功实验后想回滚只能从零装系统现象样本跑流程后系统彻底卡死强制关机再启动恢复快照时提示没有可用快照。原因我在复现中途才打快照此时样本已经写入了部分系统状态快照基线和当前状态混在一起另外虚拟磁盘在运行过程中持续膨胀快照文件生成失败没被及时发现。解决现在我的流程固定为“开机 → 关机 → 再开机 → 打快照 → 确认快照文件存在 → 再复现”确认这一步省不了。快照是所有复现实验的后悔药药没备好就别开跑。5.3 Win10 上批处理炸弹跑不起来进程数涨到两个就停现象双击.bat后任务管理器里只出现一两个 cmd.exe 进程很快就消失进程数完全涨不起来。我一度以为是脚本被精简了。原因Win10 的权限隔离机制和自带实时防护对流式脚本的处理逻辑不一样子进程创建被挂起自我复制链被提前掐断。解决如果非要 Win10 不可就改成在命令行里手动执行cmd /c demo.bat关掉针对该目录的实时防护跑完立刻恢复更省事的方法是直接换 Win7 虚拟机XP 上连权限弹窗都没有复现链路最完整。5.4 “无害”标签不可信脚本注释里藏着自启动注册表项现象隔离机运行某个“讨厌但无害”的脚本后我把导出的注册表基线拿来对比发现 Run 键下多了一条可疑条目。原因源码里有一行被我忽略的reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v update /d script.exe它被注释符包着但脚本执行逻辑里又有一处会动态拼接这一行。解决现在每个样本进虚拟机之前先跑一遍第四章里的 grep 关键字扫描再决定要不要禁用共享目录。实验后直接恢复快照不要手动删注册表项手动清理比快照回滚更容易留下痕迹。6. 进阶玩法参数化炸弹、进程采样与防御规则验证跑到这一步你已经不是“看一眼效果”了而是把 CVC 从玩具变成工具。我常用的进阶路线是先把炸弹改造成可控负载再配合脚本记录数据最后放到防御规则的测试集里验证检测效果。6.1 给批处理炸弹加可控参数echo off rem 参数化示例/limit 控制最大进程数/delay 控制每轮间隔毫秒 set /a limit50 set /a delay500 :loop for /f tokens1 %%i in (tasklist /FO CSV /NH ^| find /c cmd.exe) do ( if %%i geq %limit% exit /b ) start %~f0 ping -n 2 127.0.0.1 nul goto loop这段在原有自复制逻辑上加了两个控制点limit限制 cmd.exe 进程数上限超过阈值直接退出避免一台 2GB 内存的虚拟机完全被锁死ping -n 2 127.0.0.1充当延时把每轮间隔拉长到约一秒。注意批处理文件里for变量要用%%i如果你是在命令行直接敲就改成单个%i这是运行时最常见的报错点。6.2 把“崩溃”变成可读的观测数据配合第四章的 Python 采样脚本每 0.5 秒记录一次进程数跑完就能生成一张指数增长曲线。加参数化的炸弹跑出来的曲线在limit处被切平这个“平头”就是防御策略生效的视觉证据。我还试过把内存炸弹和采样脚本同时启动记录内存占用率变化输出 CSV 后用任意图表工具画图写实验报告时比贴截图有说服力。6.3 用 CVC 验证防御规则的召回能力把参数化改造后的样本放进受监控目录开启行为拦截类防护观察它在“创建子进程”或“分配大内存”这一步是否被拦。特征库匹配型的防御对这类微型样本往往失效因为“死循环分配 64MB 内存”本身没有恶意字符串特征而行为基线型的防御会因为在短时间内看到进程数翻倍或内存突增触发告警。CVC 正好适合当作这类漏报测试集成本低、类型全、可控性强。最后说个我自己的教训有一回我自认为网络已经隔离实际上虚拟机设的是 NAT实验结束后才意识到样本本来有机会外联。从那以后每次复现前我都强制走一遍三项检查网络仅主机、快照完好、源码无自启动关键字。这套习惯帮我攒下了不少可信的样本日志。希望帮到你。本文还有配套的精品资源点击获取