防火墙与入侵检测课程设计报告Word文档格式.docx

上传人:b****6 文档编号:17246937 上传时间:2022-11-29 格式:DOCX 页数:17 大小:360.67KB
下载 相关 举报
防火墙与入侵检测课程设计报告Word文档格式.docx_第1页
第1页 / 共17页
防火墙与入侵检测课程设计报告Word文档格式.docx_第2页
第2页 / 共17页
防火墙与入侵检测课程设计报告Word文档格式.docx_第3页
第3页 / 共17页
防火墙与入侵检测课程设计报告Word文档格式.docx_第4页
第4页 / 共17页
防火墙与入侵检测课程设计报告Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

防火墙与入侵检测课程设计报告Word文档格式.docx

《防火墙与入侵检测课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《防火墙与入侵检测课程设计报告Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

防火墙与入侵检测课程设计报告Word文档格式.docx

而且它还能禁止特定端口的流出通信,封锁特洛伊木马。

最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

三、关键技术及解决方案

概要设计:

(1)网络包的分析

各种类型报文对象的构造:

由于pcap每次抓到一个数据包,会提交其信息,方式为以unsignedchar*指向的一段缓冲区,现将缓冲区前14个字节读入,按以太帧格式构造以太帧头部的对象。

然后根据以太帧头部中的Type字段,决定接下来应该构造IP还是ARP还是RARP。

假设是IP,那么把缓冲区中第15个字节开始直到这块缓冲区最后的所以字节读入,按IP报文格式构造IP的对象,根据IP的Protocol字段,决定接下来构造TCP,UDP还是ICMP。

假设是TCP,则将IP的数据内容读入,按TCP格式构造TCP的对象。

注:

1)对于不满一个字节的字段,如一些标志位DF,URG等等需要用位运算将其取出

如:

if(*pos&

0x04)

DF=true;

else

DF=false;

其中pos为unsignedchar*,指向当前字节,而DF为该字节中右起第3位。

2)对于大于一个字节的字段,需要进行大数端到小数端的转换。

因为网络中传输是按大数段(高位在低地址处),而本地机器中则相反,按小数端(地位在低地址处)。

totallen=(*pos)*256+(*(pos+1));

total为双字节,pos指针开始时指向低地址,乘256是完成大数端到小数端的转换。

过滤方法:

(2)网络包的拦截

1.捕获网络的数据包后,先查看是来自哪个程序的。

在数据库中查找有没有相应的规则:

如果规则数据库中没有相应的规则,就弹出对话框让用户配置规则,然后添加到数据库中,然后按相应的规则,访问网络。

如果规则数据库中有相应的配置,就需要读取配置,对照访问规则权限来确定是阻止还是放行。

2.将进出的报文记录在数据日志中待以后查询。

3.将进出的报文情况添加到封包监视器中,待管理员查询。

四、测试

1、在程序调试阶段遇到的问题:

(1)如何编译动态链接库的问题

(2)如何分析通过winpcap捕获的数据包

以上问题最终通过查看相应的资料解决。

2、问题及难点所在:

防火墙的难点与重点就在如何获取网络中的发送或接受的报文,并分析报文。

找出潜在的安全问题,防患于未然。

通过对winpcap程序开发包的学习,掌握了如何通过winpcap提过的动态链接库中的基础函数来捕捉进出网络的数据包,并参阅资料,了解了各种网络数据包数据的格式与其的特点,通过字节的对比,解析数据包,提取出各个字段的内容,并判断如何网络的情况。

提醒用户设置网络访问的规则,来阻止或允许或条件允许。

3、运行结果与分析(测试)

启动程序:

访问网络:

配置规则:

访问结果:

放行时候:

拒绝时:

网络包监测窗口:

日志查询:

分析网络数据包的源代码如下:

TCP报文的数据结构与解析方法:

classTCPGram

{

public:

TCPGram();

TCPGram(constunsignedchar*buf,intbuflen);

virtual~TCPGram();

intsrcport;

//源端口

intdestport;

//目的端口

unsignedintseqnum;

//顺序号

unsignedintacknum;

//确认号

intheadlen;

//头部长

boolURG;

//为1表示使用紧急指针

boolACK;

//为1表示确认号合法

boolPSH;

//表示带有PUSH标志的数据

boolRST;

//用于主机崩溃或其他原因后的复位

boolSYN;

//用于建立连接

boolFIN;

//用于释放连接

intwindowsize;

//窗口大小

intchecksum;

//校验和

inturgpos;

//紧急指针,从当前顺序号到紧急数据位置偏移量

intoptlen;

//选项长度

unsignedchar*options;

//选项字段

intdatalen;

//数据段的长度

unsignedchar*data;

//数据指针

};

