资讯动态

VBS整人脚本能力边界与安全排查:从COM对象到隔离复现

发布时间:2026/10/29 12:47:03 来源:尧图企业网站定制
简介VBS整人代码大全是一份面向VBScript初学者的趣味脚本合集以恶作剧小程序的源码为载体帮助读者理解MsgBox消息框、InputBox输入框、条件判断与Do...Loop循环等基础语法在实际脚本中的组合方式。文档围绕模拟系统警告、调用Wscript.Shell执行shutdown命令、SendKeys模拟按键、WMPlayer播放媒体等典型场景给出可直接复制运行的代码片段并附有运行效果说明便于对照理解每条语句的作用与触发逻辑。压缩包内仅1个docx文件约192KB篇幅紧凑、示例集中适合作为脚本语法的速查与练手素材。目前已有11804人学习。需留意的是部分代码会触发强制关机或无限弹窗建议在虚拟机等隔离环境中试验把重点放在语法结构与思路拆解上。1. 一段两百行的 VBS 让半个办公区重启了三次整人脚本的边界在哪那年我在某公司做桌面支持一个同事把一份号称「VBS 整人代码大全」的脚本包丢进共享盘三天内半个办公区经历了三轮自动重启、光驱集体弹托、屏幕上排队弹「你是猪头吗」。最开始大家都当玩笑直到有台机器上出现了自复制到 U 盘根目录的那一段事情就不属于「整人」范畴了。这份资源本身是个大杂烩前一半是会弹窗、会关机、会模拟按键的恶作剧脚本后一半是作者自己都标了「太毒了请在虚拟机里跑」的自我复制程序。我把它当作一份样本集来读重点放在三件事这些脚本靠哪几个 COM 对象就能干坏事、怎么在一分钟内判断一份 VBS 是玩笑还是恶意、以及真中招之后从哪儿开始清。想拿来逗同事的、想把公司里 WSH 关掉的、想搞懂 VBScript 到底能伸多远的都能对得上。2. 整人脚本的四种玩法从弹窗到自复制能力是一层层加上去的拿到一批 VBS 样本我不会一上来就读代码细节而是先按「它伸到了哪一层」分类。伸到界面层的是弹窗和假提示伸到系统命令层的是 shutdown伸到输入设备层的是 SendKeys 和光驱伸到文件系统层的就是自复制和 Autorun。层数越高从「烦人」滑向「有害」的距离越短这条分界线我在后面几章会反复用到。2.1 弹窗死循环与假系统提示MsgBox 的参数把戏最基础的一段就是do套msgbox hi再loop。技术上没有任何门槛杀伤力全在「消息队列」上Windows 的对话框是模态的每弹一个就阻塞一层用户点掉一个立刻又来一个几十秒内桌面上就叠满了窗口。真正让人抓狂的是它没有WScript.SleepCPU 单核跑满任务管理器都得抢着点。更阴的是把 MsgBox 伪装成系统提示。原文里那段「您灌水太多需要重新启动计算机」的写法套路是三层伪装vbInformation给一个蓝色的信息图标vbOKCancel给一对「确定/取消」按钮标题栏留空或者写成「重新启动计算机」。用户看到图标和按钮布局下意识就信了。这里有两条 VBScript 的语法细节值得记住 语句式调用参数之间用逗号不需要括号 MsgBox 系统将立刻重起, vbOKCancel vbInformation, 重新启动计算机 想跳过按钮参数直接给标题中间必须留一个空位两个连续逗号 MsgBox 你上当了, , 提示 函数式调用才加括号因为要拿返回值判断 If MsgBox(你是猪头吗, vbYesNo, 提示) vbYes Then MsgBox 你 SB 啊! End IfvbOKCancel是 1、vbYesNo是 4、vbInformation是 64这些常量本质就是数字掐掉常量名直接写数字照样跑。判断返回值时vbYes等于 6、vbCancel等于 2而 VBScript 里True的数值是-1不是1这个反直觉的设定在后面那段自复制代码里被用得很彻底——它判断文件是否存在时写的是 -1。我见过不少人照抄脚本改路径把-1改成1结果整个判断逻辑反了脚本静默不干活查半天。2.2 shutdown 与 InputBox用系统命令做「惩罚」第二层是把WScript.Shell拉起来调系统命令。原文里出现频率最高的是这一句Set objShell CreateObject(Wscript.Shell) objShell.Run shutdown -s -t 5, 0, Trueshutdown的几个参数得说清楚-s关机、-r重启、-t 秒数设倒计时、-a中止倒计时、-c 注释在系统提示里带一句自定义文案上限 512 字符、-f强制关闭未保存的程序。Run的三个参数分别是命令行、窗口模式0 是隐藏、是否等待执行完True会阻塞脚本直到 shutdown 返回。写成objShell.Run shutdown -s -t 5, 0, True之后用户面前跳出来的是货真价实的系统级倒计时框不是脚本伪造的这一下心理压迫感完全不同。再往上叠一层 InputBox就有了「说不说」的门槛脚本先下shutdown -r -t 6挂个倒计时然后死循环弹输入框直到你输入指定的那句话才执行shutdown -a取消。原文里那个 InputBox 调用给了五个参数 prompt, title, default, xpos, ypos a InputBox(说我是猪,就不关机, 说不说, 不说, 8000, 7000)后两个是窗口坐标单位是 twips1 英寸 1440 twips。把坐标给到屏幕边界之外理论上能让用户找不到输入框——但不同 Windows 版本对 InputBox 的坐标处理并不一致很多情况下系统会把它钳回屏幕可见范围所以这招在实际环境里经常「翻车」用户看到的是一个正常弹出的小框。这种「按文档写没错、按系统实现就不灵」的地方是整人脚本里最常见的失真点。需要说清楚的是这类脚本利用的不是漏洞。普通用户本来就有本机关机权限shutdown本来就是给人用的被拿去做恶作剧只是滥用。所以指望「打补丁防住」不现实得从执行入口上管。2.3 SendKeys 与光驱弹出外设层面的骚扰第三层伸到了输入设备。ws.SendKeys {F5}放在死循环里效果取决于当前前台窗口是什么在浏览器里就是无限刷新在记事本里就是无限插入空行在资源管理器里就是无限刷新目录。SendKeys 有个硬限制——它只能发给当前活动窗口脚本没法指定目标所以原作者必须在你打开浏览器之后再运行它或者靠前面的弹窗把你引到某个窗口上。同一层的还有光驱。原文用CreateObject(WMPlayer.ocx)拿cdromcollection.item(0)然后死循环.eject()。这段代码放在 2005 年是很有效的托盘一进一出声音很烦人。放到今天大部分笔记本和台式机已经没有光驱了cdromcollection.count直接是 0脚本里on error resume next一包什么都不会发生。这也是我读这类老脚本时的一条经验先看它依赖的硬件还在不在很多「必杀技」已经自然失效了。同样的还有SAPI.SpVoice死循环朗读这个没失效但前提是系统装了语音组件而且声音一出来用户第一反应就是静音。2.4 自复制与 autorun.inf从整人到蠕虫的那一步原文末尾那段被作者标注「太毒了」的代码性质已经完全变了。它做了五件事我按动静从小到大排第一调FileSystemObject枚举所有盘符含可移动磁盘。第二把自身复制成目标盘根目录下的ftg.vbs并且用一个中间文件做跳板先写到c:\ftgfolder.bin再Copy过去避免直接写目标路径失败。第三写autorun.inf把shell\open\command指向wscript.exe ftgfolder.vbs这样插盘双击就执行。第四给生成的文件设置属性 7也就是只读(1) 隐藏(2) 系统(4)三者相加资源管理器默认不显示隐藏和系统文件用户根本看不到它。第五把用户自己盘里的文件搬到伪装成回收站的目录d:\recyc1ed\下——注意那个1不是l这是刻意的仿冒肉眼几乎分不出来。它还往HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Date写了个感染日期用来算「感染超过 12 周且月日相同」时触发额外的恶作剧。这个手法在恶意代码里叫日期触发用来躲避短期分析。另外原文里createobject(scripting.filesystemobject)这种把对象名拆成两段拼接的写法目的很直接——绕开基于完整字符串的特征扫描。这已经不是整人了我不会贴完整代码只把机制讲清楚因为这五步里任何一步在真实办公网里复现代价都不只是「同事被吓一跳」。3. 判断一份 VBS 是玩笑还是恶意四个静态特征就够下结论拿到一份来源不明的.vbs我不会直接双击。我的习惯是右键看大小和创建时间然后用文本编辑器打开先扫 COM 对象再扫命令关键字最后看它有没有隐藏属性和自复制逻辑。四步下来通常一分钟内能定性下面把判断依据拆开讲。3.1 危险对象清单四个 COM 对象决定了它的能力上限VBScript 本身是个很弱的语言没有网络库、没有内存操作它能干的所有坏事都必须借助外部 COM 对象。所以看它CreateObject了什么基本就锁定了能力范围对象 ProgID能做什么典型滥用我的判定WScript.ShellRun起进程、SendKeys模拟按键、RegRead/RegWrite读写注册表、SpecialFolders取路径调 shutdown、改启动项、模拟键盘出现即需细读几乎每份恶意样本都有Scripting.FileSystemObject遍历盘符、复制删除改名、读改文件属性、写文本文件自复制、写 autorun.inf、设隐藏属性配合盘符遍历 高危WMPlayer.ocx控制光驱弹出、播放媒体死循环弹托盘现在多半无害硬件没了SAPI.SpVoice文本转语音死循环朗读烦人但不破坏Shell.Application调系统外壳对话框、遍历文件夹伪装系统窗口少见出现要警惕判定的关键是组合而不是单个对象。WScript.Shell加MsgBox是整人WScript.Shell加shutdown是恶作剧WScript.Shell加FileSystemObject加盘符遍历就是传播行为不管作者怎么自称都得按恶意处理。3.2 关键字扫描一份能直接跑的排查脚本手工读只适合单文件。批量收上来的样本我会先跑一遍关键字扫描把可疑的挑出来精读。PowerShell 版本如下不需要装任何东西# 扫描指定目录下所有 .vbs/.vbe输出命中的危险关键字及行号 $pattern WScript\.Shell|Shell\.Application|FileSystemObject|WMPlayer\.ocx|SAPI\.SpVoice|SendKeys|shutdown|autorun\.inf|ntsd|CreateObject Get-ChildItem -Path D:\samples -Recurse -Include *.vbs,*.vbe -ErrorAction SilentlyContinue | Select-String -Pattern $pattern -AllMatches | ForEach-Object { [pscustomobject]{ File $_.Path Line $_.LineNumber Hit ($_.Matches.Value -join ,) } } | Sort-Object File, Line | Format-Table -AutoSize几个参数的作用-Include *.vbs,*.vbe把编码过的 VBE 也算进来VBE 是 VBS 的编码形式脚本宿主能直接执行-Recurse递归子目录因为这类脚本习惯把自己散在各个盘根目录-ErrorAction SilentlyContinue跳过无权限目录不然扫到系统保护目录会中断Select-String -AllMatches让同一行里的多个命中都能被记录而不是只报第一个。读结果时的优先级FileSystemObject和autorun.inf同时出现在一个文件里直接标红只有MsgBox和SendKeys的归到「低危、可留观」出现ntsd的要单独看——原文里那句ntsd -c q -pn winlogon.exe是历史上著名的崩溃手法原理是把调试器附加到登录进程再让它退出系统失去关键进程就会蓝屏。这条路子在当代 Windows 上基本走不通ntsd早已不在默认安装里而且附加到winlogon.exe需要管理员甚至更高权限。但它仍然值得被识别出来因为改个目标进程名就能换个玩法。3.3 属性 7 与对象名拆分为什么静态扫描会漏扫不到不代表干净这类脚本有三层常见的规避手段。第一层是文件属性。f.attributes 7里的 7 是 124只读、隐藏、系统三个位全开资源管理器默认不显示隐藏文件和受保护的系统文件用户在 U 盘里看不到任何异常。更狠的是把整个文件夹设为属性 7然后把用户文件搬进去外观和回收站一模一样。判断方法很简单命令行dir /a强制列出全部或者attrib直接看属性列。第二层是字符串拼接。scripting.file systemobject这种拆法对所有基于完整字符串的规则都是免疫的。对付它得先把字面量还原再做匹配写个小的 Python 预处理脚本就够import re, sys def flatten(path): 把 VBS 中 ab 形式的相邻字面量拼接成 ab最多迭代 10 轮 src open(path, encodingutf-8, errorsignore).read() pat re.compile(r([^\r\n]*)\s*\s*([^\r\n]*)) for _ in range(10): new pat.sub(lambda m: %s%s % (m.group(1), m.group(2)), src) if new src: # 没有变化说明拼完了 break src new return src if __name__ __main__: print(flatten(sys.argv[1]))局限得说清楚只处理两个双引号字面量用直接相连的情况碰上chr(34)拼引号、变量中转、或者Replace反转的写法就还原不了。所以在实践里我是「还原 扫描」两步一起上还原后的文本再喂给 3.2 的规则能捞回大部分低成本的混淆。第三层是On Error Resume Next。原文里好几段一开头就写这句作用是出错不报错继续往下跑。它本身不是混淆但它让脚本在出问题时完全静默你既看不到弹窗也看不到报错只能看到「什么都没发生」。排查时我的第一动作就是把这一行注释掉让错误暴露出来——很多所谓的「脚本不生效」真相就是某处拼写错了被它吞了。4. 隔离环境复现看清行为但别让行为跑出笼子分析整人脚本和恶意脚本光读代码不够。弹窗的节奏、文件落地的路径、注册表写了哪些键这些得跑一遍才准。但跑之前得先把笼子搭好不然一次「看看它到底干了啥」就能让你重装系统。这一章讲我固定的复现流程。4.1 环境准备快照、断网、独立账号一个都不能省我用的配置清单如下按重要性排序项目配置原因虚拟机全新安装打完全部补丁后再建快照出问题直接回滚比手工清理快十倍网络复现期间完全断网部分脚本会尝试下载后续载荷断网切断这条路径共享关闭共享文件夹、关闭剪贴板互通这两条是最常见的逃逸通道比脚本本身危险外设不直通真实 U 盘用虚拟磁盘镜像代替自复制段会往所有可移动盘写文件账号新建独立本地账号不给管理员高权限手法附加进程、改系统目录会因为权限不足直接失败快照装好工具、确认干净后打一个「基线」快照每次复现前回到基线保证结果可比外设那条特别值得说。原文末尾那段会枚举所有DriveType为 2可移动和 3本地磁盘的盘符并复制自身如果虚拟机直通了真实 U 盘代价就是你得去每台插过这个盘的机器上清理。用虚拟磁盘挂载销毁就是删个文件。4.2 用 cscript 和超时参数把行为框住默认双击是走wscript.exe图形界面出错弹框脚本会一直挂着你得手动结束。分析场景我一律换成cscript.exe命令行宿主加两个开关cscript //nologo //T:30 //B sample.vbs//nologo去掉启动时的版本横幅输出干净//T:30设脚本最长执行 30 秒到点宿主直接终止它这条对死循环脚本是救命的不然do ... loop能跑到你重启虚拟机//B是批处理模式禁止显示脚本错误和宿主自己的提示框。注意//B管不了脚本里自己写的MsgBox和InputBox那些是脚本主动弹的照样会弹。所以理想组合是//B加一个能自动应答对话框的小工具或者干脆接受它弹反正有//T兜底。跑的同时开进程和文件监控只看三个事件类型就够进程创建谁起了cmd.exe、shutdown.exe、wscript.exe自己、文件写入尤其是各盘根目录的.vbs和autorun.inf、注册表写入...\CurrentVersion\Run和...\Windows Script Host\Settings。这些监控工具的输出会很吵加个进程名过滤wscript.exe和cscript.exe噪音立刻降下来。4.3 复现之后怎么回滚快照优先手工清理兜底有快照就回滚这一步没什么可纠结的。不能回滚的场景比如在测试机上跑的按三处清理顺序别反先清启动项和计划任务这是让脚本「复活」的根源。原文里那段自复制是靠autorun.inf复活现代系统虽然默认不执行 U 盘 autorun但有些环境被改过策略所以还是得查。再清各盘根目录下的异常.vbs、.vbe、autorun.inf注意先改属性再删# 属性 7 只读隐藏系统先摘掉属性再删否则某些情况下删不掉 attrib.exe -s -h -r D:\ftg.vbs Remove-Item -LiteralPath D:\ftg.vbs -Force -ErrorAction SilentlyContinue最后查回收站伪装目录。像d:\recyc1ed\这种名字正常回收站是$Recycle.Bin出现在盘根目录、名字又像回收站的文件夹里面装的多半是被搬走的用户文件确认后原样搬回别直接删。5. 避坑与排查五条从翻车里换来的经验这一类脚本的坑不在技术上有多深而在「出了现象你往哪儿看」。下面五条是我实际踩过或者见别人踩过的按现象、原因、解决三段的格式写能直接对照用。5.1 双击后毫无反应先怀疑 WSH 被关掉而不是脚本坏了现象拿到一份样本双击.vbs一闪而过或者完全没动静任务管理器里看不到wscript.exe。原因这台机器上 Windows Script Host 被组策略或安全软件禁用了注册表里HKCU\Software\Microsoft\Windows Script Host\Settings\Enabled被设成 0。这种情况下双击会被直接拦截连报错都没有。另一个可能是.vbs的文件关联被改到了别的程序上。解决命令行跑wscript //?能出版本信息说明宿主正常跑cscript //nologo sample.vbs如果报「没有文件扩展名 .vbs 的脚本引擎」就是被禁了。确认被禁之后分析环境里临时把那个 Enabled 值改成 1跑完立刻改回 0——生产环境里这个值就该一直是 0。5.2 脚本逻辑明明对就是不执行On Error Resume Next吞了拼写错误现象照着样本改了个路径运行后什么也没发生怀疑是路径写错反复检查路径确实存在。原因脚本开头有On Error Resume Next后面只要有一处对象名或方法名拼错原文里就有createobjecet、ture这种拼法那一整行被静默跳过后面的逻辑有的跑有的不跑现象非常诡异。解决把On Error Resume Next注释掉重跑错误立刻显形。养成习惯调试期一律注释掉这行只在确认逻辑无误后再加回来。这条同样适用于你自己写脚本的时候——错误处理是上线前的事不是调试期的事。5.3 文件明明删了重启又回来属性 7 加多副本现象在 U 盘根目录删掉一个.vbs重插之后又出现了。原因两个可能叠加。一是删的时候没摘属性del静默失败你以为删了其实没有二是脚本在多个位置留了副本各盘根目录、伪装回收站目录只清了显眼的那一处剩下的副本在下次插入时又复制回来。解决先attrib -s -h -r摘属性再删然后用dir /a /s把整个盘的可疑扩展名列一遍逐个确认。清理顺序是先断掉复活链路启动项、autorun.inf再删副本反过来做等于白干。5.4 倒计时弹出来了shutdown -a却不生效现象屏幕上已经有系统关机倒计时赶紧开命令行敲shutdown -a提示「无法中止系统关机」。原因shutdown -a只能中止由shutdown命令发起、且还在倒计时中的关机。如果脚本用的是-t 0立即执行或者中间被其他程序接管就中止不了。另一种情况是权限不对普通用户中止不了别的会话发起的关机。解决第一时间在同一个用户会话里执行别去开新窗口绕。真来不及就让它关重点是保住没保存的文档——这也是我在分析机上永远不开自动保存的原因出问题时至少数据还在。事后从事件日志里查是谁调的shutdown.exe比争分夺秒抢那几秒有用。5.5 静态扫描全绿实际却有问题混淆和编码没覆盖到现象关键字扫描一条命中都没有但机器确实出现了异常文件。原因脚本用了字符串拼接拆对象名、用chr()拼字符、或者干脆存成了 VBE 编码格式纯文本规则扫不到。解决先跑 3.3 的还原脚本再扫一遍.vbe文件用宿主自带的解码能力处理后再看实在解不开就在隔离环境里跑靠行为监控反推它做了什么。静态扫描负责筛动态行为负责定性两条腿缺一条都容易漏。6. 收口把入口关掉比研究它怎么弹窗更值如果只让我给一条建议那就是别在「怎么防住某个具体脚本」上花时间直接管住执行入口。VBS 这类脚本的破坏力全部来自宿主宿主一关写得再花也跑不起来。具体做法我固定走三步。第一步全公司范围禁用 Windows Script Host注册表两个位置一起设HKLM管全局、HKCU管当前用户值名都是Enabled值为 0。组策略里对应的是「关闭 Windows 脚本宿主」这一项域环境推策略非域环境写注册表脚本随镜像下发。第二步关掉所有驱动器的自动运行NoDriveTypeAutoRun设成 0xFF 覆盖全部类型别只关 U 盘——原文里那种往本地盘根目录写autorun.inf的手法只关 U 盘是拦不住的。第三步把日常账号从管理员组里摘出来。这一条对原文里那句ntsd -c q -pn winlogon.exe特别有效权限不够时它连附加都附加不上蓝屏那一步自然没了。三步做完再回头看那份「VBS 整人代码大全」它就从「威胁」变成了「教材」弹窗那段可以拿来讲模态对话框和消息队列shutdown 那段可以拿来讲系统命令的参数设计自复制那段可以拿来讲属性位和自动运行机制。同一份东西放在生产环境是事故放在隔离环境是案例区别只在于你有没有提前把笼子搭好。我把这批脚本按危险等级重新分了档恶作剧级的、骚扰级的、带传播行为的各放一处每档配了对应的检测规则和清理步骤需要的话自取但有一条我要求得很死先在虚拟机快照之后打开别在自己主力机上试第一下。从那以后我每次拿到来源不明的脚本都强制走一遍「读对象 → 扫关键字 → 断网快照 → 带超时跑」这套流程哪怕它只有三行MsgBox。血泪经验换来的规矩省一步都可能要用一晚上重装来还。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