让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对象,因此大大简化了程序代码的编写。

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下调试通过。