可爱病毒样本包拆解:隔离虚拟机分析与复现避坑指南

发布时间:2026/11/6 6:57:26
可爱病毒样本包拆解:隔离虚拟机分析与复现避坑指南 简介这份面向计算机安全入门与恶意软件认知的趣味样本合集围绕 Windows XP/7/10 环境把“可爱但致命”的小型病毒、蠕虫与批处理脚本按灾害等级编排适合在隔离虚拟机中观察系统资源被占满、弹窗骚扰、输入设备扰动、窗口失控与进程耗尽等现象。压缩包约47KB页面文件总数为0且类型明细暂未提供从标签看涉及 JavaScript、C、Java、Shell 与批处理等代码样例线索。已有2078人学习下载。内容按1级“狼”、2级“老虎”、3级“恶魔”分层涵盖无休止消息、鼠标随机点击、窗口乱移、超大字符串淹没内存、无限命令提示符、分叉炸弹及批处理递归等案例便于读者建立对资源耗尽型与骚扰型恶意程序的基本认识、理解其破坏路径并用于防护演示、教学举例与安全实验前的风险辨识。1. 一个可爱病毒收藏包价值不在双击而在拆解先说结论这个可爱病毒集合我从头到尾没在物理机上跑过一个文件但它一直留在我硬盘里因为它是理解老式恶意程序到底怎么想问题最省事的教材。包里那些 javascript、c、java、shell、batch 写的小东西加上几只 worms、几个 crash 型样本还有 bomb 这类老梗绝大多数属于烦人但拆得开的级别。第一次拿到手我出于好奇点开过一个 .bat任务栏瞬间被窗口铺满最后靠任务管理器一个个关那次血泪经验让我从此把同类压缩包一律先丢进断网虚拟机再动。下面写的是我后来怎么按类型拆、怎么在隔离环境里看行为、哪些坑新手必踩。你要是手里也躺着一包同类收藏这套流程可以直接抄。2. 六类文件拆开看这个集合里到底装了什么拿到一个混合包我从来不按文件名顺序看而是先按谁负责执行它分组。这个判断依据很实在同一个行为写在批处理里和写在 C 里清理成本差十倍。批处理最多写坏几个用户目录、改个启动项删掉就完事原生二进制一旦进了进程层观察手段、终止方式、回滚成本全都不一样。所以下面这张表我按执行载体排而不是按听起来可不可怕排。2.1 一张表看懂六类的差别类型常见扩展名谁来执行典型行为风险判断观察重点批处理 batch.bat .cmdcmd.exe循环开窗口、写启动项、删用户目录文件中主要风险是持久化是否写 Run 键、是否改 autorunJavaScript.js .jse .wsfWSH 脚本宿主弹窗、通过文件系统对象落盘中看有没有落盘和联网有无 FSO、ActiveX 调用C 原生样本.c 编译成 .exe自身进程无限分叉、内存/句柄耗尽、崩溃高资源型最难收场进程树深度、句柄数增长Java.jar .classJVM起线程、写文件、开 Socket中低跨平台但依赖运行时有无网络 API 调用Shell.sh/bin/sh 系递归复制、死循环、占满进程低在 Win 桌面基本跑不起来脚本里的路径是不是 Win 风格CHTML/HTML 外壳.html .htm .chm浏览器或帮助宿主脚本死循环、伪装页面中容易骗过这只是个网页的直觉是否加载外部脚本表里风险判断这一列是我自己的口径不看它写得多凶只看它能不能摸到三样东西——提权、持久化、外发。三样都摸不到的重启基本就好了。CHTML 这一项说明一下关键词里这个词对应的是把脚本塞进 HTML 或帮助文件外壳、让老系统直接当页面渲染的路子具体是哪一种以你手上文件的实际扩展名为准别按名字猜。2.2 无害和讨厌为什么能同时成立这个包的描述里同时写了 harmless 和 annoying看着矛盾其实是两套标准。无害说的是破坏范围——它不加密文件、不写引导区、不碰系统目录删掉用户目录下那几个被改的文件、杀几个进程就恢复。讨厌说的是体验——窗口刷屏、鼠标抖、声音循环、进程把内存吃到爆让人恨不得重装。我判断一个样本属于哪一档一般会这么看先看它有没有写注册表 Run 键、启动目录、计划任务这三个是持久化的老三条再看它有没有起网络连接用系统自带的连接列表一看便知最后看它碰的文件路径是不是集中在临时目录和用户目录。三条都干净当骚扰级处理快照一回滚就没了只要有一条不干净就别当玩具按真实样本的态度对待观察记录、隔离、不留残余一个都不能省。还有一类容易被忽略崩溃型样本。它不写文件、不联网就干一件事——把资源吃到耗尽。这类东西在虚拟机里也一样能把宿主拖慢因为虚拟磁盘和内存是共享物理资源的。所以我给它的评级比看起来凶的弹窗类还高。2.3 上机之前先做静态清点能不上机就不上机。文本类样本.bat、.js、.sh、.c 源码根本不需要运行用编辑器打开就是全部逻辑读一遍比跑十遍收获大。二进制和压缩过的才需要动态观察。我习惯先做一遍静态清点把哪些是文本、哪些是二进制、哪些名字和内容对不上列出来。#!/usr/bin/env bash # 只做静态清点不执行任何样本 root./collection # 1) 按扩展名统计先看包里都有什么货 find $root -type f | awk -F. NF1{print tolower($NF)} | sort | uniq -c | sort -rn # 2) 文本类样本里搜高危调用这些词出现在哪一行基本就定了它的路数 grep -rInE start |taskkill|shutdown|format |del /|reg add|CreateObject|FileSystemObject $root | head -50 # 3) 名字和真实类型对不上的一律标红这是最常见的伪装手法 find $root -type f -exec file {} \; | grep -viE text|script第一条按扩展名计数目的是先建立心理预期别一上来就被几十个文件淹了第二条只对文本生效-I让 grep 跳过二进制避免输出一堆乱码第三条调file看真实类型输出里凡是显示为 PE 可执行、却挂着 .jpg、.txt、.scr 名字的全部单独拎出来。file的判断依据是文件头魔数比扩展名可靠得多改后缀骗不过它。二进制样本再补一步看它引用了哪些外部函数。静态链接的看不出什么动态链接的一眼就能看出它想干什么——导入表里有网络相关函数说明它打算联网有注册表相关函数说明它惦记持久化什么都没有只有循环和内存分配那大概率是崩溃型。提示静态阶段发现样本是加壳或混淆过的不要硬啃直接进虚拟机动态观察把时间花在能出结论的地方。2.4 三类最容易误判的文件第一类是双扩展名报告.txt.bat这种。系统默认隐藏已知扩展名的时候你在资源管理器里看到的就是报告.txt双击就跑。判断方法很简单把扩展名显示打开或者直接用命令行列目录。第二类是改了图标的可执行文件。图标资源可以随便换换成记事本、换成图片都行双击行为不变。这类只能靠file或者看文件头识别。第三类是 .scr 屏保。很多人不知道屏保文件本质就是可执行程序双击即运行还能被塞进启动项。包里如果出现 .scr按 exe 对待别按一张图对待。这三类误判的代价都不小而且都发生在我以为我看清楚了的那一秒。所以静态清点这一步我从来不省哪怕包里只有五个文件。3. 隔离环境怎么搭把想点开看看的冲动关进笼子虚拟机不是装上就安全。我见过太多人开了虚拟机、装了系统、然后共享目录一挂、剪贴板一开、网卡一桥接等于把笼子的门焊在了外面。真正能兜住这类样本的隔离环境核心就四件事能回滚、不连通、不共享、可观察。这四条缺一条观察结果就是不可信的。3.1 基线虚拟机的四项配置配置项建议值原因网络不接网卡或仅主机模式且不开服务杜绝样本外发和横向共享目录关闭防止样本写穿到宿主机剪贴板/拖放双向都关剪贴板是常被忽略的通道快照装完系统、装完观察工具后立刻打一个基线后面每次实验都从它回滚网络这一项要说得具体点桥接模式等于把虚拟机扔进你所在的那个网段样本如果带扫描或传播逻辑遭殃的不只是你NAT 稍好一点但出站仍然是通的仅主机模式最接近有网但出不去适合需要本地服务配合的场景最稳的是干脆不接网卡。这个包里带 worms 字样的东西碰都不该碰前两种。共享目录和剪贴板经常被当成便利功能开着这俩恰恰是最容易翻车的地方。共享目录在虚拟机里表现为一个网络盘符样本遍历盘符的时候顺手就写进去了剪贴板更隐蔽你从宿主机复制一段命令粘进虚拟机某些实现下是双向同步的。做实验的时候这两个功能我一个都不开。3.2 一次实验一个快照回滚纪律这条纪律听起来笨但它是所有观察结果可信的前提每个样本在跑之前先把虚拟机回滚到基线快照跑完记录完再回滚一次。不要在同一个运行状态下连跑三个样本因为你分不清第二个样本看到的现象是它自己干的还是第一个留下的。回滚之后还要做一件事检查基线本身有没有被污染。方法是回滚完先跑一遍进程列表和启动项跟你第一次打快照时的记录对一遍。对不上说明基线快照本身打晚了或者中间有东西写进了不该写的地方这个基线就不能用了得重装重打。3.3 观察工具与前后对比记录动态观察最省事的办法不是装一堆监控而是做前后快照对比。进程、启动项、服务、计划任务跑之前记一份跑之后记一份diff 一下多出来的就是答案。下面这段在 Win 平台的 PowerShell 里跑输出直接存文件方便比对。# 实验前后各跑一次输出存成不同文件名再 diff $stamp Get-Date -Format HHmmss # 1) 当前进程Id、名字、启动时间启动时间是关键新冒出来的都是刚起的 Get-Process | Select-Object Id, ProcessName, StartTime | Sort-Object StartTime | Export-Csv .\proc_$stamp.csv -NoTypeInformation -Encoding UTF8 # 2) 启动项注册表 Run 和启动目录都会被这里列出来 Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location | Export-Csv .\startup_$stamp.csv -NoTypeInformation -Encoding UTF8 # 3) 计划任务里最近创建的时间窗按需改 Get-ScheduledTask | Where-Object { $_.Date -gt (Get-Date).AddHours(-1) } | Select-Object TaskName, TaskPath, State | Export-Csv .\tasks_$stamp.csv -NoTypeInformation -Encoding UTF8StartTime这一列是精髓跑完样本立刻看谁的启动时间落在你双击之后的那几十秒里谁就是嫌疑人。Win32_StartupCommand会把注册表 Run、RunOnce 和启动目录三处的条目合并列出来Location告诉你它写在哪这个信息直接决定了你怎么清。计划任务那条按时间窗过滤AddHours(-1)是回看一小时实验时间短的话改成-10分钟更精准。文件层面的变化靠看目录修改时间就够了不用上重型工具。跑之前在关键目录记一次时间戳跑之后看哪些目录的修改时间变了再往里翻。3.4 什么情况下才考虑真机基本没有。唯一能想到的场景是样本依赖特定硬件或特定驱动虚拟机模拟不出来那也应该用一台离线、无数据、可随时重装的旧机器而不是你天天用的那台。这包里的东西没有任何一个属于这个级别全在虚拟机里就能看完。4. 逐类复现看着它到底干了什么复现的目的不是让它生效而是看清它在哪一行做了什么。所以下面给的代码全部带封装和上限能观察到行为但不会失控。真样本就在虚拟机里原样跑原理对照着看。4.1 批处理一个弹窗循环的完整观察批处理类样本最典型的动作就是刷窗口。原理简单到没什么好讲一个标签、一个start、一个跳转三行就是一个死循环。下面这版加了计数上限跑五次自己停用来观察窗口抢占和终止方式。echo off rem 受控演示最多弹 5 次记事本用于观察窗口抢占与终止方式 setlocal enabledelayedexpansion set /a count0 :loop set /a count1 start notepad.exe if !count! lss 5 goto loop echo triggered !count! times endlocal几个参数值得说清楚。start notepad.exe里那对空引号是窗口标题占位不写的话命令后面第一个带引号的参数会被当成标题吞掉这是批处理里最常见的翻车点之一。enabledelayedexpansion加上!count!是因为在同一个代码块里用%count%取到的是循环开始前的值永远不更新必须用延迟展开。lss是数值小于比较改成leq、gtr都行。把if !count! lss 5 goto loop这一行删掉就是完整的窗口轰炸样本。它的危害不在于删了什么而在于窗口反复抢焦点你以为点到了任务管理器其实点到的是新弹出来的记事本。真实样本里常见的加强版还会加成start cmd /c start notepad一层套一层终止起来更烦。终止办法任务管理器要能用快捷键叫出来CtrlShiftEsc 比 CtrlAltDel 快叫不出来就在另一个终端里taskkill /F /IM notepad.exe /T/T是连子进程一起杀/F强制。批量杀之前先tasklist | findstr notepad确认一下别把正常的记事本也带走。4.2 JavaScript 与 HTML 外壳浏览器层的死循环怎么收场JS 类样本的老套路是弹窗。while(true){alert(x)}这种写法一旦跑起来页面就废了——alert 是模态的阻塞主线程你点确定它立刻再弹一个连关标签页的点击都传不进去。用带计数器的版本观察它的节奏比直接跑死循环有价值。// 受控演示带次数上限的定时循环观察主线程被占用的表现 let i 0; const timer setInterval(() { i 1; if (i 3) { clearInterval(timer); // 到次数主动停避免页面彻底卡死 console.log(stopped at, i); return; } console.log(tick, i); // 把这行换成 alert(i) 就是无上限弹窗 }, 100);setInterval的第二个参数是毫秒间隔100 就是每秒十次调小能模拟更密集的弹窗节奏。clearInterval是保险丝把这三行删掉、把console.log换成alert行为就和无上限样本一致了。观察重点在两点一是弹窗出现时页面是否还能滚动二是关掉弹窗后计数器还在不在涨——后者能区分弹一次就完和循环弹。已经卡死的页面怎么收场优先级从低到高是关标签页、浏览器任务管理器里结束该标签的进程、系统任务管理器里结束整个浏览器进程树。注意别只结束主窗口进程渲染进程还活着的话弹窗可能还在。有些老系统上这类样本会伪装成 .chm 帮助文件打开时由帮助宿主加载页面表现类似终止的时候要连宿主一起结束。4.3 C 与 Shell分叉型崩溃的原理用受限方式看崩溃型样本里最有代表性的是分叉型一个进程变两个两个变四个指数级涨上去进程表满了系统就没法响应了。直接写while(1) fork()是不负责任的我用一个带深度限制的版本把原理演示清楚再讲怎么兜底。#include stdio.h #include unistd.h #include sys/wait.h /* 受控演示只向下分叉 depth 层父进程等待子进程退出。 * 把 depth 判断去掉、把 waitpid 删掉就是典型的资源耗尽型样本。 */ static void spawn(int depth) { if (depth 0) return; pid_t pid fork(); if (pid 0) { /* fork 失败进程表满或内存不足 */ perror(fork); return; } if (pid 0) { /* 子进程打印后继续往下分叉 */ printf(child pid%d depth%d\n, getpid(), depth); spawn(depth - 1); _exit(0); /* 子进程用 _exit别走 atexit 链 */ } waitpid(pid, NULL, 0); /* 父进程回收避免僵尸进程堆积 */ } int main(void) { spawn(4); /* 4 层最多十几个进程安全 */ return 0; }fork()的返回值有三种情况这三种情况就是理解分叉型样本的全部钥匙小于 0 表示失败通常是进程数或内存到顶了等于 0 表示当前在子进程里大于 0 表示在父进程里返回值是子进程的 pid。样本去掉深度判断之后每一个进程都会继续分叉进程数按 2 的幂涨几秒内就能把系统拖死。waitpid在演示版里是必须的否则子进程退出后变成僵尸父进程不回收进程表照样会被占满——这一点常被忽略很多人以为删掉分叉就安全了其实僵尸进程一样能拖垮系统。Shell 侧的原理相同只是壳换成了循环和后台执行。观察之前先给自己上限制这是唯一能保证不失控的做法。#!/usr/bin/env bash # 先设上限再演示当前会话最多 200 个进程超了 fork 会失败 ulimit -u 200 echo process limit: $(ulimit -u) # 只做打印和短暂后台执行观察进程数变化不做真正的炸弹 for i in $(seq 1 50); do ( sleep 0.05 ) done echo current procs: $(ps -e --no-headers | wc -l)ulimit -u设的是当前 shell 及其子进程能创建的进程数上限设完立刻生效超出的 fork 直接返回失败这正是我们需要的安全阀。seq 1 50控制轮次想观察更密集的可以调大但有上限兜着最坏结果是一批 fork 失败报错不会把机器带走。最后那行统计当前进程数跑之前跑之后各看一次差值就是你的循环造出来的量。注意ulimit -u只在当前会话有效新开终端就失效了。做这类观察一定在设了限制的那个终端里跑别切窗口。4.4 观察记录就记三列时间、现象、对应的代码行。比如00:12 第三个窗口弹出焦点被抢对应对应start notepad.exe那行。三列记下来事后复盘的时候你能一眼看出哪一行是无害的展示、哪一行是真正有副作用的动作。这比事后凭印象写总结靠谱得多也是我把这套流程固化成习惯的原因。5. 排查与避坑虚拟机里翻过的五次车5.1 五个高频翻车现场快照回滚了宿主机文件还是被改了。现象是回滚后虚拟机干净但宿主机某个目录多出几个文件。原因是共享目录还挂着样本遍历盘符的时候顺手写过去了回滚只回滚虚拟磁盘不回滚宿主机。解决办法很简单做实验前把共享目录彻底移除不是取消勾选是删掉那条共享配置然后在虚拟机里确认看不到那个盘符。断网了样本还是弹出了网页。现象是网卡已经断开浏览器却打开了某个页面。原因是虚拟机工具自带的剪贴板同步或拖放通道还在工作样本通过宿主通道把内容送出去了。解决办法是装完系统就把这类增强功能里的共享通道全关宁可不方便。判断有没有关干净在虚拟机里复制一段文字看宿主机剪贴板有没有变。双击样本之后任务管理器打不开。现象是窗口疯狂抢焦点点什么都点不准。原因是这类样本的设计目标就是这个靠鼠标操作基本没戏。解决办法是记住快捷键CtrlShiftEsc 直接叫任务管理器或者提前开一个管理员终端放旁边出事就taskkill /F /IM 进程名 /T。我现在做这类观察终端永远是先开好的。样本改了后缀我当成图片放过了。现象是静态清点的时候把一个 .jpg 归类成无害资源后来发现它能执行。原因是我只看了扩展名没用file验证真实类型。解决办法是把file那一步写进固定流程凡是输出不是文本或已知图片格式的一律单独拎出来看文件头。跑完觉得没事继续用这台虚拟机做别的实验。现象是后面几次实验的现象全都对不上预期。原因是上一次的残留还在进程没杀干净、启动项没清、临时目录里躺着文件你以为的基线其实已经被污染了。解决办法是回滚之后再做一次基线校验进程数、启动项条数跟你第一次打快照时的记录对一遍对不上就重装。5.2 一条通用排查顺序出问题的时候别乱翻按这个顺序走从活的查到死的先看进程找启动时间异常的和名字可疑的再看启动项注册表 Run、RunOnce、启动目录三处都要看然后看计划任务按创建时间倒序再看文件关键目录的修改时间最后看连接有没有对外的会话。前两步能解决八成问题因为绝大多数骚扰型样本都停在进程和启动项这一层再往下就是真实恶意程序的做法了。顺序不能反。先看文件再看进程的话你会被一堆正常文件的修改时间淹没根本找不到重点。先看连接也一样样本如果压根没联网这一步纯属浪费时间。5.3 什么时候直接放弃观察有三种情况我会直接放弃不再深究。一是样本需要提权才能跑出完整行为而我不想在虚拟机里给它管理员权限二是样本行为依赖特定硬件或驱动虚拟机模拟不出来硬看只会得到错误结论三是样本一跑起来虚拟机就直接失去响应连记录的机会都没有。这三种情况下观察的价值低于风险把文件类型、静态特征记录下来就够了不需要看全。6. 收在一张处置清单上看到就知道下一步做什么这套东西跑下来最后沉淀下来的其实不是某个工具或者某段代码而是一张看到什么就做什么的对照表。我把这包里的六类样本按处置动作归了一次类实际用的时候照着走不用每次重新想。看到的类型第一步绝对别做恢复方式.bat / .cmd文本打开读完再决定直接双击杀进程 查启动项.js / .jse / .wsf看有没有文件系统对象调用在宿主机的 WSH 里跑关进程 清临时目录C 编译产物file确认真实类型在共享目录所在的虚拟机里跑回滚快照.jar / .class看有没有 Socket 相关调用给管理员权限回滚 检查用户目录.sh看路径是不是 Win 风格在宿主机终端里执行基本无需处理.html / .chm断网打开连着网开浏览器结束宿主进程这张表的用法很直接拿到一个文件先归到某一行然后按中间那列走。真正救命的其实是第三列——那些绝对别做的事全是我或者身边人真踩过的。第二列的第一步看起来啰嗦但它把好奇心和执行这两件事隔开了隔开之后你才有判断的机会。回过头看我从这个可爱病毒集合里得到的最有价值的东西不是认识了哪几种整蛊手法而是养成了一套固定动作先分类再静态读再进快照跑完立刻对进程和启动项然后回滚校验。这套动作做熟之后面对任何来路不明的文件第一反应不再是双击看看而是先看看它是什么。从那以后我每次碰这类压缩包都强制走一遍快照回滚和进程快照这两步中间不跳步。慢是慢了点但省下来的重装时间远超这点开销。这份集合本身的价值也在这儿——它小、它无害、它拆得开正好拿来当练习素材。愿意拿去当样本库的自己去取就行别急着运行先按上面的顺序读一遍。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询