从VBS整人代码看wscript.exe能力边界与防护 简介这是一份以VBS整人脚本为主题的docx文档面向想了解VBS基础语法、弹窗交互与系统命令调用的初学者也可作为识别恶作剧脚本风险的参考材料。包内仅含1个docx文件压缩包约192KB轻量易读内容围绕MsgBox消息框、InputBox输入判断、Do...Loop无限循环、WScript.Shell执行shutdown命令、SendKeys模拟按键及WMPlayer媒体播放等典型写法展开并附有大量代码片段与运行效果说明。已有11804人学习下载说明其在VBS入门与趣味脚本认知方面具有一定关注度。读者可从中理解VBS如何通过条件判断组织交互流程、如何调用系统对象完成自动化操作同时也能直观看到强制关机、循环弹窗等代码可能造成的干扰进而建立虚拟机测试、谨慎运行和尊重他人电脑使用权的安全意识。文档侧重代码示例与现象演示适合作为VBS语法速览和风险案例阅读不宜直接用于恶作剧。1. 从一份VBS整人代码大全说起它其实是一张能力清单有人把这份合集塞进U盘插进电脑后双击一个伪装成新建文件夹的图标屏幕上开始无限弹窗标题写着系统提示按钮只有重试和取消点哪个都关不掉——这就是VBS整人代码最典型的入口。这类合集能流行起来靠的不是技术门槛而是Windows自带脚本宿主wscript.exe几乎无法被卸载双击就能跑杀毒软件也常常放过纯文本脚本。适合看这份东西的人有三类想搞清Windows脚本到底能碰哪些系统能力的开发、需要给团队做安全意识演练的运维以及被弹窗整过之后想弄明白为什么它能自动关机的人。后面的内容不教你复刻只拆能力边界和防护链路。2. 能力底座拆解四个COM对象撑起了全部整人花样合集里几十段代码翻来覆去用的就是四个东西WScript.Shell、MsgBox/InputBox、Scripting.FileSystemObject、WMPlayer.ocx。把这四个对象的公开方法吃透你既能读懂每一段整人脚本干了什么也能判断哪些是看着吓人但无害哪些是跑一次就得重装系统。这一章按对象拆。每节我都会给一段能安全运行的代码把危险方法用只读只演示不执行的方式呈现——想验证效果在虚拟机里跑别在办公机上试。2.1 WScript.ShellRun、SendKeys、Popup 三个方法被玩坏的地方CreateObject(WScript.Shell)是整份合集出现频率最高的一行。它本质是COM自动化接口暴露的是命令行执行、按键模拟、弹窗这三类能力。合集里所有关机重启打开资源管理器的代码都是通过它的Run方法把命令递给cmd.exe或者shutdown.exe。Run的签名是Run(strCommand, [intWindowStyle], [bWaitOnReturn])三个参数各有讲究 demo_run.vbs —— 演示 WScript.Shell.Run 的三个参数 Option Explicit Dim sh, rc Set sh CreateObject(WScript.Shell) 参数1 命令行可以带参数注意路径含空格要自己加引号 参数2 窗口样式0隐藏 1正常 3最大化 6最小化 参数3 是否等待True 会阻塞到子进程退出False 立刻返回 rc sh.Run(notepad.exe, 1, True) bWaitOnReturnTrue 时rc 才是子进程的真实退出码False 时恒为 0 WScript.Echo notepad 已退出返回码 rc理解第三个参数是读懂整人脚本的关键。合集里那些ws.run cmd /c start /min ntsd -c q -pn winlogon.exe 1nul 2nul, vbhide写法第二个参数传的是0隐藏窗口第三个参数不传等于False所以脚本发完命令立刻往下走用户根本看不到黑框闪过。start /min再套一层是为了让子进程脱离父进程的窗口归属脚本被杀掉也不影响已经发起的命令。SendKeys是另一种玩法把按键序列直接灌进当前活动窗口 演示向记事本连续发送按键 Dim sh Set sh CreateObject(WScript.Shell) sh.Run notepad.exe, 1, False WScript.Sleep 800 等窗口起来这一步不能省 sh.AppActivate 无标题 - 记事本 先激活目标窗口否则按键会打到别处 sh.SendKeys hello sh.SendKeys {ENTER} sh.SendKeys ^s ^ 代表 Ctrl组合键这样写合集里ws.sendkeys {f5}放在死循环里就是让活动窗口不断收到刷新键——如果前台正好是浏览器页面会一直刷。这类代码的危害不在于破坏数据而在于抢占用户输入焦点用户想点关闭都点不中。真要靠SendKeys做自动化必须先AppActivate中间加Sleep缓冲这是血泪经验不加就是玄学时灵时不灵。Popup和MsgBox长得像区别在于Popup支持超时自动关闭不需要用户点按钮Dim sh, ret Set sh CreateObject(WScript.Shell) Popup(正文, 超时秒数, 标题, 图标常量) 超时自动消失返回 -1用户点按钮则返回按钮值1确定 2取消 6是 7否 ret sh.Popup(这条消息 5 秒后自动关闭, 5, 提示, 64) WScript.Echo 返回值 ret整人脚本偏爱Popup是因为它可以做成不点也关不掉的效果——传0秒就是无限等待再套一层Do...Loop弹窗关一个来一个。判断一段脚本是不是在玩这套看有没有Do里嵌Popup或MsgBox就知道了。2.2 MsgBox 与 InputBox一张按钮常量表解释了假系统提示为什么骗人合集里最容易得手的一段是把MsgBox的图标设成vbInformation蓝色 i 图标标题写成系统提示或重新启动计算机正文模仿系统措辞。用户看到熟悉的蓝色图标和系统腔调下意识就信了。按钮和图标都是数字常量MsgBox(prompt, buttons, title)的第二个参数是按钮类型和图标类型相加常量值效果vbOKOnly0只有一个确定vbOKCancel1确定 / 取消vbAbortRetryIgnore2中止 / 重试 / 忽略vbYesNoCancel3是 / 否 / 取消vbYesNo4是 / 否vbRetryCancel5重试 / 取消vbCritical16红色叉号图标vbQuestion32问号图标vbExclamation48黄色感叹号vbInformation64蓝色 i 图标相加的写法很常见vbOKCancel vbInformation就是 65得到确定/取消 蓝色 i的组合跟真正的系统确认框视觉上几乎一致。返回值同样是数字vbOK1、vbCancel2、vbAbort3、vbRetry4、vbIgnore5、vbYes6、vbNo7。 演示按钮分支 返回值判断 Dim ret ret MsgBox(是否继续执行后续步骤, vbYesNoCancel vbQuestion, 确认) Select Case ret Case vbYes WScript.Echo 用户选择是 Case vbNo WScript.Echo 用户选择否 Case vbCancel WScript.Echo 用户选择取消直接退出 WScript.Quit End Select合集里If MsgBox(...) vbCancel Then这种写法就是拿返回值做分支用户点了取消脚本反而进入你上当了分支去执行关机。看懂这张表你就明白这类弹窗没有任何系统权限它只是脚本画出来的一个窗口标题、图标、按钮全由脚本作者随手指定。InputBox更狠签名是InputBox(prompt, title, default, xpos, ypos)可以指定输入框在屏幕上的坐标。把xpos、ypos设成8000、7000这种超出屏幕范围的值输入框就跑到可视区域外面去了——用户看不见脚本却卡在等待输入的状态。合集里那段要求输入 abc 否则关机的代码就用了这个技巧用户找不到输入框只能干等。提示判断一个对话框是不是系统弹的看它有没有对应的进程。真正的系统关机提示由shutdown.exe或winlogon.exe发起任务管理器里能看到MsgBox画的窗口挂在wscript.exe下面结束这个进程窗口立刻消失。2.3 FileSystemObject 与 WMPlayer.ocx文件遍历和硬件控制是怎么接进来的前两个对象负责骚扰第三个对象Scripting.FileSystemObject负责扩散。合集里那段最长的自复制代码核心逻辑就是拿 FSO 枚举出所有可用驱动器判断哪些是新插入的然后往新盘里写脚本副本、写autorun.inf、把文件属性改成隐藏加系统。FSO 枚举驱动器的写法本身没有任何问题问题是拿来干什么 只读演示列出所有驱动器不做任何写操作 Option Explicit Dim fso, d Set fso CreateObject(Scripting.FileSystemObject) For Each d In fso.Drives If d.IsReady Then DriveType: 0未知 1可移动 2本地固定 3网络 4光驱 5内存盘 WScript.Echo d.DriveLetter : 类型 d.DriveType _ 可用空间 FormatNumber(d.FreeSpace / 1048576, 0) MB End If Next文件属性是一个位运算字段1只读、2隐藏、4系统叠加起来7就是只读 隐藏 系统。整人脚本把自身副本的属性设成 7用户在资源管理器里开着显示隐藏文件也未必看得见因为还有个隐藏受保护的操作系统文件开关默认是勾上的。 演示用 Or 追加属性位而不是直接赋值覆盖 Dim fso, f Set fso CreateObject(Scripting.FileSystemObject) If fso.FileExists(C:\Temp\demo.txt) Then Set f fso.GetFile(C:\Temp\demo.txt) f.Attributes f.Attributes Or 2 追加隐藏位 想还原f.Attributes f.Attributes And (Not 2) End If合集里直接写f.attributes 7会覆盖掉原有属性比如把一个本来就是只读的配置文件变成系统文件这是常见的改完就回不去的翻车点。正规做法是先用Or加位还原时用And Not减位别直接赋常量。WMPlayer.ocx是比较冷门的一个入口CreateObject(WMPlayer.ocx)拿到的对象里有cdromcollection调用.item(0).eject()就是弹出第一个光驱托盘。合集里把它放进死循环光驱托架就会反复进出。这不是软件层面的操作是实打实地驱动硬件机械结构次数多了托架齿轮会磨损——很多人以为整人脚本最多弹个窗其实它已经能让硬件受伤。 仅演示调用链别放循环里跑 Dim wmp, cd Set wmp CreateObject(WMPlayer.ocx) If wmp.cdromcollection.Count 0 Then Set cd wmp.cdromcollection.Item(0) cd.Eject() 弹出对应 cd.Eject 后再调 cd.Eject 是收回 End If到这里四个对象就串起来了WScript.Shell负责执行命令和伪造系统对话框MsgBox/InputBox负责跟用户交互、制造这真是系统提示的错觉FSO 负责在磁盘上留下痕迹和扩散自身WMPlayer.ocx负责制造机械层面的动静。合集的每一段代码都是这四样东西的不同排列组合。3. 把整人脚本改造成自律工具一份可抄作业的工程化改造知道原理之后更值钱的动作是把这个壳子改造成正经东西。整人脚本真正有用的部分——定时提醒、到点弹窗、写日志、开机自启——放到自律工具、值班提醒、批量作业前置检查上都成立。区别只在于整人脚本不给你取消的机会正经工具必须处处可取消、可追溯、可配置。这一章从零写一个remind.vbs功能是每隔一段时间弹一个提醒超时自动关超时后写日志重复启动只保留一个实例。所有代码都不调用关机命令。3.1 配置驱动的倒计时提醒用 Popup 超时替代强制关机先定结构。把标题、正文、超时秒数、日志路径全部提到脚本顶部的配置区改需求不动逻辑。这一步看着啰嗦但你把这个脚本发给同事用的时候他只需要改四行字符串。 remind.vbs —— 可取消的定时提醒不调用任何关机或重启命令 Option Explicit ---- 配置区改这里就够了 ---- Const CFG_TITLE 休息提醒 Const CFG_MSG 已经连续工作 45 分钟起来走两步顺便喝口水。 Const CFG_SECONDS 30 Const CFG_LOG C:\Temp\remind.log ------------------------------ Dim sh, ret Set sh CreateObject(WScript.Shell) Popup(正文, 超时秒数, 标题, 图标)超时返回 -1点按钮返回按钮值 ret sh.Popup(CFG_MSG, CFG_SECONDS, CFG_TITLE, 64) If ret -1 Then WriteLog CFG_LOG, 超时自动关闭用户未响应 Else WriteLog CFG_LOG, 用户点击按钮返回值 ret End IfPopup和MsgBox的取舍就一点需要没人管也能自己消失就用Popup需要必须等人点就用MsgBox。整人脚本用MsgBox是因为它要卡住用户正经工具用Popup是因为它不该阻塞任何事。这一个参数的选择直接决定了脚本是骚扰还是提醒。日志写入用 FSO 的追加模式第二个参数8是ForAppending第三个参数True表示文件不存在就创建Sub WriteLog(path, msg) Dim fso, ts, folder Set fso CreateObject(Scripting.FileSystemObject) 目录不存在时 OpenTextFile 会直接报错必须先建 folder fso.GetParentFolderName(path) If Not fso.FolderExists(folder) Then fso.CreateFolder folder End If 8 ForAppendingTrue 文件不存在时创建 Set ts fso.OpenTextFile(path, 8, True) ts.WriteLine Now msg ts.Close End Sub这里有个不写就翻车的细节OpenTextFile不会自动建目录。日志路径写成C:\Temp\logs\remind.log而C:\Temp\logs不存在脚本在第一行就抛路径未找到整个提醒功能静默失效——用户以为脚本没跑起来实际是日志那行炸了。所有写文件的脚本都该先GetParentFolderName再FolderExists判断这是标准动作。3.2 单实例锁与日志落盘让脚本能被反复启动而不失控双击两次图标就有两个实例同时在跑弹窗成对出现。整人脚本就是靠这个特性做越点越多的效果正经工具必须掐掉。VBScript 没有原生互斥量常见做法是查 WMI 里wscript.exe的进程列表再按命令行参数过滤出自己Function SelfInstances() Dim wmi, col, p, n n 0 通过 WMI 查所有 wscript.exe 进程的完整命令行 Set wmi GetObject(winmgmts:\\.\root\cimv2) Set col wmi.ExecQuery(SELECT CommandLine FROM Win32_Process WHERE Namewscript.exe) For Each p In col 只统计命令行里带本脚本文件名的避免误伤别的脚本 If InStr(1, p.CommandLine, remind.vbs, vbTextCompare) 0 Then n n 1 End If Next SelfInstances n End Function If SelfInstances() 1 Then 已经有实例在跑直接退出不弹任何东西 WScript.Quit End IfWin32_Process的CommandLine属性绝大多数情况下可读只有跨会话查询或者权限受限时返回空。如果你的部署环境是开机自启加锁屏场景CommandLine可能拿不到那就退一步用文件锁在%TEMP%下建一个带时间戳的标记文件启动时检查文件年龄超过阈值认为是残留、直接覆盖。两种做法都比完全不做防护强。注意WScript.Quit会立刻终止脚本写在Sub里也一样生效不需要层层Exit Sub往外抛。副作用是后面的清理逻辑不会执行日志可能少最后一行判断清楚再放。搭配 3.1 的日志一个完整生命周期就闭环了启动查实例超时弹窗弹完写日志退出。日志攒够一周你就可以回答这个提醒到底有没有人看这种问题——返回值-1占比高说明大家都在无视它该换提醒方式了。3.3 分发方式wscript、cscript 与任务计划的正确组合脚本写好了怎么跑也有讲究。Windows 上wscript.exe是窗口宿主cscript.exe是控制台宿主同一个.vbs文件双击默认走前者命令行敲cscript走后者。双击运行或开机自启用wscript不弹黑框适合有界面交互的提醒脚本。计划任务、批处理调用用cscript //nologo remind.vbs输出能重定向到文件失败能看到报错。//nologo的作用是隐藏cscript启动时那行版本横幅不加的话日志第一行永远是Microsoft (R) Windows Script Host Version...很难看。挂计划任务用命令行比图形界面更适合批量部署:: 每天 9:00 和 14:00 各触发一次运行当前用户的提醒脚本 schtasks /create /tn RestReminder /tr cscript //nologo \C:\Tools\remind.vbs\ ^ /sc daily /st 09:00 /f :: 想加第二时段用 /sc hourly 配合 /mo 更省事或者建两条任务 schtasks /query /tn RestReminder /v /fo LIST/tr后面如果路径带空格双引号要套两层外层给schtasks内层给cscript。只套一层的结果是任务创建成功但运行时提示找不到文件排半天才发现是引号被吃了这个坑踩一次能记一辈子。/f是覆盖同名任务的开关不加的话第二次创建会报错退出部署脚本没法重跑。调试阶段建议先/query看任务状态Last Run Time和Last Result两列能告诉你任务到底跑没跑、返回码是多少。返回码0x1一般是脚本语法错误0x2是文件找不到对着写就行。4. 危险脚本链路解剖一次插入U盘到系统失控的完整路径合集末尾那段被标注不要运行的代码是一个完整的自复制程序。它做的事情可以拆成三条独立链路扩散、破坏、骚扰。分开看每条链路的原理都不复杂合在一起才变成插一次U盘整台机器沦陷。拆它的目的不是复刻是让你在别人机器上看到类似痕迹时能在三十秒内判断出发生了什么、该杀哪个进程、该删哪个文件。4.1 autorun.inf 加隐藏属性自助复制链路的三个环节U盘自动执行靠的是根目录下一个叫autorun.inf的文本文件。它的格式是标准的 INI微软公开过字段定义[autorun] openlauncher.exe iconlauncher.ico,0 shell\open打开(O) shell\open\commandwscript.exe payload.vbs shell\explore资源管理器(X) shell\explore\commandwscript.exe payload.vbs读这段配置就能看出来open指定插入介质时自动运行什么shell\open\command指定右键打开时执行什么icon换掉盘符图标让它看起来像个正常U盘。合集里的代码用CreateTextFile拼出这几行再写完立刻把文件属性设成隐藏 系统用户打开显示隐藏文件也看不到。扩散链路分三步缺一不可第一步枚举驱动器用fso.Drives拿到盘符列表跟上一轮的结果比对多出来的就是新插入的盘。合集里用judge_new_disk这个函数做差集把新增盘符存进数组。第二步自复制。它没有直接读源文件而是先把自身内容读进内存、写到C:\ftgfolder.bin这个中转文件再Copy到目标盘、最后删掉中转文件。绕这一圈是为了避开某些环境对脚本直接复制自身的拦截属于典型的规避手法。第三步写autorun.inf同时把payload.vbs和配置文件属性改成 7。做完这三步下一个插入这台电脑的U盘又会被同样处理形成链式扩散。现代 Windows 对U盘 autorun 的自动执行早就默认关掉了open里的程序不会自己跑起来。但注意是自动执行被关了不是自动播放被关了——资源管理器仍会弹出一个你要如何处理此驱动器的对话框用户手一抖点了打开文件夹运行链路照样走通。所以看到U盘根目录有autorun.inf正确的处理是立刻删掉别去双击。提示检查U盘有没有被写过 autorun把资源管理器的文件扩展名和隐藏受保护的操作系统文件两个开关都打开根目录下出现autorun.inf、.vbs、.lnk混在一起基本可以判定中招。4.2 shutdown 命令参数-s、-r、-t、-c、-a 各管什么合集里出现最多的惩罚手段是关机。shutdown.exe的参数不多但每个都值得记清楚因为排查现场时你就是靠这些参数反推出脚本干了什么。参数含义典型写法-s关机shutdown -s -t 60-r重启shutdown -r -t 60-a取消已排定的关机shutdown -a-t 秒延迟多少秒后执行-t 300表示 5 分钟-c 注释关机对话框里显示的文字-c 系统将在5分钟后重启-f强制关闭未响应的程序-f-l注销当前用户-l-h休眠-h合集里shutdown -s -t 5是 5 秒后关机-t 300是 5 分钟-t 7200是 2 小时。-c后面的注释文字会原样显示在系统关机对话框里这是整人脚本最爱用的地方——把-c写成说我是猪不说就关机之类的文案看起来像是系统在跟你对话其实只是命令行参数。-t是唯一给你留后路的参数。只要倒计时没走完任何人在任意命令行窗口敲shutdown -a就能取消不需要管理员权限当前用户发起的关机当前用户可以取消。合集里那段要求输入特定文字才不关机的脚本最后一行shutdown -a就是靠这个机制撤销的。所以看到倒计时弹窗先别慌WinR 输cmd敲shutdown -a再慢慢收拾。需要留神的是-t 0和不带-t。这两种情况关机几乎是立即执行的-a来不及打。排查时看到事件日志里User32或Kernel-General记录的关机事件来源进程是shutdown.exe父进程是wscript.exe链条就清楚了。4.3 无限循环与资源占用从任务管理器到进程树最阴的一类不是关机是死循环。合集里有do ... loop反复弹窗的有sendkeys {f5}反复刷新的还有往文件系统里无限复制目录的。这类脚本不破坏数据但会让机器卡到没法操作用户想关窗口窗口一直在最前面挡住任务栏。更麻烦的是CreateObject(wscript.shell).run chr(34) wscript.scriptname chr(34)这种——它不断启动自己的新副本每启动一次就多一个wscript.exe进程进程数指数增长几秒钟就能把内存吃满。合集里管这叫最厉害的一个其实原理就一行脚本重新执行自身不做任何退出判断。处理顺序是这样的:: 第一步先看有多少个 wscript.exe 在跑 tasklist /fi imagename eq wscript.exe :: 第二步批量强杀会连带杀掉所有正常的 VBS 脚本慎用 taskkill /f /im wscript.exe :: 第三步如果 tasklist 都卡住刷不出来从命令行用 wmic 杀 wmic process where namewscript.exe deletetaskkill /f的/f是强制终止不加的话对方进程如果正卡在MsgBox等待输入taskkill会提示无法终止因为那个进程没有消息循环可响应。强杀会丢失未保存的数据但面对弹窗轰炸你没别的选择。杀完之后一定要查启动项否则重启又活过来。三个位置shell:startup目录、注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Run、以及计划任务库。合集里用 FSO 往当前用户目录写文件、往注册表写Date键做感染标记就是典型的持久化手法。进程树是排查时的黑匣子。用wmic process where namewscript.exe get ProcessId,ParentProcessId,CommandLine三条字段一起看能看出谁启动了谁、启动时带了什么参数。父进程 ID 指向explorer.exe说明是用户双击触发的指向另一个wscript.exe那就是自我复制指向cmd.exe八成是从批处理里被拉起来的。5. 避坑与排查运行这类脚本前后的五条实战记录下面这些坑全部来自真实复盘——有的是我自己踩的有的是帮人收拾现场时遇到的。每一条按现象 → 原因 → 解决写照着对号入座就行。5.1 五条踩坑记录从现象到原因的完整复盘第一条双击没反应以为脚本没跑。现象双击.vbs文件屏幕闪一下什么都没出现任务管理器里有个wscript.exe一闪就没了。原因脚本里第一行就有语法错误比如createobjecet拼错合集里就有这个错字。wscript遇到语法错误会弹一个错误框但如果脚本开头写了On Error Resume Next错误被吞掉脚本继续往下跑跑到引用未定义对象又出错再被吞掉最后静默退出。解决命令行cscript //nologo 脚本名.vbs运行错误会打到控制台。临时把On Error Resume Next注释掉再跑一遍让第一个错误冒出来。On Error Resume Next是排查时的头号敌人它把黑匣子关上了。第二条日志文件写不进去程序像死了一样。现象脚本设计了日志跑完之后C:\Temp\logs\目录下什么都没有但脚本确实执行了弹窗都弹了。原因OpenTextFile不会自动创建父目录日志路径的上级目录不存在时直接抛错。如果这行写在没有错误处理的Sub里整个Sub中断后面的逻辑全不执行。解决写文件前统一GetParentFolderNameFolderExistsCreateFolder封装成公共函数所有写操作都走它。顺手加一句On Error Resume Next兜底但错误要写进备用路径不能静默。第三条计划任务创建成功但从来不执行。现象schtasks /create返回成功schtasks /query也能查到任务Last Run Time永远是N/A。原因三种可能。一是/tr后面的路径带空格没加引号任务解析成找不到文件二是任务被创建成了仅在用户登录时运行而实际环境是无人值守三是任务运行账户没有桌面交互权限Popup弹到会话 0 里去了用户看不见脚本卡在那里等超时。解决先/query /v /fo LIST看Last Result返回码。0x2查路径引号0x41301是任务正在运行大概率卡在弹窗0x0但没效果就查会话隔离。无人值守场景改用Popup超时或直接写文件别依赖任何界面交互。第四条弹窗关不掉任务栏点不动。现象屏幕上全是同一个对话框点确定关掉一个立刻再冒一个任务栏被挡住AltF4 也没用。原因Do...Loop里嵌MsgBox脚本在等待用户输入用户点一次循环就转一圈再弹一次。前台窗口一直被占用焦点抢不过来。解决CtrlShiftEsc直接开任务管理器切到详细信息页找wscript.exe右键结束任务树。如果任务管理器也被挡住CtrlAltDel进安全选项界面从那里启动任务管理器。杀完之后立刻查启动项防止重启复活。第五条U盘插上就多出几个隐藏文件删了又出现。现象U盘根目录多出autorun.inf、一个.vbs文件和一个同名快捷方式删掉之后拔插一次又回来了。原因电脑上还活着一份自复制脚本它每隔几秒扫一次驱动器列表检测到新盘符就重新写一遍。只清U盘不清电脑等于白清。解决顺序反过来——先在电脑上全盘找wscript.exe异常进程并结束清启动项和计划任务再处理U盘。U盘处理时把两个显示隐藏文件的开关都打开attrib -h -s -r /s /d批量去掉隐藏属性然后删。清完重启一次再插U盘观察十分钟没复发才算干净。5.2 出问题后的排查顺序进程、启动项、注册表、U盘踩坑是零散的排查得按固定顺序走不然容易漏。我一般按这个顺序来从最快见效的往最慢的推。先看进程。tasklist或任务管理器按 CPU 和内存排序wscript.exe、cscript.exe、mshta.exe、cmd.exe这四类进程是重点怀疑对象。数量异常正常机器上一般 0 到 2 个、命令行带奇怪参数的先杀掉。再看启动项。三个位置并行查shell:startup目录、注册表Run键HKCU和HKLM都要看、任务计划库。.vbs出现在这三个位置里基本可以判定是被写进去的持久化直接删。第三看文件痕迹。整人脚本喜欢在C:\根目录、%TEMP%、C:\Windows\Temp三个位置留中转文件常见命名是.bin、.tmp、ftg*、a.bin、d.bin、s.bin这类。按修改时间排序找最近一小时内创建的可疑文件。最后才是U盘。前面对付的是感染源U盘是传播媒介顺序搞反就是反复感染。清完电脑之后再处理介质处理完拔插验证十分钟不复发再交还。注意动手清理之前如果机器上有未保存的工作先另存一份到网络位置或者移动硬盘。杀进程、强删文件都可能带崩宿主程序后悔药没处买。6. 二次开发把这个壳子换成能维护的小工具改造方向其实就三个按投入产出排。方向一提醒器改成值班/巡检打卡。3.1 那套配置驱动的结构原样搬过来把Popup的正文换成当班任务清单日志加一列确认人。值班室的老机器上放一个remind.vbs配两条计划任务成本几乎为零效果比装一套巡检系统实在。要扩展的话把配置从Const换成读同目录下的.ini用 FSO 逐行解析改班次不用改脚本。方向二把弹窗交互换成文件监听。整人脚本靠用户点按钮推进流程正经工具应该靠事件。VBScript 没有原生文件监听但可以用Do...Loop加FileExists轮询间隔WScript.Sleep 5000检测到某个标记文件出现就干下一件事。轮询的缺点是占一个进程常驻优点是实现简单异常退出后重启即可比 COM 事件可靠。我一般把轮询周期设成 5 到 10 秒太密了白烧 CPU太疏了响应慢。方向三危险方法全部封装成开关式函数。你不可能永远不用WScript.Shell.Run但可以让它只在明确授权的场景下执行。做法是加一层白名单把所有允许执行的命令写进配置Run之前先InStr比对不在白名单里的一律拒绝并写日志。这一层防护挡不住有心人改脚本但能挡住复制粘贴一段代码进来就跑的误操作而误操作才是事故的主要来源。方向四把入侵痕迹检测做成独立脚本。4.1 和 5.2 那一套检查逻辑完全可以写成一个只读的check.vbs扫根目录有没有autorun.inf扫启动项有没有.vbs扫%TEMP%下有没有异常.bin最后把结果写到一个报告文件里。跑一遍几秒钟比装一套杀软轻量得多适合放在U盘里随身带着用。有一件事我后来才想明白VBScript 在 Windows 上不会消失wscript.exe作为系统组件不可能被卸载这意味着这类脚本的生存空间一直都在。真正有效的应对不是永远不碰 VBS而是把它的能力边界摸清楚自己动手写过的才知道哪里会出问题。从那以后我每次在真实机器上跑任何来路不明的脚本之前都强制走一遍固定动作先在虚拟机里过一遍命令行用cscript //nologo带控制台跑而不是双击On Error Resume Next临时注释掉跑完立刻查一遍进程和启动项。三步走完顶多两分钟能省掉后面一整天重装系统的功夫。希望帮到你。本文还有配套的精品资源点击获取