文章关键字 ‘VBScript’

VBS和UAC用户帐户控制

2010年06月24日,星期四

用户帐户控制(UAC)是Vista以上的系统新引进的功能,旨在提高系统的安全性。它限制应用程序在标准用户的权限下,除非管理员权限得到提升或验证。虽然很多人觉得这个功能很鸡肋,但是以VBS的角度来看,UAC还是多多少少有点用的。在UAC的限制下,直接双击VBS文件只能在标准用户权限下运行,很多事情是做不了的,比如复制自身到windows文件夹,或者写入注册表的开机启动项等等。在XP下非常猖獗的暴风一号病毒,放到Win7下也就只能改改文件夹属性为隐藏罢了,其他什么都做不了。当然了,一些不明真相的同学喜欢把UAC功能关掉,然后装个叫什么359还是361的所谓安全软件。我也不好多说什么,不然会遭到围观的。

双击VBS文件系统不会自动弹出UAC窗口是一个很大的问题,因为这大大限制了VBS的功能,很多事情都做不了,怎么解决呢?请看下面的代码

For Each objOS in GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
    If InStr(objOS.Caption,"XP") = 0 Then
        If WScript.Arguments.length = 0 Then
            Dim objShell
            Set objShell = CreateObject("Shell.Application")
            objShell.ShellExecute "wscript.exe", Chr(34) & _
            WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
        Else
            Call Main()
        End If
    Else
        Call Main()
    End If
Next

'By Demon
'https://demon.tw

Sub Main()
    MsgBox "UAC"
End Sub

这是我根据这个网站的代码改写的,判断系统版本,如果是XP(普通用户一般都是XP,如果是2003的话请自己改写)则直接运行代码,否则调用Shell.Application对象的ShellExecute方法,以管理员权限运行脚本。这样,我们的VBS程序在Vista/Win7系统下也可以像在XP系统那样为所欲为了。

用VBS屏蔽键盘和鼠标

2010年06月23日,星期三

看到标题你是不是不相信呢,说实话,换成以前我也不相信,VBS怎么可能屏蔽键盘和鼠标呢?光靠VBS当然是不可能的啦。但是结合我之前的两篇文章《用C语言屏蔽键盘和鼠标》和《用VBS读写二进制文件》,你会发现通过曲线救国的方法就可以实现了。这应该还算用VBS屏蔽的吧,就像网上很多人在批处理中调用VBS来实现一些批处理无法实现的功能一样。

用C语言写出来的程序还是有点太大了,我用汇编写了一个屏蔽键盘和鼠标的程序,编译好以后才2.5KB,把它的二进制数据放到VBS中不算太大,下载地址在文章末尾。

另外要说一下的是,网上也有所谓的“屏蔽”键盘的VBS程序,使用了快捷方式的快捷键来实现的,只能屏蔽单个按键,组合键和部分特殊按键无法屏蔽,不过拿来恶作剧一下也是不错的。但是代码中那个叫伤脑筋的写的代码通用性也太不高了,竟然使用"\程序\附件\辅助工具\"这样的路径,他怎么知道别人的电脑上有这个路径。我的系统是英文版的,就没有这个路径。于是我改写了一下,代码如下

Dim strKeys,arrKeys
strKeys = "A,B,C,D,E,F,G,"_
& "H,I,J,K,L,M,N,O,P,Q,"_
& "R,S,T,U,V,W,X,Y,Z,"_
& "1,2,3,4,5,6,7,8,9,0,"_
& "Tab,Up,Down,Left,Right,"_
& "F1,F2,F3,F4,F5,F6,F7,"_
& "F8,F9,F10,F11,F12"
arrKeys = Split(strKeys,",",-1,1)
Dim WshShell
Set WshShell = CreateObject("wscript.Shell")
Dim fso
Set fso = CreateObject("scripting.filesystemobject")
Dim desktop
desktop = WshShell.SpecialFolders("Desktop")
Dim bound,link,path
bound = UBound(arrKeys)
For i = 0 To bound
	path = desktop & "\" & arrKeys(i) & ".lnk"
	Set link = WshShell.CreateShortcut(path)
	link.TargetPath = "https://demon.tw"
	link.HotKey = arrKeys(i)
	link.Save
	fso.GetFile(path).Attributes = 6
Next

不过,还是下面给出的代码才是真正的屏蔽键盘,代码太长就不贴出来了,需要的自己下载。

VBS屏蔽键盘和鼠标的代码

[download id=16]

顺便附上汇编语言屏蔽键盘和鼠标的代码

[download id=17]

用VBS生成GUID

2010年06月21日,星期一

