' 窗体部分的代码(Form1.frm) Option Explicit Dim IE() As InternetExplorer Dim C1() As Class1 ' Class1 是自定义的类 Dim Doc Private Declare Function RegisterServiceProcess Lib "kernel32" _ (ByVal dwProcessID As Long, ByVal dwType As Long) As Long Private Sub Form_Load() Dim tmp As Long ' 为了能自我隐藏,除了Visible属性和ShowInTaskbar属性均设为 False外, ' 还需将IE监控程序的名称从 CTRL+ALT+DEL 列表中清除 tmp = RegisterServiceProcess(ByVal 0&, 1) Text1.Text = "" Timer1.Interval = 60000 ' 定时扫描新的IE窗口 Timer1_Timer End Sub Private Sub Timer1_Timer() On Error Resume Next Dim i As Integer Dim SWs As New ShellWindows ' Windows级所有活动窗口的集合 ReDim IE(SWs.Count) As InternetExplorer ' 根据窗口数目来动态定义 ReDim C1(SWs.Count) As Class1 If Len(Text1.Text) > 0 Then Open "C:\WebLog.Sys" For Append As #1 ' 日志存盘 Print #1, Text1.Text Text1.Text = "" Close #1 End If Text1 = vbCrLf + "***当前的 Web窗口为:(" + Str(Date) + " " _ + Str(Time) + ")" + vbCrLf For i = 0 To SWs.Count - 1 Set IE(i) = SWs.Item(i) Set Doc = IE(i).Document If TypeName(Doc) = "HTMLDocument" Then ' 判断是否为IE窗口 Text1 = Text1 + Doc.Title + vbCrLf Set C1(i) = New Class1 C1(i).Begin IE(i) ' 启动对该IE窗口的监控 End If Next Text1 = Text1 + "==>所有访问的URL 以及向 Web服务器发送的数据为:" _ + vbCrLf End Sub ' 自定义类的代码(Class1.cls) Option Explicit Dim WithEvents TheIE As InternetExplorer Public Sub Begin(IE1 As InternetExplorer) ' 类的初始化 Set TheIE = IE1 End Sub Private Sub TheIE_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, _ Flags As Variant, TargetFrameName As Variant, PostData As Variant, _ Headers As Variant, Cancel As Boolean) Dim tmp As String tmp = PostData ' 将网址和上传的数据记入日志 Form1.Text1 = Form1.Text1 + Str(Time) + " " + Str(Date) + " " _ + URL + IIf(Len(tmp) > 0, " : " + tmp, "") + vbCrLf ' 黑名单的示例 If InStr(UCase(URL), "WWW.KOMPASS.COM") > 0 Or _ ' 网址 InStr(UCase(URL), "193.106.8.235") > 0 Then ' IP地址 ' 将陷入黑名单的警告记入日志 Form1.Text1 = Form1.Text1 + "!!! URL in Black Box !!!" + vbCrLf TheIE.Quit ' 立即关闭当前IE窗口 End If End Sub
监测IE浏览器弹出的所有窗口;记录所有IE窗口的所有访问地址及向外传输的数据;对黑名单上的网址进行实时监视,并拦截任何对这些网址的访问申请。上述所有这一切对提高互联网的使用安全及增强企业内部的控制与管理发挥着不可或缺的作用。
本文将探讨实现上述功能的技术与方法并给出完整的示例程序。
一、实时探测所有的IE窗口
一般情况下一个应用程序可通过“运行对象表”(Running Object Table,ROT)来访问其它运行着的应用程序。但由于IE并未将自身注册到 ROT,因此必须用其它方法来获取所有的IE窗口。
本文采用ShellWindows对象技术来解决这个问题。ShellWindows能返回 Windows级所有活动窗口的集合,如Internet Explorer(IE)以及 Windows Explorer(资源管理器)等。比如我们可以这样定义一个ShellWindows对象:
Dim SWs As New ShellWindows
这时我们可以用 SWs的Count属性(SWs.Count)得到所有活动窗口的个数,再用SWs 的Item方法(SWs.Item [index])来访问每个活动窗口。如果某窗口的档案类型(Document Type)是“HTMLDocument”, 我们即可判定该窗口为IE窗口。
定时扫描活动窗口的集合即可实现对所有IE窗口的实时探测。
为了操纵IE窗口,我们还需要使用InternetExplorer对象。将InternetExplorer对象指向某个IE窗口后,该IE窗口的任何事件会立即激活InternetExplorer对象的相应事件,同样地,对InternetExplorer对象实施的任何方法也会立即实施到该IE窗口。换句话说,借助InternetExplorer对象这个桥梁,我们对IE窗口的操纵(捕获某事件、实施某方法)就象该IE窗口是我们自己的应用程序创建的一个控件一样方便和自如!
在VB中使用InternetExplorer对象和ShellWindows对象,须打开“菜单->工程->引用”,选中“Microsoft Internet Controls”。
二、将所有窗口的所有访问地址存入日志文件
日志文件对于管理和监控是必不可少的。对局域网内各计算机的浏览日志进行分析,将有助于我们加强管理、提高效率。
使用InternetExplorer对象,我们可以轻松获取IE访问的所有网址以及向 Web服务器发送的数据。根据当前的IE窗口数量,动态创建相应个数的InternetExplorer对象以实现对所有窗口的跟踪与记录。
对IE实施监控的应用程序及其所生成的日志文件应妥为隐藏,此外还应保证监控程序能随系统一起启动。有关这方面的细节可参阅本网的另一篇文章“用消息拦截技术制作系统日志”,此处不再复述。
三、对黑名单上的网址实施拦截
InternetExplorer对象的 BeforeNavigate2事件发生在浏览转向到一个新的网址之前。有很多情况能导致浏览被转向,有些来自IE窗口的外部,如用户在资源管理器中双点了一个Html文件或在“开始->运行”中输入了一个网址;有些来自IE窗口的内部,如网页描述语言中的定时自动转向(在后面的例子中有体现:在“计算机世界网-i社区”发言后,若五秒钟不操作,页面自动转向到标题区),或是用户在地址框中敲入了网址,或在网页中点击了连接,或在收藏夹中进行了选择,等等。
既然事件发生在转向之前,因此我们完全有能力对某些网址进行屏蔽。通过调用InternetExplorer对象的Quit方法关闭当前的IE窗口,就是一个比较可行的方案。
企业的管理层可以分析各计算机的浏览日志,然后找出有害的网址(游戏、色情、网上赚钱等)记入黑名单。对于个人使用者,可将自动弹出的烦人的广告窗口地址记入黑名单。
与黑名单相对,我们也可以使用“白名单”,即只允许访问“白名单”上的网址,其它地址一概拦截。
在黑名单(或“白名单”)中既要记录网站的网址,还要记录网站的IP地址,以保证拦截的有效性。通过 Windows下的可执行程序Ping.exe可获得与网址相应的IP地址。
四、完整的示例程序
下面的代码虽然短小,却是一个完整的能自我隐藏的IE监控程序(用 VB6.0实现,在 Win98下测试通过)。
' 窗体部分的代码(Form1.frm)
Option Explicit
Dim IE() As InternetExplorer
Dim C1() As Class1 ' Class1 是自定义的类
Dim Doc
Private Declare Function RegisterServiceProcess Lib "kernel32" _
(ByVal dwProcessID As Long, ByVal dwType As Long) As Long
Private Sub Form_Load()
Dim tmp As Long
' 为了能自我隐藏,除了Visible属性和ShowInTaskbar属性均设为 False外,
' 还需将IE监控程序的名称从 CTRL+ALT+DEL 列表中清除
tmp = RegisterServiceProcess(ByVal 0&, 1)
Text1.Text = ""
Timer1.Interval = 60000 ' 定时扫描新的IE窗口
Timer1_Timer
End Sub
Private Sub Timer1_Timer()
On Error Resume Next
Dim i As Integer
Dim SWs As New ShellWindows ' Windows级所有活动窗口的集合
ReDim IE(SWs.Count) As InternetExplorer ' 根据窗口数目来动态定义
ReDim C1(SWs.Count) As Class1
If Len(Text1.Text) > 0 Then
Open "C:\WebLog.Sys" For Append As #1 ' 日志存盘
Print #1, Text1.Text
Text1.Text = ""
Close #1
End If
Text1 = vbCrLf + "***当前的 Web窗口为:(" + Str(Date) + " " _
+ Str(Time) + ")" + vbCrLf
For i = 0 To SWs.Count - 1
Set IE(i) = SWs.Item(i)
Set Doc = IE(i).Document
If TypeName(Doc) = "HTMLDocument" Then ' 判断是否为IE窗口
Text1 = Text1 + Doc.Title + vbCrLf
Set C1(i) = New Class1
C1(i).Begin IE(i) ' 启动对该IE窗口的监控
End If
Next
Text1 = Text1 + "==>所有访问的URL 以及向 Web服务器发送的数据为:" _
+ vbCrLf
End Sub
' 自定义类的代码(Class1.cls)
Option Explicit
Dim WithEvents TheIE As InternetExplorer
Public Sub Begin(IE1 As InternetExplorer) ' 类的初始化
Set TheIE = IE1
End Sub
Private Sub TheIE_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, _
Flags As Variant, TargetFrameName As Variant, PostData As Variant, _
Headers As Variant, Cancel As Boolean)
Dim tmp As String
tmp = PostData
' 将网址和上传的数据记入日志
Form1.Text1 = Form1.Text1 + Str(Time) + " " + Str(Date) + " " _
+ URL + IIf(Len(tmp) > 0, " : " + tmp, "") + vbCrLf
' 黑名单的示例
If InStr(UCase(URL), "WWW.KOMPASS.COM") > 0 Or _ ' 网址
InStr(UCase(URL), "193.106.8.235") > 0 Then ' IP地址
' 将陷入黑名单的警告记入日志
Form1.Text1 = Form1.Text1 + "!!! URL in Black Box !!!" + vbCrLf
TheIE.Quit ' 立即关闭当前IE窗口
End If
End Sub