VBS整人脚本安全改造指南:从弹窗轰炸到自动化工具
简介VBS整人代码大全是一份面向VBS脚本初学者和Windows系统管理爱好者的示例合集主要解决如何通过脚本调用系统接口实现自动化交互的问题内容围绕恶搞场景展开集中整理了消息框循环、伪造系统警告、触发定时关机、模拟键盘按键、媒体弹窗等经典脚本片段同时也展示了按钮错位、输入验证等对话框设计思路。整个资源包为单个docx文档共1个文件大小约192KB结构简洁、便于收藏和按需查阅目前已有11802人学习下载在脚本爱好者中有较高热度。文档内每段脚本均可独立复制运行涉及MsgBox、InputBox、WScript.Shell对象、Do...Loop循环、SendKeys方法、WMPlayer控件等VBS核心知识点适合在虚拟机或安全环境中逐段拆解和演练。其中部分代码具有较强破坏性作者特别给出警告提醒不要直接运行避免造成电脑崩溃或数据损失通过阅读既可理解Windows脚本与操作系统交互的机制也能提高对恶意脚本的识别和防范能力。1. VBS整人代码大全它火了这么久到底在玩什么VBS整人代码大全这个检索词在资源和脚本社区里算得上经久不衰。搜它的人通常有两类一类是刚接触 Windows 脚本的新手刷到那种“双击后弹窗一个接一个”的恶搞视频想自己复现一把另一类是运维和办公自动化爱好者看中的其实是弹窗、按键模拟、计划任务这些能力想把它们改造成提醒工具或自动化脚本。我的立场很明确整活可以复现但每一行代码都要能停、能删、能还原。这篇笔记把流传最广的几类整人脚本拆成机制重写成不碰文件、不写注册表、不触发危险操作的安全版本同时把参数、边界和坑都讲清楚。适合真正想动手的人新手能跟着跑通熟手能直接拿走改造成正经工具。至于那些会删文件、强制关机、写启动项的“狠活”你看完会明白为什么不该照搬。2. 整人脚本背后的对象模型WScript.Shell 为什么是万能钥匙整人脚本看起来花样百出弹窗刷屏、键盘乱跳、桌面突然堆满程序背后其实只有几个对象在反复组合。我一般会把流传的脚本先映射到三件事弹窗用的是 MsgBox 或 Shell 对象的 Popup模拟键盘输入用的是 SendKeys启动一堆程序用的是 Run。这三个方法全部挂在 WScript.Shell 这个核心对象上所以看懂它就等于拿到整人脚本的钥匙。2.1 弹窗、按键模拟、启动程序三个高频接口的对应关系VBS 里一切从创建对象开始常见写法是Set ws CreateObject(WScript.Shell)有了 ws 这个句柄后续所有弹窗、按键、启动程序都走它。三个方法对应三种能力它们的参数细节决定了脚本的行为边界我平时排错也主要看这几个实参。方法作用关键参数Popup弹出一个模态消息框文本、显示秒数、标题、图标类型SendKeys向当前焦点窗口发送按键字符串特殊键用花括号包裹Run启动外部程序或文档程序路径、窗口状态、是否等待退出Popup 和 MsgBox 最大的区别是 Popup 有超时参数超过多少秒自动关闭MsgBox 则是死等用户点按钮。整人脚本里那种无限堆叠的弹窗大多是用 MsgBox 放在死循环里实现的这个行为在第 5 章展开讲。Run 的第三个参数也容易踩坑False 表示不等待程序退出True 表示脚本要等被调用的程序关闭后才执行下一行很多脚本卡住都是这个参数设错了。2.2 不止 Shell文件对象、正则与注册表是“狠活”的来源抛开 WScript.Shell整人脚本里还有三个高频出现的对象Scripting.FileSystemObject 负责文件读写VBScript.RegExp 做文本匹配WScript.Shell 自带的 RegWrite / RegRead 操作注册表。单独看它们都是正常工具组合起来就变成了“删文件 写启动项”的自启动破坏链。拿到一个陌生脚本时我会先做两个动作搜索 RegWrite 和 DeleteFile再搜索 Run 后面跟的路径。如果在 Run 里看到 cmd.exe 或 powershell.exe并且窗口状态参数是 0隐藏窗口基本可以断定这个脚本不怀好意。FileSystemObject 最常见的两个方法是 GetFile 和 DeleteFile整人代码里通常用来清空桌面或者删除指定文件。正则对象在整人脚本里出现频率不高更多出现在日志处理工具里但在脚本大全类的代码里遇到它时通常是用来匹配文件名做批量操作。注册表相关的操作才是大头RegWrite 往 Run 键写一条启动项配合开机延迟触发就实现了“每次开机弹一次”的效果。这种行为本身不复杂但可逆性很差普通用户根本不知道去哪删。2.3 看懂机制再动手给脚本上三保险我从不在拿到陌生 .vbs 文件后直接双击运行这是玩脚本的第一原则。会把落地的脚本加上三条保险可终止、可还原、可调试。可终止意味着循环必须带次数上限或者至少留下 CtrlBreak 的退出机会可还原意味着不写注册表、不删文件实在要改必须先备份可调试意味着用 cscript 而不是 wscript 跑这样报错会带行号。这里要说明 wscript.exe 和 cscript.exe 的区别。wscript 是 Windows 默认的脚本宿主双击 .vbs 文件走的就是它界面友好但没有控制台输出WScript.Echo 弹的是消息框。cscript 是命令行宿主运行后在控制台里输出内容出错时能直接看到第几行有问题。我调试任何 VBS 都用这个命令cscript C:\tools\test.vbs如果脚本报语法错误cscript 会指出具体行号和错误码wscript 很多时候只弹一个笼统的“找不到脚本引擎”或者直接没反应。很多整人脚本传出去之后被人抱怨“双击没用”其实就是宿主或编码的问题不是脚本逻辑的问题。给脚本上保险本质上是给自己留退路毕竟谁都不想在同事电脑上弹窗弹到自己格式化重装。3. 动手写三个能跑的趣味脚本循环弹窗、打字机与多窗口启动这一章直接给代码三个脚本全部可复现、可逆、不破坏系统。它们对应三种最常见的效果弹窗轰炸、键盘打字、桌面开闸。每个脚本后面我会把参数讲透顺便指出网上流传版本里哪些改法会翻车。3.1 循环弹窗带自停条件的消息框循环弹窗循环是整人代码的经典款网上流传的版本大多长这样一个 Do While True 的死循环里塞 MsgBox双击之后弹窗一个接一个对方只能按到天荒地老。我不写这个版本因为无限弹窗本质是拒绝服务杀软行为检测大概率直接拦截而且对方的机器会被卡到没法操作。我一般演示的是带次数上限的版本 弹窗循环总共弹 5 次每次显示约 1 秒后自动关闭 Set ws CreateObject(WScript.Shell) Dim count count 0 Do While count 5 ws.Popup 你被弹窗盯上了, 1, 演示, 64 count count 1 WScript.Sleep 500 LoopPopup 的第二个参数是显示秒数这里填 1表示弹窗 1 秒后自动关闭不会阻塞脚本执行。把第二个参数改成 0 或者省略弹窗就会一直等用户点按钮循环体就卡住了。第三个参数是窗口标题第四个参数 64 是信息图标想换成感叹号就填 48错误图标是 16问号是 32。这个脚本最危险的改法是有人把count 5直接改成True去掉计数器于是变成死循环。杀毒软件对这类行为的判定非常准WScript.Sleep 的间隔越短被拦的越快。想体验整活效果5 次已经是极限再把 WScript.Sleep 500 改成 100弹窗会像连珠炮一样但依然可控。记住一个原则任何循环都必须有一条肉眼可见的退出路径。3.2 打字机效果Sleep 与 SendKeys 配合第二种常见效果是“打字机”打开记事本模拟键盘逐字输入一句整活文案。网上流传版本的问题在于 SendKeys 发送太快有时字符会乱序有时直接发到别的窗口。我一般会加启动等待和字符间隔 打字机效果打开记事本逐字输入一句话 Set ws CreateObject(WScript.Shell) ws.Run notepad.exe, 1, False WScript.Sleep 1000 str 该起来喝水了 For i 1 To Len(str) ws.SendKeys Mid(str, i, 1) WScript.Sleep 200 Next ws.SendKeys {ENTER}第一行 Run 启动记事本第三个参数 False 表示不等待退出立即执行下一行。紧接着 WScript.Sleep 1000 是关键等待给记事本留出打开时间。如果省掉这 1 秒SendKeys 很可能把字符发到当前激活的浏览器或编辑器里这是 90% 的翻车原因。SendKeys 发送特殊键时用花括号包裹比如{ENTER}是回车{ESC}是取消^{A}是全选%{F4}是关闭当前窗口。字符之间的 WScript.Sleep 200 表示每个字间隔 200 毫秒这个速度刚好有“打字感”。太快会丢字符太慢显得拖沓这是我在多台机器上试出来的经验值。输入完再发一个回车相当于整段话被“打”进了文档里观感上就是一段自动生成的文字。3.3 多窗口启动一次开三个程序的“桌面袭击”第三种效果是无害但存在感极强的“桌面开闸”一次启动多个程序让对方桌面瞬间堆满窗口。实现成本极低一句 Run 加一个程序路径就行 桌面袭击依次打开记事本、画图、计算器 Set ws CreateObject(WScript.Shell) ws.Run notepad.exe, 1, False WScript.Sleep 800 ws.Run mspaint.exe, 1, False WScript.Sleep 800 ws.Run calc.exe, 1, FalseRun 的第二个参数是窗口状态1 表示正常窗口3 是最大化7 是最小化0 是隐藏。整人脚本喜欢用 0 隐藏执行特别是配合 cmd 的时候这也是最容易被杀软盯上的写法。第三个参数 False 表示不等待程序退出所以脚本运行完三个程序都在桌面上等你处理。想让效果更“失控”可以把程序列表加长加游戏目录里的启动器、浏览器、音乐播放器每个间隔 500 到 800 毫秒就够。需要注意程序名简写依赖系统 PATHnotepad.exe、mspaint.exe、calc.exe 这些系统自带工具没问题换成第三方程序就建议写完整路径路径含空格时用双引号包住像这样ws.Run C:\Program Files\Mozilla Firefox\firefox.exe, 1, FalseVBS 里表示字符串内部引号用两个双引号连写这是新手最容易写错的地方路径带空格时直接报错。3.4 参数变体从弹窗文字到触发时间都能改把三个脚本改成自己能用的版本只需要动几个固定参数。下面这个表列出常用修改点照着改就行脚本修改位置可选值参考循环弹窗count 5里的数字次数上限建议不超过 20循环弹窗Popup 第二个参数0 是等用户关大于 0 是自动关闭打字机WScript.Sleep 200150~300 之间比较稳打字机str ...换文案即可多窗口启动ws.Run xxx换成目标程序路径注意引号除了这些我常加一个时间判断把弹窗变成“只在工作日上午弹一次”的提醒配合着整活脚本的壳做正经事If Hour(Now) 9 And Weekday(Now) 2 And Weekday(Now) 6 Then ws.Popup 早间工作清单已生成开工前先看一眼, 10, 提醒, 64 End IfHour(Now) 取当前小时Weekday(Now) 返回星期几2 到 6 对应周一到周五。这段代码单独跑没有意义但塞进前面任何一个脚本里就成了“定时触发”的雏形。整活脚本和效率工具的距离往往只差一个 If 判断。4. 把整活脚本改造成正经工具提醒弹窗、计划任务与启动项自检整活脚本里最有复用价值的三个点分别是弹窗、定时触发和自启动排查。弹窗能改成提醒定时触发能交给计划任务而“脚本会把自己写进启动项”这个特性反过来用就是安全自检。这一章把它们逐个工程化。4.1 用 Popup 做不阻塞的弹窗提醒MsgBox 的问题在于它会死等用户操作脚本卡在那里不动。Popup 的第二个参数正好解决这个问题超过指定秒数自动消失。做提醒工具时我一般会组合超时判断和返回值 喝水提醒弹窗 10 秒后自动关闭没看到再补一次 Set ws CreateObject(WScript.Shell) result ws.Popup(该喝水了起来活动两分钟, 10, 提醒, 64) If result -1 Then ws.Popup 刚才没看到吧再提醒一次, 5, 提醒, 48 End IfPopup 的返回值有明确含义点击确定返回 1点击取消返回 2超时自动关闭返回 -1。上面这段代码先给用户 10 秒时间如果超时说明人不在电脑前再补一个 5 秒的弹窗加深提醒强度用 48 感叹号图标引起注意。这个模式比 MsgBox 强在三点不阻塞脚本后续逻辑、能拿到用户是否真正看到的反馈、弹窗数量可控。把它放在循环里配合计数器就是一个完整的“每四十分钟站起来一次”的久坐提醒。图标参数之前提过64 是信息图标48 是警告图标16 是错误图标32 是问号图标实际使用时信息图标加一句正常文案就够了。4.2 计划任务挂载与卸载让脚本定时跑写好的提醒脚本不能靠 VBS 自己死循环守夜电脑睡眠、重启、进程被杀都会让循环失效。正确做法是把调度交给 Windows 计划任务脚本只做一件事到点弹窗。先把脚本存成固定路径比如 C:\tools\remind.vbs然后注册一个每小时执行一次的任务schtasks /create /tn drink_reminder /tr wscript.exe C:\tools\remind.vbs /sc hourly /mo 1 /f创建完先查询确认任务存在再验证触发配置schtasks /query /tn drink_reminder用不到的时候卸载也别忘删除任务本身不删脚本文件两个动作分开schtasks /delete /tn drink_reminder /f参数说明/tn 是任务名/tr 是要执行的命令/sc 是触发类型hourly 表示每小时/mo 1 表示间隔 1 小时/f 是强制覆盖已存在的同名任务。想换成每天固定时间触发用/sc daily /st 09:00想登录时触发用/sc onlogon。一个容易忽略的细节/tr 参数里如果脚本路径含空格整个命令字符串要加引号写成这样schtasks /create /tn drink_reminder /tr \wscript.exe C:\tools\my remind.vbs\ /sc hourly /mo 1 /f嵌套引号很容易错我一般直接把脚本路径里的空格去掉省得每次创建任务都要折腾转义。4.3 启动项文件夹自检只读检查不留痕整活脚本里最狠的一类会把自己写进注册表 Run 键或者启动文件夹。反过来利用这个特征写一个只读的启动项自检脚本列清楚当前用户和公共启动文件夹里都放了什么很多“开机老弹窗”的毛病一眼就能定位 启动项自检只读列出两个启动文件夹里的内容不修改任何设置 Set ws CreateObject(WScript.Shell) Set fso CreateObject(Scripting.FileSystemObject) userStartup ws.ExpandEnvironmentStrings(%APPDATA%) \Microsoft\Windows\Start Menu\Programs\StartUp commonStartup C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp WScript.Echo 当前用户启动文件夹 If fso.FolderExists(userStartup) Then For Each f In fso.GetFolder(userStartup).Files WScript.Echo f.Name Next Else WScript.Echo 不存在 End If WScript.Echo 公共启动文件夹 If fso.FolderExists(commonStartup) Then For Each f In fso.GetFolder(commonStartup).Files WScript.Echo f.Name Next Else WScript.Echo 不存在 End If脚本用了 ExpandEnvironmentStrings 展开 %APPDATA%避免硬编码用户名。WScript.Echo 的输出方式取决于宿主用 cscript 运行会输出到命令行窗口用 wscript 运行会变成消息框。所以这个脚本请用 cscript 跑cscript C:\tools\check_startup.vbs看到不认识的 .vbs、.bat、.exe 文件时先看文件创建时间和路径再决定是否处理不要凭文件名就直接删除。注册表 Run 键的检查原理相同但 WScript.Shell 的 RegRead 只能读已知值名枚举全部值名需要 WMI 的 StdRegProv日常排查启动文件夹加任务管理器里的启动项面板已经够用。5. VBS 脚本避坑指南弹窗停不下来、乱码、被杀软隔离玩脚本这件事理论讲得再多都不如踩几个坑记得牢。这一章写五条我见过最多的问题按“现象 → 原因 → 解决”的顺序来全部来自实际排障适合对照自查。5.1 中文乱码保存编码到底选 ANSI 还是 UTF-8现象脚本里的中文弹窗文字变成一堆乱码或者脚本直接报“语法错误”。原因VBS 默认按 ANSI 编码读取脚本文件而 Windows 10 新版记事本的默认保存编码是 UTF-8两边对不上。解决写完后在记事本里“另存为”编码下拉框选 ANSI再覆盖保存。如果坚持用 UTF-8必须在文件头部加 BOM 标记否则中文注释和字符串会一起乱掉。我的习惯是统一 ANSI省心。这个坑对第 3 章的打字机脚本尤其致命中文文案一旦乱码SendKeys 发出去的字符连自己都不认识。5.2 弹窗循环停不下来CtrlBreak 失效后的正确终止姿势现象双击脚本后弹窗连环出现按 CtrlBreak 没反应任务管理器里也找不到明显的“脚本进程”在跑。原因VBS 的宿主进程是 wscript.exe任务管理器里显示名是“Windows 基于脚本的宿主”注意别和 Windows Explorer 混了。CtrlBreak 能否中断脚本取决于当前阻塞点WScript.Sleep 和 MsgBox 等待时有时候确实不响应。解决任务管理器 → 详细信息 → 按名称找 wscript.exe → 右键结束任务。多个 wscript 进程不好分辨时用命令行一把清掉taskkill /f /im wscript.exe这个命令会把所有 VBS 宿主进程全部结束适用于脚本失控的场景。我的习惯是脚本里绝不写没有次数上限的循环遇到要演示的弹窗循环额外加一个“运行超过 30 秒自动退出”的守卫条件。5.3 脚本被杀软隔离是误报还是行为太像恶意软件现象保存好的 .vbs 文件被实时防护直接删除或者双击后 Windows 提示“操作已被阻止”。原因杀软的行为检测不是只看文件名而是看脚本内容特征。无限弹窗、隐藏运行、修改注册表启动项、调用 cmd 这些行为单独出现一个可能没事组合在一起报毒概率基本是百分之百。解决先区分是误报还是真可疑。检查脚本里有没有 RegWrite、DeleteFile、Run cmd.exe 这类高危调用如果没有把脚本加入信任区重新下载。注意我从不建议关掉实时防护去跑陌生脚本更不建议在网上到处下载“.vbs 整人大全”直接双击。很多所谓整人代码本身就是恶意程序套壳杀软拦下来是为了你好。5.4 SendKeys 焦点丢失字打到别的窗口去了现象脚本想往记事本打字结果字串跑到了浏览器搜索框或者刚才打开的文件资源管理器里。原因SendKeys 不指定目标窗口它只把按键发给“当前拥有键盘焦点的窗口”。解决编程时先激活目标窗口再发送按键WScript.Shell 提供了 AppActivate 方法ws.Run notepad.exe, 1, False WScript.Sleep 1000 ws.AppActivate 记事本 WScript.Sleep 500 ws.SendKeys 该起来喝水了AppActivate 参数可以是窗口标题也可以是进程 ID。这里传“记事本”是因为 Windows 中文版记事本的窗口标题就叫“记事本”未保存文档时会变成“无标题 - 记事本”标题越大匹配越精准。激活后加 500 毫秒等待给窗口焦点切换留出时间再发按键才稳。这个坑我踩过很多次最终养成的习惯是SendKeys 之前必激活激活之后必等待。5.5 权限与执行策略双击报错先分清三种情况现象双击脚本后弹窗提示“没有权限”或“操作被阻止”也有可能闪一下命令提示符就没反应。原因分三种第一种脚本放在 Program Files 这类受写保护的目录脚本尝试写临时文件时没有权限第二种系统组策略禁用了 Windows 脚本宿主第三种杀软或安全软件把 .vbs 关联拦截了。解决先把脚本复制到纯用户目录比如 C:\tools 或桌面排除目录权限问题再检查脚本宿主是否被禁用运行reg query HKLM\SOFTWARE\Microsoft\Windows Script Host\Settings /v Enabled看返回值最后用 cscript 在命令行里跑一次看具体报错码而不是依赖 wscript 那种笼统的弹窗提示。区分这三种情况能省下大量“双击没反应”的排查时间。6. 进阶玩法给脚本套 HTA 壳加运行次数上限到这一步你已经能写能改能排错了。最后给三个进阶技巧把脚本包成带界面的 HTA 小工具给脚本加上运行次数上限以及给每个关键动作留日志。这三个技巧能把“随手写的脚本”升级成“能给别人用的工具”。6.1 用 HTA 把 VBS 包成带界面的小工具HTA 是一个 HTML 文件扩展名改成 .hta 后可以用 VBScript 直接响应按钮事件。它比纯 .vbs 多一个窗口框架能放按钮、文本框、下拉框适合把弹窗提醒做成看得见的工具html head title提醒小工具/title script languageVBScript Sub btn_OK_Click CreateObject(WScript.Shell).Popup 这是来自 HTA 的提醒, 5, 提醒, 64 End Sub /script /head body button onclickbtn_OK_Click点我看看/button /body /html保存为 .hta 后双击运行HTA 由系统的 mshta 宿主承载界面比 wscript 的弹窗友好得多。需要注意的是HTA 有比较高的本机操作权限陌生来源的 .hta 文件不要轻易打开这是和新手强调安全时一定要带上一句的。6.2 运行次数上限用计数文件避免“一发不可收拾”整活脚本要给同事玩的时候最怕对方是个较真的人双击一次不够狂点十几次。解决办法是加一个计数文件超过设定次数后脚本自动退出 运行次数上限超过 3 次自动退出 Set fso CreateObject(Scripting.FileSystemObject) counterFile fso.GetSpecialFolder(2) \demo_count.txt count 0 If fso.FileExists(counterFile) Then count CInt(fso.OpenTextFile(counterFile).ReadLine) End If If count 3 Then WScript.Quit End If count count 1 Set f fso.CreateTextFile(counterFile, True) f.WriteLine count f.Close计数文件放在临时文件夹里用 GetSpecialFolder(2) 获取路径不写死用户名任何机器上都能跑。这个“运行次数上限”的思路通用性很强配合计划任务可以做成“每天最多提醒三次”的限流工具。6.3 日志两行出事有后悔药 日志记录每次弹窗前留一条记录 Set fso CreateObject(Scripting.FileSystemObject) logFile fso.GetSpecialFolder(2) \vbs_demo_log.txt Set f fso.OpenTextFile(logFile, 8, True) f.WriteLine Now 弹窗已触发 f.Close日志文件用追加模式打开参数 8 表示追加写入而不是覆盖。Now 会把当前时间写进去配合脚本行为就能追踪到底发生了什么。真出了问题回看日志是唯一靠谱的排查路径。这算是我玩脚本最大的教训以前接过一个演示需求写了个循环弹窗没加次数上限结果脚本弹到自己桌面上最后只能强制结束进程重写。从那以后所有带循环的脚本必有计数器所有会改变系统的操作必留日志。代码可以写得随意但收尾要干净这样才敢把脚本发给别人用。希望帮到你。本文还有配套的精品资源点击获取