客服电话:15682930301

计算机论文

当前位置: 毕业论文>计算机论文 > 正文

论办公自动化网络安全系统的设计与实现

发布时间:2020-01-06 19:48文字数:17208字

  关键词:网络流量监控;网络安全;Socket;Access

  1 绪论

  1.1 研究背景与意义

  随着计算机网络技术的高速发展,网络正日益成为政治、经济、文化、生活中不可缺少的一部分。在它给人们的生活、学习、工作带来前所未有的方便和机遇的同时,由于网络自身固有的不安全性,网络安全问题也越来越引起人们的关注。所谓网络监控,即将网络上传输的数据捕获并进行分析的行为。网络监听在协助网络管理员监测网络传输数据,排除网络故障等方面具有十分重要的作用。然而,网络监听也给网络的安全带来了极大的隐患,许多的网络入侵往往都伴随着以太网内网络监听行为,从而造成口令失窃,敏感数据被截获等连锁性安全事故。

  因此网络流量监控在日常的网络运行维护当中是一个非常重要的内容。我们可以直观地了解网络中各个部分使用情况,第一时间发现异常网络流量,有效防范黑客和病毒的攻击。

  1.2 系统简介

  此网络流量监控系统可以实现监控流经本网卡的IP包。具体内容是可以监控本主机的某个IP的流量,也可以设定某个源IP地址,源IP的端口,目的IP地址,目的IP的端口的流量。再根据自己设定的内容,显示出各个符合要求的IP包的详细内容。

  本系统采用VC++,网络程序设计,Socket套接字,Sniff等技术。

  开发工具使用当前流行的Microsoft Visual C++ 6.0及Platform SDK for Windows Server 2003 SP1。

  2 系统相关技术

  2.1 Visual c++ 6.0的特点

  Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。

  虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。

  Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment ,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。

  Visual C++6.0是Microsoft Visual Studio 6.0家族成员之一,是一个功能极为强大的可视化软件开发工具。与其他的可视化编程环境(如Visual Basic)一样,Visual C++6.0集程序的代码编辑、编译、连接、调试等功能为一体,给编程人员提供了一个完整、全面而有方便的开发环境,并提供了许多有效的辅助开发工具。虽然它不像Visual Basic 那么容易上手,不过其强大的功能及运行速度是Visual Basic望尘莫及的。Visual C++基于C/C++,所以它拥有两种编程方式,一种是传统的基于Windows API的C编程方式,虽然其代码效率最高,但开发难度与开发工作量也随着增高;另一种是基于MFC的C++编程方式,虽然其代码运行速率相对较低,但开发难度小,开发工作量小,源代码效率高,已成为Visual C++开发Windows应用程序的主流。Visual C++采用C++语言,凭借MFC类库对Windows API的良好封装,倍受程序开发人员的青睐。由于Visual C++是Microsoft公司推出的产品,在Windows系统的支持下,其执行速度和对操作系统的访问权限之高是其他编程工具无法比拟的。为了帮助开发人员快速地开发应用程序,Visual C++提供了AppWizard(应用程序向导)和ClassWizard,开发这可以迅速地添加新类、成员变量和方法。两者紧密结合,使Windows编程变得更简单了。

  VC6引入了多项出色的新功能,例如智能感应(IntelliSense)技术,程序员在键入代码时,VC6的编辑器能自动把属性、参数信息、数据类型信息、代码信息罗列出来,供程序员选择并自动完成输入,这种技术源自于VB5,现在已被应用到了VC6、VJ6和IE5中,有了它之后,程序员无需去记忆复杂的语法、参数和构件属性,从而提高了编程效率。另一项典型的新技术是即编即调(Edit and Continue),现在程序员可以直接在调试过程中编辑代码,而不用像以前那样,需要先退出调试状态,然后编辑,重新编译连接,并启动调试器,再跟踪到发生问题的地方。此外,VC6还具有动态更新类视图、延迟加载、支持IE 4.0通用控件等等众多的新特性。

  Visual C++它大概可以分成三个主要的部分:

  (1) Developer Studio

  这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C++”,所以很多人理所当然的认为,那就是Visual C++了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C++, 它充其量只是Visual C++的一个壳子而已。这一点请切记!

  (2) MFC

  从理论上来讲,MFC也不是专用于Visual C++,Borland C++,C++ Builder和Symantec C++同样可以处理MFC。同时,用Visual C++编写代码也并不意味着一定要用MFC,只要愿意,用Visual C++来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,Visual C++本来就是为MFC打造的,Visual C++中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C++而不用MFC就等于抛弃了Visual C++中很大的一部分功能。但是,Visual C++也不等于MFC。

  (3) Platform SDK

  这才是Visual C++和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是以Microsoft C/C++编译器为核心(不是Visual C++,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功能,那么这项工作是由来完成的呢。是CL,是NMAKE,和其他许许多多命令行程序。

  2.2 网络程序设计技术要求

  2.2.1 网络监控基础

  知道在以太网中,所有的通讯都是广播的,也就是说通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据,而每一个网络接口都有一个唯一的 硬件地址,这个硬件地址也就是网卡的MAC地址,大多数系统使用48比特的地址,这个地址用来表示网络中的每一个设备,一般来说每一块网卡上的MFC地址 都是不同的,每个网卡厂家得到一段地址,然后用这段地址分配给其生产的每个网卡一个地址。

  在正常的情况下,一个网络接口应该只响应这样的两种数据帧:一是与自己硬件地址相匹配的数据帧。二是发向所有机器的广播数据帧。

  在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。CPU得到中断信号产生中断,操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据。驱动程序接收数据后放入信号堆栈让操作系统处理。

  从发送方看,计算机要发送数据时,数据自应用层向物理层向下传递过程中 ,逐步成型为网络数据帧,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。从接收方看,网卡一般有四种接收数据帧的状态:

  1单一 在这种模式下 ,是指网卡在工作时 ,只接收数据帧中目的地址是本机MAC地址的数据帧。

  2 广播 该模式下的网卡能够接收网络中的广播信息。

  3 组播 设置在该模式下的网卡能够接收组播数据。

  4 混杂 在这种模式下的网卡能够接收一切通过它的数据 ,而不管该数据是否是传给它的。

  正常情况下,网卡只是接收发往自身的数据报文、广播和组播报文。究其原因,是由于以太网卡内建一个称为数据包过滤器,它会将不属于它的数据包信息忽略掉,也就是说,它会忽略掉与MAC地址不同的数据包。但是嗅探程序可把这项硬件功能关闭,并将以太网卡设置成“混杂模式”。也就是不做任何数据包的过滤,让所有通过网络里的数据包都顺利地进入,进行捕捉和记录。

  2.2.2 套接字类型

  套接字(Socket)是网络通信的基本操作单元,又被称作端口,通常用来实现客户方和服务器方的连接。网络上的两个程序通过一个双向的通信连接实现数据的交换,在实现双向通信链路的每一端都建立一个Socket,通过对Socket的读/写操作实现网络通信功能。套接字是网络通信的一个标准,它就像房中的电源插座,无论是电灯还是电脑等电器,它们只要使用220V 50Hz 的交流电压,插在电源插座上就能正常工作。

  套接字可以分为以下三种类型:

  (1)流套接字

  这是最常用的套接字类型,TCP/IP协议中的TCP协议使用此类接口,它提供面向连接的、无差错的、发送先后顺序一致的、包长度不限和非重复的网络信包传输。

  (2)数据报套接字

  TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重复的场合。

  (3)原始数据包套接字

  提供对网络通信下层通信协议(如IP协议)的直接访问,允许访问底层传输协议的一种套接字类型。它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。使用原始套接字操作IP数据报,可以进行路由跟踪、Ping等。原始套接字有两种类型,第一类型是在IP头中使用预定义的协议,如ICMP;第二种类型是在IP头中使用自定义的协议。并且仅Administrator组的成员能够SOCK_RAW类型的套接字。

  所有Socket通信程序的基本结构都是一样的,主要有创建Socket、打开连接到Socket的输入流和输出流、按照一定的协议对Socket进行读写操作、关闭Socket这四个步骤,通过这四个步骤可以完成一般的Socket通信。

  2.2.3 TCP/IP协议族

  开放系统互连(OSI)模型将网络划分为七层模型,分别用以在各层上实现不同的功能,这七层分别为:应用层、表示层、会话层、传输层、网络层、数据链路层 及物理层。而TCP/IP体系也同样遵循这七层标准,只不过在某些OSI功能上进行了压缩,将表示层及会话层合并入应用层中,所以实际上我们打交道的 TCP/IP仅仅有5层而已,网络上的分层结构决定了在各层上的协议分布及功能实现,从而决定了各层上网络设备的使用。

  TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务,而IP则是提供网络层服务。TCP/IP包括以下协议:

  IP:网间协议(Internet Protocol) 负责主机间数据的路由和网络上数据的存储。同时为ICMP,TCP,UDP提供分组发送服务。

  ARP:地址解析协议(Address Resolution Protocol)此协议将网络地址映射到硬件地址。

  RARP:反向地址解析协议(Reverse Address Resolution Protocol)此协议将硬件地址映射到网络地址。

  ICMP:网间报文控制协议(Internet Control Message Protocol)此协议处理信关和主机的差错和传送控制。

  TCP:传送控制协议(Transmission Control Protocol)这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。

  UDP:用户数据报协议(User Datagram Protocol)这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。

  FTP:文件传输协议(File Transfer Protocol)允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。

  SMTP:简单邮件传送协议(Simple Mail Transfer Protocol)SMTP协议为系统之间传送电子邮件。

  TELNET:终端协议(Telnet Terminal Procotol)允许用户以虚终端方式访问远程主机。

  HTTP:超文本传输协议(Hypertext Transfer Procotol)。

  TFTP:简单文件传输协议(Trivial File Transfer Protocol) 。

  2.2.4 网络程序设计一般步骤

  在所有 Windows Sockets 函数中,只有启动函数 WSAStartup() 和终止函数 WSACleanup() 是必须使用的。

  启动函数WSAStartup()必须是第一个使用的函数,而且它允许指定 Windows Sockets API 的版本,并获得 SOCKETS的特定的一些技术细节。

  关闭函数使用时,任何打开并已连接的 SOCK_STREAM 套接字被复位,但那些已由 closesocket() 函数关闭的但仍有未发送数据的套接字不受影响,未发送的数据仍将被发送。程序运行时可能会多次调用 WSAStartuo() 函数,但必须保证每次调用时的 wVersionRequested 的值是相同的。

  在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:

  首先服务器方要先启动,并根据请示提供相应服务:(过程如下)

  1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。

  2、等待客户请求到达该端口。

  3、接收到重复服务请求,处理该请求并发送应答信号。

  4、返回第二步,等待另一客户请求

  5、关闭服务器。

  客户方:

  1、打开一通信通道,并连接到服务器所在主机的特定端口。

  2、向服务器发送服务请求报文,等待并接收应答;继续提出请求。

  3、请求结束后关闭通信通道并终止。

  2.2.5 基于Visual C++的Winsock API简介

  为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。

  微软为VC定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,读者朋友当然可以使用这些类来实现自己的网络程序。

  在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。

  1、WINSOCK.H:这是WINSOCK API的头文件,需要包含在项目中。

  2、WSOCK32.LIB:WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。

  3、WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。

  2.3 Windows消息机制

  2.3.1 Windows消息机制概念

  Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。

  Windows系统中有两种消息队列:系统消息队列和应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将消息拷贝到相应的应用程序消息队列中。应用程序的消息处理程序将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。这便是一个事件从发生至到达窗口函数必须经历的过程。

  2.3.2 Windows消息类型

  Windows操作系统中包括以下几种消息:

  1、标准Windows消息:这种消息以WM_打头。

  2、通知消息:通知消息是针对标准Windows控件的消息。这些控个包括:按钮(Button)、组合框(ComboBox)、编辑框(TextBox)、列表框 (ListBox)、ListView控件、Treeview控件、工具条(Toolbar)、菜单(Menu)等。每种消息以不同的字符串打头。

  3、自定义消息编程人员还可以自定义消息。

  2.3.3 Windows消息实现具体过程

  消息的组成:一个消息由一个消息名称(UINT)和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

  谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。

  未处理的消息到那里去了:为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用 Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

  窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。

  消息循环:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以 Windows可以同时进行多个任务。

  而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。

  2.3.4 消息实现过程举例

  Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得,并且对于一般的消息,此函数返回非零值,但是对于 WM_QUIT消息,返回零。可以通过这个特征,结束程序。当取得消息之后,应该先转换消息,再分发消息。所谓转换,就是把键盘码的转换,所谓分发,就是 把消息分发给对应的窗口,由对应的窗口处理消息,这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功能:TranslateMessage 和DispatchMessage。

  另外,需要注意,当我们点击窗口的关闭按钮关闭窗口时,程序并没有自动退出,而是向程序发送了一个WM_DESTROY消息(其实过程是这样的,首先向程 序发送WM_CLOSE消息,默认的处理程序是调用DestroyWindow销毁窗体,从而引发WM_DESTROY消息),此时在窗体中我们要响应这 个消息,如果需要退出程序,那么就要向程序发送WM_QUIT消息(通过PostQuitMessage实现)。一个窗体如果想要调用自己的消息处理函 数,可以使用SendMessage向自己发消息。

  如上所述,大部分(注意是大部分)的消息是这样传递的:首 先放到进程的消息队列中,之后由GetMessage取出,转换后,分发给对应的窗口。这种消息成为存储式消息。存储式消息基本上是使用者输入的结果,以 击键(如WM_KEYDOWN和WM_KEYUP讯息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮 (WM_LBUTTONDOWN)的形式给出。存储式消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息 (WM_QUIT)。但是也有的消息是直接发送给窗口的,它们被称为非存储式 消息。例如,当WinMain调用CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理函数发送一个WM_CREATE消息。 当WinMain调用ShowWindow时,Windows将给窗口消息处理函数发送WM_SIZE和WM_SHOWWINDOW消息。当 WinMain调用UpdateWindow时,Windows将给窗口消息处理函数发送WM_PAINT消息。

  2.4 ADO介绍

  Microsoft? ActiveX? Data Objects(ADO)是微软新近推出的新一带数据访问规范,其使用简便且功能强大,目前有着广泛的应用。

  ADO使用户能够编写应用程序以通过OLEDB提供者访问和操作数据库服务器中的数据。ADO最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO支持建立客户端/服务器和基于WEB的应用程序的关键功能。到客户端应用程序或WEB页中,然后在客户端对数据进行操作,最后将更新数据返回服务器。

  ADO被设计用来同新的数据访问层OLEDB Provider一起协同工作,以提供通用数据访问(Universal Data Access)。OLEDB是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象。

  ADO向我们提供了一个熟悉的,高层的对OLEDB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLEDB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLEDB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLEDB提供者(OLEDB provider)。目前,虽然OLEDB提供者比较少,但微软正积极推广该技术,并打算用OLEDB取代ODBC。

  ADO数据库访问技术的特点:

  ADO技术是基于OLEDB的访问接口,提供面向对象的技术,属于高层接口,而OLEDB是Visual C++提供的,是基于COM接口的底层接口技术。

  访问数据库时,会有多种方法。

  基于COM的特性,使ADO技术能应用于很多编程环境,只要该环境支持COM,例如VC++,VJ++,VB等。

  3 系统分析

  3.1 系统分析概述

  经过系统需求分析后,可以归纳成这样。如下图3-1所示:

  图3-1系统功能图

  3.2 系统主要功能

  本系统主要功能涉及到如下部分:

  数据包管理、数据包设置,日志管理,日志设置,以及系统退出和说明以下是本系统的模块图。如图3-2所示:

  图3-2 系统模块图

  1.数据包管理

  包括通过原始套接字捕获数据包,根据数据包的类型,即IP包,TCP包,UDP包,IGMP包等,从而再根据其中类型,查阅相关数据包结构,并且将此包的协议类型,源地址IP,源地址端口,目的地址IP,目的地址端口,数据长度,以及其中的内容。其中内容16进制显示和ASCII显示,可以方便我们看明白其中内容。

  2.数据包设置

  此部分对数据包管理部分进行设置。因为一台电脑,可能有多个IP地址。所以在这里可以修改对哪个IP地址进行监控。并且可以设定对哪些IP包进行监控。包括源地址IP,源地址端口,目的地址IP,目的地址端口,以及其中的内容是否为空等。当源地址IP为空或0.0.0.0时,表示对任何源地址IP进行监控,同理对于目的地址IP也是如此。源地址端口为0时,表示对任何端口进行监控,同理对于目的端口也是如此。

  3.日志设置

  规则包括监控的源地址IP,源地址端口,目的地址IP,目的地址端口,危害等级以及对其进行的说明。当源地址IP为空或0.0.0.0时,表示对任何源地址IP进行监控,同理对于目的地址IP也是如此。源地址端口为0时,表示对任何端口进行监控,同理对于目的端口也是如此。可以显示所有规则,增加规则和删除规则。当系统读取到符合这些规则的数据包时,就存入数据库。

  4.日志管理

  这一功能主要是从数据库中读取已经符合规则的数据包,并显示出来,包括协议类型,源地址IP,源地址端口,目的地址IP,目的地址端口,危害等级以及对其进行的说明。可以对其中进行删除或全部删除IP和显示其中的详细内容的操作。

  5.退出与系统说明

  只要点击退出按钮,就可以退出本系统软件。又对于一些非模态对话框产生的窗口,关点击关闭按钮还不够,还要手动销毁对话框。系统说明对本系统进行的简单介绍。

  3.3 数据流图

  数据流图是用来描述数据处理的过程,不反映时间的顺序,只反映数据的流向、自然的逻辑过程和必要的逻辑数据存储,即表示“做什么”,而不表示“怎么做”我毕业设计的流图大体如下图3-3所示所示:

  图3-3 系统数据流图

  3.4 数据字典

  数据字典是对系统用到的所有数据项和结构的定义,以确保开发人员使用统一的数据定义。本系统中的部分的数据字典如下:

  数据项

  数 据 项:日志规则ID

  含义说明:唯一的表示一个日志规则

  类 型:整型

  长 度:11

  取值含义:用户自定义

  数据项

  数 据 项:数据包编号

  含义说明:唯一的表示一个数据包的类型

  类 型:整型

  长 度:10

  数据结构

  数据结构:日志规则信息表

  含义说明:记录规则的所有信息。

  组 成:编号,源地址IP,源地址端口,目的地址IP,目的地址端口,危害 等级以及规则介绍

  数据结构

  数据结构:数据包信息表

  含义说明:记录符合规则数据包信息。

  组 成:编号,源地址IP,源地址端口,目的地址IP,目的地址端口,危害 等级,符合哪条规则以及数据包长度和内容。

  数据存储

  数据存储:符合规则数据包信息

  说 明:记录符合规则数据包信息

  存取方式:随即存取

  4 数据库设计

  4.1 数据库设计原则

  数据库设计的目标是要求完全满足业务的数据存储要求。如果能够设计一个合理的数据库模型,不仅会降低程序编程和维护的难度,也会提高系统实际运行的性能,因而必须仔细的制定设计步骤方案,了解规范的设计方法和必要的规则。

  一个成功的管理系统,是由:[50%的业务 + 50%的软件]所组成,而50%的成功的软件又有[25%的数据库+25%的程序]所组成,数据库设计的好坏是一个关键。如果把企业的数据比做生命所需的血液,那么数据库设计就是应用中最重要的一部分。

  对于网络流量监控管理系统来说,拥有大量的上网人员需要强有力的数据库支撑,但是对于本系统来说,由于不会在实际环境中运行,所以数据库的使用可以选择容易使用,并且易于维护的、容易获取的数据库作为后台存放网吧相关信息等的数据库最终选择了作为后台支持数据库。

  4.2 概念结构设计

  E-R模型和关系模型是两种对数据库不同的描述,在E-R模型中用实体集和联系表示现实世界中的事物及其相互之间的关系;而在关系模型中则用单一的结构来组织数据。所以,在这里就存在一个如何将E-R模型转化为关系模型的问题。下面介绍转化所需要遵守的几条准则:

  ★ E-R模型中的每一个实体都转化成一个同名的关系,实体集的属性就是关系的属性,实体集的码就是关系的码。

  ★ E-R模型中的每一个联系也用一个关系表示,与该联系相连的各实体集的码以及联系的属性转化为关系的属性。该关系的码有三种情况:

  ● 若联系为1:1,则每个实体的码均是该关系的候选码。

  ● 若联系为1:n,则关系的码为n端实体集的码。

  ● 若联系为m:n,则关系的码为各实体集码的组合。

  ★ 具有相同码的关系模式可以合并(合并原则)。

  在这里我们将要设计的是数据库的概念模式。根据对数据流图和数据字典的分析,我们可以确定该应用中的实体、属性和实体之间的关系,并画出表E-R图:

  如下图4-1、图4-2和图4-3所示

  图4-1实体及其联系图

  图4-2 日志规则实体及其属性图

  图4-3 数据包实体及其属性图

  4.3 逻辑结构设计

  设计逻辑结构的是和分三步进行:

  将概念结构(E-R图)转化为一般关系模型

  将转化来的关系模型向Microsoft Office Access 2003支持下的数据模型转化

  对数据模型进行优化,消除冗余字段,极小化处理,形成下表4-1和表4-2:

  表4-1 install信息表

  字段数据类型允许空/主键描述

  num数字NO/主键日志规则编号

  sourceip文本YES源地址IP

  sourceport文本YES源地址端口

  destip文本YES目的地址IP

  destport文本YES目的地址端口

  level文本NO危害等级

  introduce备注YES介绍

  表4-2 packet信息表

  字段数据类型允许空/主键描述

  num数字NO/主键数据包编号

  install_num数字NO日志规则编号

  pro文本YES协议

  sourceip文本YES源地址IP

  sourceport文本YES源地址端口

  destip文本YES目的地址IP

  destport文本YES目的地址端口

  length文本YES数据包长度

  report文本YES数据包内容

  time文本YES时间

  5 系统实现

  5.1 开发必备环境

  1、安装Microsoft Visual C++ 6.0。

  2、安装Microsoft Office Access 2003

  3、安装Platform SDK for Windows Server 2003 SP1

  5.2 重要技术的注意事项

  5.2.1 数据库的配置

  1、通过Windows自带的数据源 (ODBC)把数据库sniff添加到系统数据源。

  2、加载msado15.dll。可通过下面代码实现#import "C:\ProgramFiles\Common Files\System\ado\msado15.dll"no_namespace\rename("EOF","adoEOF")rename("BOF","adoBOF"),把以上代码加到StdAfx.h中。

  3、在程序开始时通过CoInitialize(NULL)初始化COM环境。

  4、在程序最后还要通过CoUninitialize()释放COM环境。

  5.2.2 套接字

  1、在程序开始时必须调用函数WSAStartup初始化环境。

  2、在程序结束必须调用函数WSACleanup释放资源。

  5.2.3 对话框

  1、模态对话框:通过函数DoModal创建并自动显示,只要点击”关闭”按纽就可以销毁对话框。

  2、非模态对话框:通过Create创建,然后通过ShowWindow函数显示,点击“关闭”按纽时,还要调用函数DestroyWindow才能销毁对话框。

  5.2.4 自定义消息函数的实现步骤

  1、定义自定义消息:#define WM_HELLO WM_USER+1

  2、定义消息处理函数原型: Afx_msg void OnHello()

  3、消息映射:ON_MESSAGE(WM_HELLO,OnHello)

  4、实现消息处理函数:void OnHello(){}

  5、通过PostMessage函数可以消息给指定程序处理:这里可以发送WM_HELLO消息,从而调用OnHello()。

  5.2.5 线程

  1、通过函数AfxBeginThre函数开启一个线程,threadFun是线程处理函数:AfxBeginThread((AFX_THREADPROC )threadFun , (LPVOID)this )

  2、实现线程处理函数如下面:

  DWORD ThreadProc(LPVOID p)

  {

  BOOL bTerminate=(CDLG)(* p)-> bTerminate;

  while (!bTerminate)

  {

  //your loop

  }

  }

  其中线程处理函数内部是死循环,IsTerminate是p的成员变量。

  3、结束线程:不能强制调用AfxEndThread函数结束进程,必须先结束死循环,使bTerminate=FALSE。

  5.2.6 获取本机IP

  1、通过gethostname函数获取主机名

  2、在通过gethostbyname函数获取保存主机信息的结构体hostent

  3、其中结构体hostent中的h_addr_list主机的所有IP

  5.2.7 Tab Control控件的使用

  1、先在主对话框IDC_TABTEST中添加Tab Control控件,命名为m_tab。

  2、在添加2个子对话框资源IDD_PARA1和IDD_PARA2,建立相应的CDialog类CPara1, CPara2,再中主对话框分别定义2个类对象CPara1 m_para1,CPara2 m_para2。

  3、在把m_para1, m_para2关联对应的对话框资源。

  m_para1.Create(IDD_PARA1,GetDlgItem(IDC_TABTEST));

  m_para2.Create(IDD_PARA2,GetDlgItem(IDC_TABTEST));

  4、获取主对话框获得客户区大小

  CRect rs;

  m_tab.GetClientRect(&rs);

  5、子对话框移动到指定位置

  m_para1.MoveWindow(&rs);

  m_para2.MoveWindow(&rs);

  6、分别设置隐藏和显示,这样只有一个对话框能被我们看到和操作

  m_para1.ShowWindow(true);

  m_para2.ShowWindow(false);

  7、获取Tab Control控件的标签号

  int CurSel = m_tab.GetCurSel()

  8、切换标签,轮流显示各个窗口

  switch(CurSel)

  {case 0:

  m_para1.ShowWindow(true);

  m_para2.ShowWindow(false);

  break;

  case 1:

  m_para1.ShowWindow(false);

  m_para2.ShowWindow(true);

  break;}

  5.2.8 IP

  在IP层传输的分组叫做IP分组,其分组格式如图5-1所示:

  图5-1 IP结构

  部分字段介绍:

  总长度:定义IP分组总长度,最大为65535字节。

  协议:定义IP分组封装的高层协议。

  本系统定义IP结构替如下:

  typedef struct _IPHEADER {

  unsigned char header_len:4;

  unsigned char version:4;

  unsigned char tos;

  unsigned short total_len;

  unsigned short ident;

  unsigned short flags;

  unsigned char ttl;

  unsigned char proto;

  unsigned short checksum;

  unsigned int sourceIP;

  unsigned int destIP;

  }IPHEADER

  5.2.9 UDP

  本系统定义UDP结构替如下:

  struct UDPPacketHead {

  WORD SourPort;

  WORD DestPort;

  WORD Len;

  WORD ChkSum;

  }

  5.2.10 TCP

  本系统定义TCP结构替如下:

  struct TCPPacketHead {

  WORD SourPort;

  WORD DestPort;

  DWORD SeqNo;

  DWORD AckNo;

  BYTE HLen;

  BYTE Flag;

  WORD WndSize;

  WORD ChkSum;

  WORD UrgPtr;

  }

  5.2.11 ICMP

  本系统定义ICMP结构替如下:

  struct ICMPPacketHead {

  BYTE Type;

  BYTE Code;

  WORD ChkSum;}

  5.3 界面的实现

  本章介绍了整个系统在实现过程中的核心部分。附加的一些代码来说明代码实现过程,还有插图介绍了系统的操作界面。

  5.3.1 主界面

  当运行程序,首先出现的是主程序界面。

  菜单栏包括“文件”,“日志”,“帮助”。

  标签控件有两个选项:IP包和选项。

  窗口的状态栏分为3段,最右边会不断闪烁字符窜“欢迎使用”。

  图5-5 主界面

  当主程序运行时,系统不仅创建了上面的窗口,而且开启了线程监听网络上的数据包功能,主要通过原始套接字实现。

  1、通过WSASocket函数建立原始套接字。

  2、通过gethostname函数和gethostbyname函数获取IP。

  3、通过bind函数使套接字和主机某个IP和某个端口绑定。

  4、通过WSAIoctl设置一个套接口的模式。

  5、开启捕获数据的线程处理函数,并将捕获的数据包在列表视图中显示。

  6、通过closesocket函数关闭套界字。

  5.3.2 显示数据包具体内容

  此功能时实现过程:拥有列表视图子的对话框先捕获右键点击的列表项所有项的内容,再发送消息给主窗口函数处理。主窗口中该消息函数再创建一个新的对话框,把传送过来的数据,添加到该文本里。

  数据包的内容左边以16进制显示,右边则以ASCII表示。即避免部分字符无法用ASCII表示,又比起单纯只使用16进制更容易理解。

  5.3.3 数据包捕获设置

  数据包捕获设置界面如图5-7所示:

  图5-7 数据包捕获设置图

  此选项可以设置观察流过哪个IP的数据包,某些数据包内容是否为空,观察源数据包地址的端口和IP,目的数据包的IP和端口。

  默认情况下显示所有经过IP的数据包。如果设置数据包内容为空,则忽略此项。当源(目的)IP地址为空或0.0.0.0,忽略此项。当源(目的)端口号为0时,也忽略此项,否则只显示符合我们设置要求的数据包。

  对数据包是否符合要求的判断,在socket开启的线程函数捕获完整一个数据包之后,再进行判断。如果符合要求则显示在列表视图中,否则忽略。

  5.3.4 日志规则设置

  点击“日志”下“设置规则”。

  列表视图把从数据库sniff.mdb中日志规则表install读出的规则显示出来,即显示以有的规则。

  对话框的下半部分用来指定规则。规定要监视源地址IP,源地址端口,目的地址IP,目的地址端口,危害等级(从0级到5级,越高危害越大),说明项中则表明指定这个规则的理由或符合这个要求的数据包有什么危害。

  点击“增加”按纽,把以上的自定义规则加入到install日志规则表中。

  点击“删除”按纽,把列表视图中选中的日志规则删除。

  点击“取消”按纽,关闭此窗口。

  5.3.5 日志管理

  点击“日志”下“查看日志”

  列表视图把从数据库sniff.mdb中数据包表packet读出的数据包显示出来,即显示已记录的数据包。

  右键单击弹出菜单,选项有”删除”(只删除选中的项),”删除所有”(删除所有的项)。这种删除是从数据库彻底删除,而不仅仅只是从列表视图中删除。

  表packet的数据哪来的呢:主窗口初始化时,先读取表install取出其中所有规则并保存。然后在socket开启的线程中,每个读到的数据包与这些规则比较符合要求的存入数据库。

  6 结束语

  本文介绍了一种在VC++平台下设计并实现网络监控系统的全过程。通过分析比较流行的网络监控系统开发技术,该系统的特点,提出在socket基础上使用VC++开发工具实现网络监控系统的解决方案。基于VC++的智能卡网吧管理系统设计方法设计过程清晰、层次清楚,有利于系统的扩展、升级, 有利于系统的维护及测试工作。

  本文首先阐述了系统的分析和设计采用的相关技术及其特点,其次阐述系统的总体结构与系统的各个功能模块包括数据包管理、数据包设置,日志管理,日志设置等。

  但在设计当中由于水平的限制,出现了很多问题无法解决,希望老师们能加以谅解。相信我在毕业设计期间扎扎实实,勤勤恳恳的态度,能够带来好的设计作品。

  通过半个多学期的毕业设计生活,我学到了许多书本上学不到的知识,增强了自己的动手能力。让我更坚信了一个道理,要想成功,不仅要有成功的欲望,更要有为了成功不顾一切的奋斗,要持之以恒。

移动版:论办公自动化网络安全系统的设计与实现

本文标签: