简介:CuteVirusCollection是一份小巧但“致命”的恶意代码集合,聚焦Windows XP/7/10环境下的小型病毒、蠕虫与崩溃实验,面向安全爱好者、编程学习者和隔离环境测试者。资源按灾害等级分为三层:一级狼包含无休止弹窗、随机鼠标移动、窗口漂移与强制关机;二级老虎模拟超大字符串灌满RAM、无限命令提示符堆积、fork炸弹和海量子进程挤压CPU;三级恶魔演示批处理永久递归,让系统在循环中彻底失去响应。压缩包约47KB,文件总数标注为0(上游未提供有效文件明细),涉及JavaScript、Java、C、Shell、Batch等代码脚本,便于对照不同语言实现资源耗尽攻击的差异。已有2011人学习。读者可在虚拟机或沙箱中依次运行这些示例,观察系统崩溃前的异常征兆,理解恶意软件从骚扰到毁灭的常见路径,并为系统加固和应急响应提供直观参考。
1. CuteVirusCollection 不是玩具:它是一面恶意代码的照妖镜
初次拿到这类集合时我以为是娱乐用的,结果在隔离环境里逐个跑了一遍才发现,"可爱"两个字只是障眼法。真正有用的不是这些小程序本身,而是它们逼着你把恶意代码分析的全流程走了一遍:从静态特征识别、行为观察,到把特征翻译成检测规则。对想入门恶意样本分析又不想一上来啃真实木马的新手,这个资源是很合适的练手对象;对已经在做防御的人来说,它同样能当检测脚本的实验素材。这篇就把我的分析流水线和踩坑记录完整放出来,能帮两类人:一是想知道"这堆样本到底能拿来干嘛"的初学者,二是想找现成检测规则设计思路的安全工程师。
2. 先解剖:这个病毒集合里到底藏着什么
先给结论:这套集合用一句话概括就是"隔壁主机上最常见的破坏小把戏都编进去了",覆盖了批处理(batch)、JavaScript、VBS、C/C++ 小工具、Java 程序,甚至还有少量针对 Windows XP/7/10 差异的 PE 样本。别被"可爱"两个字带偏,里面大部分样本跑起来的表现是:进程数爆炸、窗口无限弹、文件被删、系统直接卡死或重启。这一章我按两个维度把它拆开,让你拿到后知道该从哪下嘴。
2.1 按载体拆:batch/js/shell 脚本类样本是入门最快的一批
打开集合第一件事不是运行,而是先看文件后缀。我一般会把样本按载体分成三批:纯脚本、混合脚本、编译产物。纯脚本是最好上手的,因为它们是明文。batch 和 cmd 后缀的样本占了相当比例,典型套路是循环调用 start 命令打开一堆 cmd 窗口,或者在启动目录里写入自身实现持久化。JavaScript 和 VBS 样本也好懂,关键动作通常围绕 WScript.Shell、ActiveXObject、CreateObject 这几个对象展开,配合一小段文本混淆就能掩盖真实意图。这类样本适合作为第一课,因为行为可读,特征肉眼可见。
C/C++ 编译出来的是真正的 PE 文件,行为更底层:弹窗、访问注册表、写启动项,甚至直接调用系统 API 把自己拷贝到每个盘符的根目录。Java 样本数量最少,多半是以 jar 或 class 方式存在,跨平台但依赖运行时。Shell 脚本在 Windows 语境下基本是为了演示原理用,放在集合靠后的位置。为了看得清楚,我把这批样本的载体、常见动作和分析难度整理成一张表:
| 载体 | 常见形式 | 典型行为 | 分析难度 | | batch / cmd | 文本脚本 | 窗口轰炸、死循环、自复制到启动目录 | 低 | | JavaScript / VBS | 文本脚本 | 弹窗、调 PowerShell、改注册表 | 低到中 | | C / C++ | exe(PE) | 弹窗、写文件、改启动项、崩系统 | 中 | | Java | jar / class | 弹窗、写文件,依赖 JRE | 中 | | shell | sh 脚本 | 类 Unix 环境演示 | 低 |
这张表对刚入门的同学意味着什么:先挑 batch 和 JS,别一上来就在 PE 样本上耗时间。PE 样本要处理加载器、混淆和系统 API,情绪价值很低,挫败感很强。脚本类样本五分钟就能让你看到行为闭环,先把"观察—记录—验证"的手感练出来,再上 PE。这是我给新手最直接的选型建议。
2.2 按行为拆:消耗型、打扰型、破坏型三种套路
把载体抛开,只看行为,整个集合其实只有三类:消耗型、打扰型、破坏型。消耗型的目标是把系统资源榨干,最常见的是进程炸弹和批处理炸弹,特征是进程数或窗口数在几秒内指数级增长,最终让系统失去响应。打扰型是以烦人为目的,比如无限弹窗、改壁纸、移动鼠标、弹出光驱,这类样本不会删数据,但同样危险,因为它会分散你的注意力,让你忽略它同时写入的注册表改动。破坏型是最要留意的一类,动作包括删除开机文件、改写文件关联、清除注册表启动项、甚至向硬盘写入垃圾数据。
判断依据很简单:先看它有没有写文件的动作,再看有没有结束进程的动作,最后看有没有持久化动作(启动项、服务、计划任务)。我一般会按下面的信号做初判:
| 类型 | 关键信号 | 检测思路 | | 消耗型 | 进程数量暴涨、CPU 持续 100% | 监控进程创建速率 | | 打扰型 | 弹窗句柄反复出现、注册表被改 | 记录窗口事件与注册表快照 | | 破坏型 | 文件被删除、启动项被改 | 文件哈希快照对比、启动项巡检 |
这个分类直接决定你怎么防御。消耗型要靠资源限制和进程速率告警;打扰型要靠白名单机制和注册表还原;破坏型必须靠快照和备份兜底。后面的第 4 章,我会讲怎么把这三类信号变成具体的检测规则。
2.3 Windows XP/7/10 平台差异:为什么老样本在新系统上跑不起来
这套集合的标签里挂着 windows-xp-7-10,见过一次后我就记住了。这份标签不是随便标的,同一份样本在三代系统上的表现可能天差地别。XP 时代没有 UAC,很多样本双击即最高权限;到了 Windows 7,UAC 弹窗拦一下;到 Windows 10,系统自带防病毒软件会在落盘或执行阶段直接干掉大部分样本。前几年编译的老 PE 在 x64 新系统上还有兼容性问题,有的直接崩,有的行为错乱。
常见的做法是备两台虚拟机:一台 XP SP3,一台 Windows 10,集合里的样本分开跑。XP 专门用来跑老 batch 和 PE,Windows 10 用来观察哪些样本会被系统自带防线拦截、拦截时机在落盘还是执行。这本身就是一个有价值的对比实验,能让你直观理解攻防双方都在随着系统进化。判断样本能不能跑,别猜,直接看进程监控输出,这个动作在第 3 章我会详细演示。
3. 建立分析流水线:让恶意样本在隔离环境里开口说话
跑样本这件事没有玄学,只有纪律。我的完整流程固定四步:打快照、断网络、跑样本、抓行为,每次都是同一套。下面把每一步拆开,并给出一段可以直接抄走的进程监控脚本。
3.1 快照是后悔药,隔离是底线
先说虚拟机。用什么虚拟化平台不重要,关键是要能做到两件事:快照回滚、网络隔离。干净系统装完监控工具后,先打一个"基线快照",然后跑样本,跑完观察完,直接还原基线。这就等于有了后悔药,样本再能折腾,一秒钟回到干净状态。注意快照要在样本落地之前打,跑完一个就回滚一次,不要在一个快照上连续跑多个样本,否则行为日志混在一起没法归因,后面第 5 章我会专门讲这个坑。
网络方面,我的习惯是给虚拟机配一个不存在的网关,或者直接只保留 host-only 网络。这里先记住:永远不要让样本跑在一个能访问外部网络的虚拟机里。有些蠕虫样本具备在网络里自传播的能力,一旦让虚拟机连上物理网络,就不是你控制它,而是它控制你。后面踩坑里有一次就是这么翻的车。
3.2 行为取证三板斧:进程、文件、注册表
观察样本行为,主要看三个地方:进程列表、文件系统、注册表。进程列表回答"它起了什么",文件系统回答"它写了什么",注册表回答"它改了什么"。三者缺一不可。
不需要装很重的工具,系统自带的能力就能做第一层取证:tasklist 看进程,dir /s 配合时间戳看文件,reg query 看注册表。我习惯在跑样本前先抓一次基线,跑样本后再抓一次,两次输出做 diff,差异就是样本留下的大部分痕迹。文件层面最好记录目录树的完整清单,注册表层面重点看 Run 键、服务键、文件关联键这三处,因为脚本类病毒最喜欢往这些位置写开机自启。把这三个地方盯住,样本大部分动作都跑不掉。
3.3 手写一个进程监控脚本,把样本行为拍下来
为了不每次都手动刷新,我给这个集合配过一个进程监控脚本,核心逻辑是固定时间间隔抓取进程列表,把新出现的进程和消失的进程都记录到日志里。下面是核心代码:
import subprocess import time import datetime def get_process_set(): # 在 Windows 上用 tasklist 拿进程名集合,按 CSV 格式解析进程名 raw = subprocess.check_output("tasklist /FO CSV", shell=True).decode("utf-16", "ignore") lines = raw.splitlines()[1:] return {line.split(",")[0].strip('"') for line in lines if line.strip()} def main(): log = open("proc_log.txt", "a", encoding="utf-8") prev = get_process_set() while True: time.sleep(1) # 采样间隔,炸弹类样本可以调到 0.2 秒 cur = get_process_set() for p in cur - prev: # 集合差集:新出现的进程 ts = datetime.datetime.now().isoformat() log.write(f"[{ts}] NEW {p}\n") for p in prev - cur: # 消失的进程 ts = datetime.datetime.now().isoformat() log.write(f"[{ts}] EXIT {p}\n") log.flush() prev = cur if __name__ == "__main__": main()这段代码里两个集合的差运算是关键:cur - prev 得到新增进程,prev - cur 得到退出进程。为什么值得看退出进程?因为有的样本干完坏事会把自己删掉或用完即退,如果只盯新增进程,会漏掉这些痕迹。采样间隔的设定也要注意,批处理炸弹在极短时间内会拉出大量 cmd 进程,1 秒采样间隔可能看不到尖峰,改到 0.2 秒再跑一次,现象就明显了。
参数调整的思路是:先按 1 秒跑一遍看整体轮廓,再针对可疑时间段加密采样。日志里每一行都有时间戳和事件类型,方便后续跟系统事件日志对时间线。
3.4 完整复现一个典型样本的分析过程
我用集合里最典型的"批处理窗口轰炸"做一次完整复现。首先确认样本是文本文件,用代码编辑器打开,能看到一个循环结构:不断调用 start 命令打开新的 cmd 窗口,新窗口一出现又立即执行同样的命令。这是纯资源消耗型攻击,不需要管理员权限,普通用户权限就能跑。
接着是动态验证。在装有基线快照的虚拟机里执行样本,同时启动上面那个监控脚本。现象清单大致是:1 秒内新增进程列表刷出大量 cmd;CPU 占用冲到接近满载;窗口数量暴涨导致桌面无法操作;日志文件里 NEW 事件以毫秒级密度刷屏。然后回到快照,整个环境恢复原状。
判断这种样本的要点在于:别被"无数窗口"这个表象带偏,真正值得记的是进程创建速率和峰值进程数。这两个数据,才是后面写检测规则的依据。
4. 从样本到检测:把"致命"翻译成可落地的规则
分析样本不是终点,把它变成检测规则才是。这个过程我习惯拆成两步:先做静态特征提取,再做行为规则设计。一套能用的检测规则,必须同时包含"已知样本的特征"和"未知样本的行为模式"。
4.1 静态特征提取:批处理炸弹和脚本病毒的"指纹"
静态特征是最容易落地的检测资产。所谓特征,不一定是复杂的哈希,反而是样本里那些明文字符串最管用。批处理炸弹的文本里通常同时出现递归调用和跳转关键字,比如 ":loop"、"goto"、"start"、"%0"(批处理里代表自身)这几个标志性组合。JavaScript 样本里常见 WScript.Shell、ActiveXObject、powershell 调用的关键词。看到这些组合,不用运行也能先判一个大概。
为了让这些特征可以被机器检索,我通常会写成 YARA 规则。比如检测批处理窗口轰炸的规则可以这样写:
rule BatchBomb_TextDetect { strings: $s1 = "start " ascii nocase $s2 = "%0" ascii $s3 = ":loop" ascii nocase $s4 = "goto" ascii nocase condition: filesize < 200KB and 2 of them }这条规则的判断依据是:批处理样本体积通常很小,同时出现两个以上关键字组合,命中为炸弹样本的概率极高。当然静态特征有天然的误报率,正常批处理脚本也会用 goto,所以静态规则只能做前置筛选,最终判决要交给行为规则。
4.2 行为规则设计:进程创建速率是消耗型样本的命门
静态规则能抓已知,行为规则才能抓变种。消耗型样本的共同弱点是"短时间创建大量进程",这是很难伪装的物理特征。一台正常工作的机器,不可能瞬间冒出几十个 cmd 进程却没有原因。
行为检测的落地思路是把进程创建事件拉成时间序列,计算滑动窗口内的速率,超过阈值就告警。上面第 3 章那个监控脚本就已经具备雏形:把"NEW 事件数量"累加进一个 5 秒窗口,如果连续三个窗口都高于设定阈值,就触发一次告警。阈值怎么定?先在自己干净的虚拟机里跑一段正常操作统计基线,再跑样本看峰值,取一个能明显区分的值。这个套路同时也是很好的实验练习。
除了速率,还要看父子进程关系。典型炸弹的父进程往往是同一个样本进程,子进程又继续创建子进程,形成明显的单源树。如果进程树里大量兄弟进程的父进程指向同一个可疑文件,这个关联信号比单纯的速率告警更精准,也更难被误报。
4.3 蠕虫自复制的检测:同名同源同样本
集合里的蠕虫样本大多不是高端传播,而是简单自复制:把自身拷贝到可移动磁盘根目录、启动目录或当前目录的所有子目录。检测思路是文件哈希快照对比:跑样本前对关键目录做一次哈希清单,跑样本后再做一次,新增文件里凡是自拷贝副本,哈希和原样本一致,一条规则就能全部识别。
# 统计某个目录下所有文件的哈希,跑样本前后各执行一次,再做 diff find D:/test -type f -exec md5sum {} \; > before.txt # 运行样本... find D:/test -type f -exec md5sum {} \; > after.txt diff before.txt after.txt注意这个命令只统计了文件哈希,没统计目录结构。有些样本自复制时会新建多层目录,建议同时记录目录树,否则只看文件列表可能漏掉"新增文件夹"这个信号。
5. 避坑指南:分析这类样本时我踩过的几个坑
分析这套集合的头一周,几乎每个样本都让我翻过一次车。现在把这些血泪经验按危害程度整理出来,每条都是"现象 → 原因 → 解决"的完整链路,照抄就能少交学费。
5.1 踩坑一:在真机上点了样本
现象:为了图省事,直接在开发机上跑了一个"应该只是弹窗"的样本。结果一分钟内启动项被改写,系统自带防病毒软件也没拦住那个写入动作。
原因:对"看起来无害"的样本放松了警惕。集合标题里写着"无害""有趣",但那是提交者的视角,不是恶意代码的真实行为。任何样本在静态分析完成之前都不能默认安全。
解决:所有样本一律进虚拟机执行,真机只放分析工具和样本副本,不直接运行。从那以后我要求自己:双击前先确认当前会话是不是虚拟机,这个动作已经变成肌肉记忆。
5.2 踩坑二:虚拟机联网跑样本
现象:在默认 NAT 网络模式下跑了一个蠕虫样本,结果同网段的测试主机开始出现文件共享告警,样本利用虚拟机共享文件夹把副本传了出去。
原因:样本具备在局域网内用文件共享传播的能力,虚拟机的 NAT 网络把流量转发到了物理网络,等于给蠕虫开了一扇门。
解决:网络适配器设为 host-only 或直接禁用;跑样本前拔掉虚拟网络;对确实需要观察网络行为的样本,用流量监控工具先记录行为特征,再断网重放。当前面那一行配置没设置好时,宁可停掉实验也不要带网跑。
5.3 踩坑三:只看文件名猜行为
现象:一个命名为"喵喵.jpg.exe"的样本,我凭标题里的"可爱"标签误判为无害弹窗,实际运行后批量删除了工作目录下的备份文件。
原因:文件名和作者注释都不代表真实逻辑。集合标题里的"cute"是障眼法,文件名里的 jpg 前缀只是字符串拼贴,扩展名才是真实身份。
解决:分析顺序永远是静态在前、动态在后。先打开文件看关键字和格式,再算哈希去查询哈希库,最后才运行验证判断。跳步就会出现"以为它是小猫咪,结果它是大灰狼"的翻车现场。
5.4 踩坑四:新系统跑不动老样本就没当回事
现象:某个老 PE 样本在 Windows 10 上双击无反应,我直接判定"没危害"并跳过。后来在 XP 虚拟机里重跑才发现它默默改写了注册表文件关联。
原因:样本可能因为权限模型差异或兼容性问题没有触发主逻辑,但会走一个"延迟生效"的备选路径。没反应不等于没行为,只是表现得不明显。
解决:老样本一律放到 XP 虚拟机里跑;观察时间拉长到两分钟以上;用注册表对比和文件快照确认样本真的没有动作。判断样本是否执行,以监控工具的 diff 结果为准,不以肉眼反应为准。
5.5 踩坑五:跑完样本不还原快照
现象:连续分析了三个样本后,第四个样本的行为日志里混进了前一个样本的注册表改动,折腾半天才定位到归因错误。
原因:想在同一个"干净"环境里省事,结果环境早就被前一个样本污染了。同一个快照上跑多个样本,日志无法切割,归因全是糊涂账。
解决:每分析完一个样本,无条件回滚基线快照,再开始下一个。这是整个流程里最不能打折的一条纪律。快照回滚不是可选步骤,是分析流程的结束按钮。
6. 把这套样本用成检测练习场:一个可复用的训练流程
说到这里,这个集合的价值就清楚了:它不是拿来收藏的玩具,而是一套可以反复使用的检测规则训练题库。我的练法很简单,把每个样本当成一道"封闭题"来作答,流程固定为六步。
第一步,从集合里随机抽出一个样本,先看文件名和扩展名,写下你的初步判断;第二步,用代码编辑器打开文本类样本,提取所有可疑字符串,写进一张特征表;第三步,给虚拟机打快照并配好 host-only 网络;第四步,运行样本并同步启动进程监控脚本,记录现象;第五步,根据现象写检测规则,静态规则用 YARA,行为规则用进程速率阈值,然后回到干净快照重新跑一遍,验证规则能不能命中;第六步,回滚快照,把规则存进自己的规则库。
这套流程我连续做了两轮之后,最大的收获是:分析速度提上来了,而且误判率降得很明显。因为每一轮都在强迫自己回答"我到底依据什么判断它无害",而不是凭感觉。从那以后,不管拿到什么新样本集,我都会强制走一遍这个流程——先静态提特征,再快照动态验证,最后落成一条规则。哪怕样本本身很普通,这条流程也能让分析动作不变形。
如果你手里正好存了类似的样本集合,别急着删或吃灰,换个用法:把它当检测练习场。每分析完一个样本就写一条能落地的规则,攒到二十条,你对"恶意行为长什么样"的判断力会和之前完全不同。希望帮到你。
本文还有配套的精品资源,点击获取