文章关键字 ‘VB’

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读写二进制文件

2010年06月18日,星期五

网上关于VBS读写二进制文件和二进制数据的文章很少,估计是高手们都很忙,那就由我这个菜鸟来写吧。不知道会不会被很多人复制粘贴然后还不注明出处,应该是会的。恩,我要好好学习知识产权法。

查了很多资料,很多不明真相的同学都叫嚣说用adodb.stream对象就可以实现。不错,是通过adodb.stream实现读写二进制文件的功能,问题是如何实现,你有自己测试过吗?给出的代码都是先用adodb.stream对象读取,然后又写入,这样做有什么意义,还不如直接复制。我想实现的是用adodb.stream直接写我保存在代码中的数据。我试过使用adodb.stream对象的write方法,但是每次都弹出"ADODB.Stream: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."错误。想到Linux之父Torvalds Linus的一句话:“Talk is cheap. Show me the code.”光说有什么用,把代码给出来啊。没有代码,就不要说话。

下面是读写二进制文件的两个函数(过程),并不是我写的,我没有那么高的水平,也没有那么厚的脸皮说是我写的,而是国外一位VBS高人写的,膜拜之。ReadBinary函数从文件读取二进制数据并返回数组,WriteBinary将数组中的数据以二进制的形式写到文件中。

Function ReadBinary(FileName)
  Dim Buf(), I
  With CreateObject("ADODB.Stream")
    .Mode = 3: .Type = 1: .Open: .LoadFromFile FileName
    ReDim Buf(.Size - 1)
    For I = 0 To .Size - 1: Buf(I) = AscB(.Read(1)): Next
    .Close
  End With
  ReadBinary = Buf
End Function

Sub WriteBinary(FileName, Buf)
  Dim I, aBuf, Size, bStream
  Size = UBound(Buf): ReDim aBuf(Size \ 2)
  For I = 0 To Size - 1 Step 2
      aBuf(I \ 2) = ChrW(Buf(I + 1) * 256 + Buf(I))
  Next
  If I = Size Then aBuf(I \ 2) = ChrW(Buf(I))
  aBuf=Join(aBuf, "")
  Set bStream = CreateObject("ADODB.Stream")
  bStream.Type = 1: bStream.Open
  With CreateObject("ADODB.Stream")
    .Type = 2 : .Open: .WriteText aBuf
    .Position = 2: .CopyTo bStream: .Close
  End With
  bStream.SaveToFile FileName, 2: bStream.Close
  Set bStream = Nothing
End Sub

非常的强大,我写了一个示例程序,用WriteBinary过程写了一张图片,感兴趣的可以下载来测试一下。

[download id=13]