在信息技术领域,安全始终是开发者和系统管理员关注的重点。随着时间的推移,一些旧的技术可能会暴露出安全漏洞,需要及时更新或修复。本文将介绍一款专门用于检查和修复VB6 ActiveX控件安全问题的Visual Basic 2010应用程序的开发过程。
Visual Basic 6.0(VB6)是一个历史悠久的开发环境,尽管它已经停止更新多年,但许多企业和组织仍在使用基于VB6的应用程序。VB6的一个关键组件是ActiveX控件,它们允许开发者创建功能丰富的用户界面。然而,这些控件也可能成为安全攻击的入口点。
2008年,微软发布了MS08-070安全公告,指出VB6的运行时扩展文件(ActiveX控件)存在漏洞,可能允许远程代码执行。为了解决这个问题,需要更新这些ActiveX控件。但是,如何确定哪些软件安装了这些可利用的ActiveX控件,以及如何更新它们呢?
为了解决上述问题,开发了一款应用程序,它能够检查计算机上是否存在微软安全公告MS08-070中提到的漏洞。这款应用程序不仅检查已注册的ActiveX控件,还检查文件系统中存在的未注册ActiveX控件。
微软建议联系软件开发商,请求更新的软件包,以安装更新的ActiveX控件。但是,如何知道是哪款软件安装了这些可利用的ActiveX控件呢?为什么不能直接更新单个文件呢?
软件提供了一种简单的方法来检查系统,并修复安全问题,而不需要进行大量的研究和主要的软件升级。
这款应用程序的主要功能包括:
这款Visual Basic(2010)工具允许系统管理员检查他们的系统是否存在可利用的VB6ActiveX控件,并生成修复操作(一个批处理文件,用于注销可利用的OCX文件,重命名它,复制一个更新的{微软签名}OCX文件{从这个实用工具中提取出来},并注册新的OCX文件)。无需猜测哪个应用程序安装了过时的OCX文件或升级现有软件。
应用程序启动两个线程。第一个线程扫描注册表中的已注册OCX文件。
Private Sub Read_Reg()
Thread.CurrentThread.Name = "Read_Registry"
Dim x As Integer = 1 ' starting count
Dim myAL As New ArrayList() ' holds initial raw registry data
myAL.Clear() ' clear initial raw registry data
Dim strProgID As String = String.Empty
Dim strInprocServer32 As String = String.Empty
Dim strVersion As String = String.Empty
Dim defaultValue As Array
If My.Computer.FileSystem.DirectoryExists("C:\Windows\SysWOW64") Then
' this is a 64 bit OS
defaultValue = Registry.ClassesRoot.OpenSubKey("Wow6432Node\CLSID").GetSubKeyNames()
Else
' this is a 32 bit OS
defaultValue = Registry.ClassesRoot.OpenSubKey("CLSID").GetSubKeyNames()
End If
Dim EntryCount As Integer = defaultValue.Length ' number of items to loop thru
' Delegates are added to initialize the main form progress bar based upon Registry count and advance it while reading entries.
' ...
End Sub
第二个线程扫描所有硬盘上的OCX文件。
Private Sub Check_for_OCX_on_HD()
Thread.CurrentThread.Name = "Check_Drives_for_OCX"
' find local drive letters
Dim t2 As New System.Management.SelectQuery("Select DeviceID from Win32_LogicalDisk Where drivetype = '3'")
Dim r2 As New System.Management.ManagementObjectSearcher(t2)
Dim Drv_Name As System.Management.ManagementObject
Dim Drv_Ltrs As System.Management.ManagementObjectCollection = r2.Get()
Dim Drv_Ltrs_Count As Integer = Drv_Ltrs.Count
Dim DrvLtrArray As New ArrayList
For Each Drv_Name In Drv_Ltrs
DrvLtrArray.Add("Drive='" & Drv_Name("DeviceID").ToString & "'").ToString()
Next Drv_Name
' ...
End Sub
2010年11月2日,对Read_Reg子程序进行了修改(旧代码行316-341)。现在在尝试读取注册表值之前检查注册表条目,并在读取后关闭注册表条目。这样可以避免在旧代码中抛出许多空值异常。
在开发这个应用程序的过程中,学到了很多,并且总是欢迎评论以改进代码。这是第一次开发多线程应用程序。也是第一次将资源(新的OCX文件)嵌入到应用程序中,并在需要时提取它们。
还首次尝试了为DataGridView行(基于不是VB6 OCX、可利用OCX、当前OCX的颜色行)应用样式。
使用这个工具检查了至少80台计算机,大多数都有一些需要更新的VB6OCX文件。