知识分享-用VBS阻止游戏运行

发表在    net 08-29 10:10:10

9 15133 15

一、简介

坑害好友专用,可以让TA没办法在电脑上打游戏!(其实你甚至可以让TA什么都打不开(逃

二、具体实现

0. 错误处理

这个是老生常谈了,无视错误、继续执行下一行:

On Error Resume Next

1. 监测进程创建

首先我们通过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,亲测可用。

2. 判断进程是不是目标

首先创建一个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高亮,加进去又不麻烦……)

3. 杀死进程

光发现目标进程被启动了也不行,还得把它关掉才完美。那怎么办呢?有两种办法:

  • 通过调用colMonitoredProcesses.NextEvent提供的Terminate方法
这个的实现方式很简单:

objLatestProcess.TargetInstance.Terminate

(objLatestProcess已经在之前的代码中声明过了)

当然了,对于某些特殊进程(比如Win8的系统设置进程settings.exe),这个方法可能会失效,因此这也是为何代码开头要有On Error Resume Next。

  • 通过调用WScript.Shell的Run方法,静默执行taskkill /f /pid objLatestProcess.TargetInstance.ProcessID进行。

这个也很简单:

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

好了,保存,双击运行。

现在打开一个记事本——忽然记事本自己消失了。大功告成!

4. 如何退出


如图。

5. 游戏主程序列表

这里有不少游戏主程序的进程名,自取:

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迅速实现一些别的语言很难完成的需求。


登录或注册后发布评论
author avatar

JieJiSS

英勇黄铜Ⅴ 85荣誉值

1

1

0

JieJiSS的其他帖子