让VB程序穿越Windows防火墙

编程爱好者

我们知道Windows XP SP2大大增强了内置防火墙的功能,只要Windows防火墙检测到应用程序与外部网络之间的传入通讯,就会自动进行拦截。而绕过这种检测机制的最佳办法就是使应用程序具有自动添加到Windows防火墙的例外列表功能,就像eMule、Bitcomet这类工具一样。

一、编程原理

要使应用程序具有自动添加Windows防火墙例外列表的功能,必须用到以下Windows Firewall API接口,包括INetFwMgr、INetFwPolicy、INetFwAuthorizedApplication。

INetFwMgr接口主要用来获取当前计算机上的防火墙配置对象,所有与防火墙配置相关的操作都需要用到该接口;

INetFwPolicy接口用来获取Windows防火墙的配置信息,并提供了AuthorizedApplications属性与INetFwAuthorizedApplication接口关联;

INetFwAuthorizedApplication接口则用来访问Windows例外列表中通过认证的应用程序的属性;

通过上述三个接口,不仅可以将我们自己的程序增加到Windows防火墙的例外列表,而且还可以获取(修改)Windows防火墙的配置信息。

二、代码实现

在了解实现原理之后,接下来就可以编写具体的代码了。由于微软在发布上述接口的同时,还提供了一个封装上述API的COM对象,因此大大简化了程序代码的编写。

33-f19-1.jpg

1.添加COM对象的引用

在VB下单击菜单“工程”、“引用”,然后在弹出窗口的列表中选中“NetCon 1.0 Library”和“NetFwTypeLib”,单击确定。

2.本应用程序的界面设计比较简单

在VB窗体上放置了三个命令按钮和一个Label,三个命令按钮分别用来实现启用防火墙、禁用防火墙、添加到防火墙例外列表,Label控件用来显示防火墙的当前状态。运行后的效果如图所示。

3.添加代码模块

在VB下新建一个模块,并添加如下代码:

Option Explicit On

Const NET_FW_SCOPE_ALL = 0

Const NET_FW_SCOPE_LOCAL_SU

BNET = 1

Const NET_FW_IP_VERSION_ANY = 2

'获取Windows防火墙的当前状态

Public Function FirewallStatus() As Boolean

Dim fwMgr As INetFwMgr

Dim oProfile As INetFwProfile

On Error GoTo errHandler

'声明Windows防火墙配置管理接口对象

fwMgr = CreateObject("HNetCfg.FwMg

r")

'获取本地防火墙当前的配置对象

oProfile = fwMgr.LocalPolicy.CurrentPr

ofile

'获取防火墙的状态,Ture表示启用,False表示禁用

FirewallStatus = oProfile.FirewallEnab

led

oProfile = Nothing

fwMgr = Nothing

Exit Function

errHandler:

FirewallStatus = False

MsgBox("Error: " & Err.Description)

Err.Clear()

End Function

'切换Windows防火墙的状态

Public Sub SwitchFirewall()

Dim fwMgr As INetFwMgr

Dim oProfile As INetFwProfile

On Error GoTo errHandler

'声明Windows防火墙配置管理接口对象

fwMgr = CreateObject("HNetCfg.FwMg

r")

'获取本地防火墙当前的配置对象

oProfile = fwMgr.LocalPolicy.CurrentPr

ofile

'根据当前的防火墙状态相应地调整启用与禁用状态

oProfile.FirewallEnabled = Not (oProfil

e.FirewallEnabled)

oProfile = Nothing

fwMgr = Nothing

Exit Sub

errHandler:

MsgBox(Err.Description)

Err.Clear()

End Sub

'将当前应用程序添加到Windows防火墙例外列表

Public Sub AddApplicationRule()

Dim fwMgr As INetFwMgr

Dim oProfile As INetFwProfile

On Error GoTo errHandler

'声明Windows防火墙配置管理接口对象

fwMgr = CreateObject("HNetCfg.FwMg

r")

'获取本地防火墙当前的配置对象

oProfile = fwMgr.LocalPolicy.CurrentPr

ofile

Dim oApplication As INetFwAuthorize

dApplication

'声明认证程序对象

oApplication = CreateObject("HNetCfg.FwAuthorizedApplication")

'设置认证程序对象的相关属性

With oApplication

'应用程序的完整路径

.ProcessImageFileName = App.Path & "\WindowsFirewallControl.exe"

'应用程序的名称,也就是在Windows防火墙例外列表中显示的名称

.Name = "Windows Firewall Control Programe"

'定义本规则作用的范围

.Scope = NET_FW_SCOPE_ALL

'定义本规则用户的IP协议版本

.IpVersion = NET_FW_IP_VERSION_

ANY

'表示启用当前规则

.Enabled = True

End With

'将创建的认证程序对象添加到本地防火墙策略的认证程序集合

oProfile.AuthorizedApplications.Add(oApplication)

MsgBox("添加成功!")

Exit Sub

errHandler:

MsgBox(Err.Description)

Err.Clear()

End Sub

三、补充说明

●由于Windows Firewall API接口是随Windows防火墙发布而新增的,所以上述代码只适用于安装了Winodws XP SP2和Windows 2003 Server SP1的操作系统;

●尽管本文的示例程序是通过命令按钮将应用程序添加到Windows防火墙例外列表,但最佳的处理方式是在应用程序启动时自动执行添加操作,或者可以像eMule、Bitcomet那样,提供一个选项让用户自行选择是否在启动时执行操作;

●除了文中提到的三个接口外,Windows Firewall API还提供了其他用户防火墙控制的接口,大家有兴趣可以通过VB的对象查看器查阅MSDN文档获取进一步的信息。

注:上述应用程序在Windows XP SP2和VB 6.0 SP6下调试通过。