Windows防火墙设计实验报告.docx
- 文档编号:4432270
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:215.87KB
Windows防火墙设计实验报告.docx
《Windows防火墙设计实验报告.docx》由会员分享,可在线阅读,更多相关《Windows防火墙设计实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
Windows防火墙设计实验报告
网络安全大型作业
(Windows防火墙设计)
实验报告
班级:
08计算机网络
姓名:
学号:
V2008410
日期:
2011-3-3
一、实验目的和要求
1、学习Windows下防火墙设计技术
2、实现一个简单的Windows下的防火墙软件
3、分析simpleFW软件不足之处
4、根据要求理解两个SPI程序,并自己进行扩展,增加新的功能
二、实验原理
1.Windows的Hook技术:
Hook分为Hook消息和Hook函数调用
Hook函数调用是指截获特定进程或者系统对某个API函数的调用,使得API的执行流程转向特定的代码,后者称为注入代码,注入代码一般保存在注入DLL中。
2.Windows报文截获技术:
原始套结字(RawSocket)和替换系统自带的WINSOCK动态连接库
3.WindowsSPI原理:
Winsock2.0引入的一个功能就是允许开发者可以编写自己的服务提供者接口程序,即SPI程序。
SPI以DLL方式存在,工作在应用层,为上层程序提供结构函数。
4.SimpleFW基本技术:
Windows程序设计中几乎所有的动作都是利用消息来触发。
但是消息是和窗口绑定在一起的,一般拥有窗口才能接收消息。
在特殊情况下,线程也可以接收消息在SimpleFW中,当一个程序访问Winsock会弹出对话框,让用户选择是否允许访问。
这个过程通过IP_Moniter.dll发送给UI一个用户自定义消息来实现。
三、实验环境和采用的工具
1、操作系统为WindowsXP
2、编程工具为VC++6.0
四、简要分析实验原型软件(SimpleFW)的不足
1.原型软件不能记录访问规则,每次打开防火墙都需要用户重新设定,这样带来了很大的不便
2.原型软件不能灵活的对访问规则进行修改删除,这样一旦制定下来的规则都不能发生变化
3.原型软件没有自定义规则的功能,这样对于每一个应用程序第一次访问网络都需要进行询问,这样对用户使用来说比较不方便
4.原型软件没有基本的日志功能
5.原型软件不能对应用程序进行监控甚至是进行关键字匹配告警,只能进行简单的访问控制
6.原型软件只是简单的串行化,不能同时有多个应用程序访问
7.原型软件外观比较简陋,需要进一步修饰
8、原型软件没有流量监控功能,用户不知流量使用情况
9、原型软件缺少清理无用规则的功能
10、原型软件缺少修补系统漏洞的功能
五、在实验原型软件上新增的功能
5.1功能1
流量监控
5.1.1功能1描述
该功能可以实时监控用户当前使用的流量以及到目前为止用户设置时间内所使用的总流量
5.1.2功能1实现流程
#include"stdafx.h"
#include"MFNetTraffic.h"
#include"float.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
#include"winperf.h"
//Construction/Destruction
MFNetTraffic:
:
MFNetTraffic()
{
lasttraffic=0.0;
CurrentInterface=-1;
CurrentTrafficType=AllTraffic;
GetInterfaces();
}
MFNetTraffic:
:
~MFNetTraffic()
{
}
PERF_OBJECT_TYPE*FirstObject(PERF_DATA_BLOCK*dataBlock)
{
return(PERF_OBJECT_TYPE*)((BYTE*)dataBlock+dataBlock->HeaderLength);
}
PERF_OBJECT_TYPE*NextObject(PERF_OBJECT_TYPE*act)
{
return(PERF_OBJECT_TYPE*)((BYTE*)act+act->TotalByteLength);
}
PERF_COUNTER_DEFINITION*FirstCounter(PERF_OBJECT_TYPE*perfObject)
{
return(PERF_COUNTER_DEFINITION*)((BYTE*)perfObject+perfObject->HeaderLength);
}
PERF_COUNTER_DEFINITION*NextCounter(PERF_COUNTER_DEFINITION*perfCounter)
{
return(PERF_COUNTER_DEFINITION*)((BYTE*)perfCounter+perfCounter->ByteLength);
}
PERF_COUNTER_BLOCK*GetCounterBlock(PERF_INSTANCE_DEFINITION*pInstance)
{
return(PERF_COUNTER_BLOCK*)((BYTE*)pInstance+pInstance->ByteLength);
}
PERF_INSTANCE_DEFINITION*FirstInstance(PERF_OBJECT_TYPE*pObject)
{
return(PERF_INSTANCE_DEFINITION*)((BYTE*)pObject+pObject->DefinitionLength);
}
PERF_INSTANCE_DEFINITION*NextInstance(PERF_INSTANCE_DEFINITION*pInstance)
{
PERF_COUNTER_BLOCK*pCtrBlk=GetCounterBlock(pInstance);
return(PERF_INSTANCE_DEFINITION*)((BYTE*)pInstance+pInstance->ByteLength+pCtrBlk->ByteLength);
}
char*WideToMulti(wchar_t*source,char*dest,intsize)
{
WideCharToMultiByte(CP_ACP,0,source,-1,dest,size,0,0);
returndest;
}
/*
WindowNT/2000:
WhencallingtheRegQueryValueExfunctionwithhKeysettothe
HKEY_PERFORMANCE_DATAhandleandavaluestringofaspecifiedobject,the
returneddatastructuresometimeshasunrequestedobjects.Don'tbesurprised;
thisisnormalbehavior.WhencallingtheRegQueryValueExfunction,youshould
alwaysexpecttowalkthereturneddatastructuretolookfortherequestedobject.
*/
//得到接口号为interfaceNumber的接口流量
doubleMFNetTraffic:
:
GetTraffic(intinterfaceNumber)
{
try
{
#defineDEFAULT_BUFFER_SIZE40960L
POSITIONpos;
CStringInterfaceName;
pos=Interfaces.FindIndex(interfaceNumber);
if(pos==NULL)
return0.0;
//得到当前的接口名字
InterfaceName=Interfaces.GetAt(pos);
//为性能数据缓冲
unsignedchar*data=newunsignedchar[DEFAULT_BUFFER_SIZE];
//从RegQueryValueEx返回的值:
本例中忽略改变量
DWORDtype;
//缓冲的尺寸
DWORDsize=DEFAULT_BUFFER_SIZE;
//RegQueryValueEx返回的值
DWORDret;
//从网络对象(索引是510)查询性能数据
/*
HKEY_PERFORMANCE_DATA:
WindowsNT/2000/XP:
Registryentriessubordinatetothiskeyallowyouto
accessperformancedata.Thedataisnotactuallystoredintheregistry;
theregistryfunctionscausethesystemtocollectthedatafromitssource.
*/
/*
*/
while((ret=RegQueryValueEx(
HKEY_PERFORMANCE_DATA,"510",NULL,&type,data,&size))!
=ERROR_SUCCESS)
{
if(ret==ERROR_MORE_DATA)
{
//缓冲尺寸太小,增加内存分配
size+=DEFAULT_BUFFER_SIZE;
delete[]data;
data=newunsignedchar[size];
}
else
{
//未定义的错误
return1;
}
}
//性能数据块
PERF_DATA_BLOCK*dataBlockPtr=(PERF_DATA_BLOCK*)data;
//枚举链表中第一个对象
PERF_OBJECT_TYPE*objectPtr=FirstObject(dataBlockPtr);
//遍历链表
for(inta=0;a<(int)dataBlockPtr->NumObjectTypes;a++)
{
charnameBuffer[255];
//判断是否是网络对象索引号是510
if(objectPtr->ObjectNameTitleIndex==510)
{
//偏移变量
DWORDprocessIdOffset=ULONG_MAX;
//找到第一个计数器
PERF_COUNTER_DEFINITION*counterPtr=FirstCounter(objectPtr);
//遍历链表
for(intb=0;b<(int)objectPtr->NumCounters;b++)
{
//判断接收的数据类型是否是我们需要的
if((int)counterPtr->CounterNameTitleIndex==CurrentTrafficType)
processIdOffset=counterPtr->CounterOffset;
//下一个计数器
counterPtr=NextCounter(counterPtr);
}
//数据类型不是我们需要的
if(processIdOffset==ULONG_MAX){
delete[]data;
return1;
}
//找到第一个实列(instance)
PERF_INSTANCE_DEFINITION*instancePtr=FirstInstance(objectPtr);
DWORDfullTraffic;
DWORDtraffic;
//遍历整个实列
for(b=0;b
{
wchar_t*namePtr=(wchar_t*)((BYTE*)instancePtr+instancePtr->NameOffset);
//得到这个实列的PERF_COUNTER_BLOCK
PERF_COUNTER_BLOCK*counterBlockPtr=GetCounterBlock(instancePtr);
//现在我们得到了接口的名字
char*pName=WideToMulti(namePtr,nameBuffer,sizeof(nameBuffer));
CStringiName;
iName.Format("%s",pName);
POSITIONpos=TotalTraffics.FindIndex(b);
if(pos!
=NULL)
{
fullTraffic=*((DWORD*)((BYTE*)counterBlockPtr+processIdOffset));
TotalTraffics.SetAt(pos,fullTraffic);
}
//如果当前的接口就是我们选择的接口
if(InterfaceName==iName)
{
traffic=*((DWORD*)((BYTE*)counterBlockPtr+processIdOffset));
doubleacttraffic=(double)traffic;
doubletrafficdelta;
//判断处理的接口是否是新的
if(CurrentInterface!
=interfaceNumber)
{
lasttraffic=acttraffic;
trafficdelta=0.0;
CurrentInterface=interfaceNumber;
}
else
{
trafficdelta=acttraffic-lasttraffic;
lasttraffic=acttraffic;
}
delete[]data;
return(trafficdelta);
}
//下一个实列
instancePtr=NextInstance(instancePtr);
}
}
//下一个对象
objectPtr=NextObject(objectPtr);
}
delete[]data;
return0;
}
catch(...)
{
return0;
}
}
//枚举安装的接口
BOOLMFNetTraffic:
:
GetInterfaces()
{
try
{
#defineDEFAULT_BUFFER_SIZE40960L
Interfaces.RemoveAll();
unsignedchar*data=(unsignedchar*)malloc(DEFAULT_BUFFER_SIZE);
DWORDtype;
DWORDsize=DEFAULT_BUFFER_SIZE;
DWORDret;
chars_key[4096];
sprintf(s_key,"%d",510);
//RegQueryValueEx的固定调用格式
while((ret=RegQueryValueEx(HKEY_PERFORMANCE_DATA,s_key,0,&type,data,&size))!
=ERROR_SUCCESS){
while(ret==ERROR_MORE_DATA)
{
size+=DEFAULT_BUFFER_SIZE;
data=(unsignedchar*)realloc(data,size);
}
if(ret!
=ERROR_SUCCESS)
{
returnFALSE;
}
}
//得到数据块
PERF_DATA_BLOCK*dataBlockPtr=(PERF_DATA_BLOCK*)data;
//得到第一个对象
PERF_OBJECT_TYPE*objectPtr=FirstObject(dataBlockPtr);
for(inta=0;a<(int)dataBlockPtr->NumObjectTypes;a++)
{
charnameBuffer[255];
if(objectPtr->ObjectNameTitleIndex==510)
{
DWORDprocessIdOffset=ULONG_MAX;
PERF_COUNTER_DEFINITION*counterPtr=FirstCounter(objectPtr);
for(intb=0;b<(int)objectPtr->NumCounters;b++)
{
if(counterPtr->CounterNameTitleIndex==520)
processIdOffset=counterPtr->CounterOffset;
counterPtr=NextCounter(counterPtr);
}
if(processIdOffset==ULONG_MAX){
free(data);
return1;
}
PERF_INSTANCE_DEFINITION*instancePtr=FirstInstance(objectPtr);
for(b=0;b
{
wchar_t*namePtr=(wchar_t*)((BYTE*)instancePtr+instancePtr->NameOffset);
PERF_COUNTER_BLOCK*counterBlockPtr=GetCounterBlock(instancePtr);
char*pName=WideToMulti(namePtr,nameBuffer,sizeof(nameBuffer));
DWORDbandwith=*((DWORD*)((BYTE*)counterBlockPtr+processIdOffset));
DWORDtottraff=0;
Interfaces.AddTail(CString(pName));
Bandwidths.AddTail(bandwith);
TotalTraffics.AddTail(tottraff);//initial0,justforcreatingthelist
instancePtr=NextInstance(instancePtr);
}
}
objectPtr=NextObject(objectPtr);
}
free(data);
returnTRUE;
}
catch(...)
{
returnFALSE;
}
}
//返回安装的接口数
intMFNetTraffic:
:
GetNetworkInterfacesCount()
{
returnInterfaces.GetCount()-1;
}
//返回接口名称
BOOLMFNetTraffic:
:
GetNetworkInterfaceName(CString*InterfaceName,intindex)
{
POSITIONpos=Interfaces.FindIndex(index);
if(pos==NULL)
returnFALSE;
InterfaceName->Format("%s",Interfaces.GetAt(pos));
returnTRUE;
}
//返回接口带宽
DWORDMFNetTraffic:
:
GetInterfaceBandwidth(intindex)
{
POSITIONpos=Bandwidths.FindIndex(index);
if(pos==NULL)
return0;
else
returnBandwidths.GetAt(pos)/8;
}
//具体接口接收和发送的数据量
DWORDMFNetTraffic:
:
GetInterfaceTotalTraffic(intindex)
{
DWORDtotaltraffic=0;
POSITIONpos;
pos=TotalTraffics.FindIndex(index);
if(pos!
=NULL)
{
totaltraffic=TotalTraffics.GetAt(pos);
if(totaltraffic==0.0)
{
GetTraffic(index);
pos=TotalTraffics.FindInde
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 防火墙 设计 实验 报告