TCPGram:

:

TCPGram(constunsignedchar*buf,intbuflen)

//unsignedchar*buf;

unsignedchar*pos;

//intbuflen;

//buflen=bufferlen;

//buf=newunsignedchar[buflen];

//memcpy(buf,buffer,buflen);

pos=(unsignedchar*)buf;

srcport=(*pos)*0x100+(*(pos+1));

pos+=2;

destport=(*pos)*0x100+(*(pos+1));

seqnum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));

pos+=4;

acknum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));

headlen=(*pos)/16;

pos++;

if(*pos&

0x20)

URG=true;

else

URG=false;

0x10)

ACK=true;

else

ACK=false;

0x08)

PSH=true;

PSH=false;

RST=true;

RST=false;

0x02)

SYN=true;

SYN=false;

0x01)

FIN=true;

FIN=false;

windowsize=(*pos)*0x100+(*(pos+1));

checksum=(*pos)*0x100+(*(pos+1));

urgpos=(*pos)*0x100+(*(pos+1));

if(headlen>

5){

pos+=2;

optlen=headlen*4-20;

options=newunsignedchar[optlen];

memcpy(options,buf+20,optlen);

}

else{

optlen=0;

options=NULL;

pos=(unsignedchar*)(buf+headlen*4);

datalen=buflen-headlen*4;

if(datalen>

0){

data=newunsignedchar[datalen];

memcpy(data,buf+headlen*4,datalen);

data=NULL;

data=0;

}

UDP的数据结构与解析方法:

classUDPGram

UDPGram();

UDPGram(constunsignedchar*buf,constintbuflen);

virtual~UDPGram();

unsignedintsrcport;

unsignedintdestport;

inttotallen;

//总长

unsignedintdatalen;

//数据段段的长度

char*data;

UDPGram:

UDPGram(constunsignedchar*buf,constintbuflen)

totallen=(*pos)*0x100+(*(pos+1));

datalen=buflen-8;

data=newchar[datalen];

memcpy(data,buf+8,datalen);

IP的数据结构与解析方法:

classIPGram

intversion;

//版本

intIHL;

//头部长度

intservicetype;

//服务类型typeofservice

intprecedence;

//优先级

booldelay;

//延迟

boolthroughtput;

//吞吐量

boolreliability;

//可靠性

unsignedinttotallen;

//总长totallength

intidentification;

//标识

boolDF;

//不要分段

boolMF;

//还有进一步的分段

intfragoffset;

//分段偏移fragmentoffset

intTTL;

//生命期timetolive

intprotocol;

//协议,如TCP,UDP

unsignedintchecksum;

//头部校验和

longsrcaddr;

//源IP地址

longdestaddr;

//目的IP地址

//选项长度

//选项内容

//数据长度

//数据内容

IPGram();

IPGram(constunsignedchar*buf,intbuflen);

virtual~IPGram();

CStringGetService();

voidGetDestAddr(char*str);

CStringGetDestAddr();

voidGetSrcAddr(char*str);

CStringGetSrcAddr();

CStringGetID();

IPGram:

IPGram(constunsignedchar*buf,intbuflen)

//buf=newunsignedchar[buffer_len];

//buflen=buffer_len;

version=*pos/16;

IHL=*pos%16;

servicetype=*pos;

precedence=(*pos&

16)*4+(*pos&

8)*2+(*pos&

4);

16)

delay=true;

delay=false;

8)

throughtput=true;

throughtput=false;

4)

reliability=true;

reliability=false;

totallen=(*pos)*256+(*(pos+1));

identification=(*pos)*256+(*(pos+1));

64)

DF=true;

DF=false;

32)

MF=true;

MF=false;

fragoffset=(*pos%32)*256+(*(pos+1));

TTL=*pos;

protocol=*pos;

checksum=(*pos)*256+(*(pos+1));

srcaddr=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));

destaddr=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));

if(IHL>

pos+=4;

optlen=(IHL-5)*4;

pos=(unsignedchar*)(buf+IHL*4);

datalen=totallen-IHL*4;

memcpy(data,buf+IHL*4,datalen);

(注意:

其他更多数据包见源程序)

五、总结(收获与体会)

通过本次课程设计,我学习到了更多的编程方法,对《操作系统安全原理与技术》这门课程有了一个比较完整的认识和理解,知道了如何将防火墙与入侵检测的知识应用到实际编程中。

并且对使用visualc++6.0开发windows程序有了更深的认识。

通过这次设计,增加了我的检索自己所需知识的能力和调试C++程序的能力,也让我体会了编程知识的渊博,我们永远都不可能把知识学完,只要努力,总能做的比以前更好。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1