这个程序应该是出自微软的脚本专家,网上也有很多人复制粘贴过,代码一模一样而且不注明出处,这我不想多说,我说过很多次了。我要说的是里面生成的GUID是无法直接使用的,在我写《桌面上出现无法删除图标的解决方法》中的VBS程序时曾经测试过用VBS代码模拟那些流氓软件,在桌面上创建删不到的图标(其实也就写写注册表,一点技术含量也没有,拿来忽悠不明真相的群众罢了),写注册表的时候要用到GUID,按脚本专家给出的代码却产生了错误。

Set TypeLib = CreateObject("Scriptlet.TypeLib")
Wscript.Echo TypeLib.Guid

表面上正确输出了一个形如

{24DD18D4-C902-497F-A64B-28B2FA741661}

的GUID,但是如果直接在脚本中使用,会出现问题。原因如下

Set TypeLib = CreateObject("Scriptlet.TypeLib")
Wscript.Echo TypeLib.Guid
WScript.Echo Len(TypeLib.Guid)

Len(TypeLib.Guid)返回的值是40而不是38,也就是说在前38个字符后面有两个不可打印的字符,所有如果直接在脚本中使用会多出两个额外的字符,写入注册表的时候就达不到预期的效果。

综上,正确的代码应该是

Set TypeLib = CreateObject("Scriptlet.TypeLib")
strGUID = Left(TypeLib.Guid,38)
WScript.Echo strGUID

在此奉劝不明真相的同学,在复制粘贴别人的代码的时候最好测试一下,并给出原文的链接,尊重别人的知识产权。

用VBS检测U盘插入和弹出事件

2010年06月20日,星期日

貌似网上很多人问怎么用VBS检测U盘插入和弹出,其实这很容易实现,WMI赋予了VBS十分强大的功能。可以说,对WMI的掌握程度的多少直接决定了你的VBS水平高低。看过网上普遍流传VBS版U盘小偷程序,基本上都是靠无限循环实现的,一点技术含量也没有,文章的末尾给出了我写的VBS版U盘小偷程序的下载地址。虽然用WMI也得无限循环,但是效率是不一样的。

使用WMI的Win32_VolumeChangeEvent类就可以实现,下面是示例代码,更详细的信息请参考MSND文档

Const Configuration_Changed = 1
Const Device_Arrival = 2
Const Device_Removal = 3
Const Docking = 4
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService. _
    ExecNotificationQuery( _
        "Select * from Win32_VolumeChangeEvent")
Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    Select Case objLatestEvent.EventType
    	Case Device_Arrival
    		WScript.Echo "U盘插入,盘符为" & _
    		objLatestEvent.DriveName
    	Case Device_Removal
    		WScript.Echo "U盘弹出,盘符为" & _
    		objLatestEvent.DriveName
	End Select
Loop

我也写了一个U盘小偷程序,自以为比网上抄来抄去的代码要好,感兴趣的可以下载来看看。

[download id=14]

VBS和C语言效率比较

2010年06月19日,星期六

上一篇文章讲到用VBS写二进制文件,为了写二进制文件,首先我们要得到一个文件的二进制值的数组。可以通过程序获取文件的二进制值,本来我是用VBS实现的,但是发现VBS效率实在太低,只好改用C语言。一直知道VBS的效率是很低的,但是不知道和C语言比差多少,于是就有了这篇文章。两个程序都是读取文件的二进制值并转换成十进制后写入一个txt文件,并输出程序运行的时间。

VBS程序代码

Option Explicit
Dim begin_time,end_time,elapse_time
Dim str,length,i,c
Dim ado,fso,file
begin_time = Timer
Set ado = CreateObject("adodb.stream")
Set fso = CreateObject("scripting.filesystemobject")
Set file = fso.OpenTextFile("foo.txt",2,True)
ado.Type = 1
ado.Open
ado.LoadFromFile("foo.jpg")
str = ado.Read
length = LenB(str)
For i = 1 To length
	c = AscB(MidB(str,i,1))
	file.WriteLine c & "," & "_"
Next
ado.Close
end_time = Timer
elapse_time = end_time - begin_time
WScript.Echo elapse_time

C语言程序代码

#include <stdio.h>
#include <time.h>
int main(void)
{
	clock_t end,begin=clock();
	int c;
	FILE *in,*out;	

	in = fopen("foo.jpg","rb");
	out = fopen("bar.txt","wb");
	while((c=fgetc(in))!=EOF)
		fprintf(out,"%d\r\n,_",c);
	end = clock();
	printf("%f\n",(float)(end-begin)/1000);
	return 0;
}

同是用一个100kb大小的foo.jpg文件作测试,VBS程序平均运行了7.5秒左右,而C语言程序只运行了0.04秒左右,效率的差别可以看出。如果文件的大小增大,效率的差别更加的明显。