VB6 安全性检查工具开发记

在信息技术领域,安全始终是开发者和系统管理员关注的重点。随着时间的推移,一些旧的技术可能会暴露出安全漏洞,需要及时更新或修复。本文将介绍一款专门用于检查和修复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控件呢?为什么不能直接更新单个文件呢?

软件提供了一种简单的方法来检查系统,并修复安全问题,而不需要进行大量的研究和主要的软件升级。

主要功能

这款应用程序的主要功能包括:

  • 读取系统注册表,确定哪些ActiveX(OCX)文件已注册在计算机上(32位/64位操作系统)。
  • 提供一个实用工具来解决许多计算机上存在的潜在安全问题。
  • 演示如何使用线程同时读取注册表条目和检查文件。
  • 演示如何允许线程更新主窗体上的进度条和DataGridView。
  • 演示如何为DataGridView条目(行颜色)应用样式,根据数据条目添加时进行重新格式化。
  • 演示如何将文件嵌入到编译的应用程序中,并在需要时提取文件。

解决方案

这款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文件。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485