论文无忧网提供:计算机毕业论文范文|计算机毕业设计|计算机毕业论文
栏目导航 ASP Java Web .NET VB6.0 JAVA VC VF DELPHI PB 计算机网络 计算机科学与技术 PHP 安卓APP 其他 C# 代写论文
当前位置: > 计算机 > 计算机科学与技术 >

基于windows封包截获的实现(论文+程序)

3.2.功能概述

通过以上流程图可以得到XFILTER的主体功能为四部分:封包过滤,封包监视,控管规则设置和管制动作设置功能.

内容来自论文无忧网 www.paper51.com

3.2.1封包过滤功能

内容来自www.paper51.com

用户状态下在WINSOCK层上简单的进行数据包拦截,截获网络封包;然后进行过滤规则设置,包过滤的规则由应用程序选择,管制动作和进出方向组成,它涵盖对所有出入数据包的处理方法,其主要是依据包头信息如IP源地址和目的地址进行过滤。它将工作模式设置为询问,每当有新的应用程序想连接到网络首先弹出询问对话框,也就是管制动作设置对话框,Xfilter.dll(具体捕获过滤部分)根据工作模式和控管规则对过往封包进行过滤,Xfilter.dll将通过的网络封包记录下来并通知Xfilter.exe(界面部分)取走封包。 http://www.paper51.com

内容来自论文无忧网 www.paper51.com

图3-2 封包过滤 内容来自论文无忧网 www.paper51.com

3.2.2封包监视窗口功能

内容来自论文无忧网 www.paper51.com

提供封包监视界面和提供清空监视列表、停止/开始监控及停止/开始滚动功能。

内容来自www.paper51.com

3.2.3 控管规则设置窗口功能 paper51.com

控管规则设置窗口的功能包括手工添加、修改及删除控管规则、自学习添加控管规则和控管规则字段属性设置;其中控管规则属性设置字段包括的功能又包括应用程序选择功能、允许和放行应用程序的管制动作功能和进出方向控制功能 paper51.com

内容来自www.paper51.com

图3-3 控管规则设置

copyright paper51.com

3.3 各重要模块的设计与实现 paper51.com

3.3.1 模块接口定义和划分

http://www.paper51.com

Windows消息接口使一种特殊的接口形式,它是基于Windows操作系统的消息机制。这种接口形式适合于应用程序之间,例如在这里要用到的dll和exe程序之间的操作。应用程序是相对独立的模块,如果这两个模块需要通信,则消息接口就是一种理想的选择。这种接口类似于函数接口,只不过通过操作系统的消息机制来中转。 内容来自论文无忧网 www.paper51.com

根据以上对主体功能的分析,可以划分为4个模块,分别是封包过滤模块,控管规则模块,管制动作模块和封包监视模块。下面对各个模块进行实现。

copyright paper51.com

3.3.2 FILTER.DLL封包过滤模块

paper51.com

对封包进行过滤主要是对过往封包进行截获和利用控管规则设置进行合法性检查。

copyright paper51.com

要完成XFILTER.DLL的封包截获,首先要对WINDOWS SOCKETS应用程序调用SPI进行初始化,在这里我们调用WSPSTARTUP函数对Windows Socket应用程序调用初始化,这里主要是根据找出已经被替换的服务提供者路径。并利用被替换服务提供者的WSPStartup(封包过滤初始化函数)得到30个服务函数指针。然后将LPPROCTABL(指针参数)结构中的30个服务函数指针都设置成自己的。这样,相应的函数请求首先会经过我门自己的函数,然后用这些函数可以做适当的处理。 paper51.com

copyright paper51.com

图3-4 封包过滤

paper51.com

WSPSTARTUP 是WINDOWS SOCKETS 应用程序调用SPI 的初始化函数。开始根据LPPROTOCOLINFO(指针参数)的协议信息找出服务提供者的ID,然后根据ID取出INSTALL程序保存的系统SPI程序的路径和文件名,再用LOADLIBRAY加载系统SPL并用GETPROCADDRESS(获取提供者路径函数)得到系统SPI的WSPSTARTUP函数指针,然后用WSPSTARTUP函数将系统SPI的服务指针附值得到参数LPPROCTABLE,完成服务的中转,然后保存SPI服务函数指针,NEXTPROCTABL=*LPROCTABLE,最后将LPPROCTABL结构中的成员函数指针附值为自己程序中的服务函数,实现过滤;

copyright paper51.com

关键部分代码: http://www.paper51.com

intWSPAPI WSPStartup()

内容来自论文无忧网 www.paper51.com

...... copyright paper51.com

//用自定义函数GETHOOKPROVIDER得到已经被替换的提供者路径,然后用API函数LOADLIBRAY加载这个提供者,接着用GETPROCADDRESS得到WSPSTARTUP的函数指针//

内容来自www.paper51.com

if(!GetHookProvider(lpProtocolInfo, sLibraryPath)

paper51.com

          ||(hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL

内容来自www.paper51.com

          ||(WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(hLibraryHandle,"WSPStartup")) == NULL

paper51.com

          ) paper51.com

          returnWSAEPROVIDERFAILEDINIT;

内容来自论文无忧网 www.paper51.com

//调用被替换的提供者的WSPSTARTUP函数得到LPPROCTABLE里的函数指针

copyright paper51.com

if((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData, lpProtocolInfo,upcallTable, lpProcTable)) != ERROR_SUCCESS)

内容来自www.paper51.com

          returnErrorCode;

http://www.paper51.com

//保存被土换的提供者提供的30个函数指针 内容来自www.paper51.com

NextProcTable= *lpProcTable;

copyright paper51.com

//用参数LPPROCTABLE结构的服务函数指针设置自己的函数

内容来自论文无忧网 www.paper51.com

lpProcTable->lpWSPSocket              =WSPSocket;

copyright paper51.com

       lpProcTable->lpWSPCloseSocket          =WSPCloseSocket;

内容来自www.paper51.com

       lpProcTable->lpWSPConnect              =WSPConnect;

paper51.com

       lpProcTable->lpWSPAccept           =WSPAccept;

http://www.paper51.com

       lpProcTable->lpWSPSend                 =WSPSend;

http://www.paper51.com

       lpProcTable->lpWSPSendTo           =WSPSendTo; 内容来自www.paper51.com

       lpProcTable->lpWSPRecv                 =WSPRecv; 内容来自论文无忧网 www.paper51.com

       lpProcTable->lpWSPRecvFrom             =WSPRecvFrom;

copyright paper51.com

......

内容来自论文无忧网 www.paper51.com

要完成合法性检查,根据控管规则检查是否通行的类CCHECKACL.H和 CCHECKACL.CPP通过检查工作模式和控管规则得到截获服务提供者函数是否通行的状态。 内容来自www.paper51.com

 截获服务提供者的6个函数分别是WSPSOCKET,它的功能是调用系统SPI 服务函数WSPSOCKET产生一个SOCKET连接并调用CHECKSOCK检查应用程序访问权限。WSPCLOSESOCKET,它的功能是调用CHECKCLOSESOCKET关闭SOCKET前的处理,并调用系统SPI服务函数WSPCLOSESOCKET,关闭一个SOCKET连接。WSPCONNECT,它饿功能是调用CHECKCONNECT。检查是否允许连接通过,如果不能通过,切断连接,如果允许通过,调用SPI服务函数WSPCONNECT,建立一个SOCKET连接调用CHECKCONNECT。检查是否允许连接通过,如果不能通过,切断连接,如果允许通过,调用SPI服务函数WSPCONNECT,建立一个SOCKET连接调用CHECKCONNECT,检查是否允许连接通过,如果不能通过,切断连接,如果允许通过,调用SPI服务函数WSPCONNECT,建立一个SOCKET连接。WSPACCEPT,调用系统SPI服务函数WSPACCEPT,接受与外部SOCKET连接并调用CHECKACCEPT检查是否通过,如果不能通过,切断连接。WSPSEND和WSPSENDTO,调用CHECKSEND,检查是否允许连接通过,如果不能通过,切断连接,如果允许通过,调用服务提供者函数WSPSEND,发送相应数据包。WSPSEND是面向连接的数据发送函数,例如TCP。如果是UDP则调用WSPSENDTO面向无连接的数据发送函数。WSPRECV和 copyright paper51.com

WSPRECVFROM ,调用系统SPI服务函数WSPRECV接收相应数据包,并调用CHECKRECV,检查是否允许连接通过,如果不允许则切断连接,WSPRECV是面向连接接收函数,例如TCP ,如果是UDP 则是WSPRECVFROM面向无连接的接收函数。

paper51.com

3.3.3封包监视模块 paper51.com

要完成封包监视,首先模块由DLL抓取封包,然后由EXE界面显示。

copyright paper51.com

主要为XFILTER.DLL编写了一个CCHECKACL类对其进行处理,他封装了一组访问权限进行控制的函数和对服务提供者做管制的函数,其中就有封包处理函数,他包含获取封包信息的主要函数SENDSESSIONTOAPP(将传递过来的封包记录保存在进程变量里),FINDSESSION(在已存在的网络封包数据结构数组中寻找网络封包记录),GETSESSION(用来得到封包数据)和FINALLYSESSION(将所有网络封包数据全部发送到EXE中)等。

copyright paper51.com

 XFILTER.EXE是整个工程的用户界面部分,他需要与XFILTER.DLL实现对接,在XFILTER.EXE中,与XFILTER.dll直接通信的模块主要有2个,其中一个是主窗口模块MAINFRAME,他的作用是用来接收DLL发送过来的消息,然后对消息进行相应的处理。

http://www.paper51.com

要在界面中看到截获的网络封包信息,在MAINFRAME中的ONSESSIONNOTTIFICATION消息处理函数,用来处理XFILTER发送过来的封包信息,它接收发送过来的封包消息,根据消息从XFILTER.DLL取出封包数据并把封包数据发送到监视窗口中显示,如图3-5所示。 copyright paper51.com

copyright paper51.com

图3-5 封包监视

内容来自论文无忧网 www.paper51.com

封包监视窗口实时显示网络封包。网络封包由XFILTER.DLL捕获后发送消息到CMAINFRAME(主窗口函数),CMAINFRAME根据消息再从XFILTER.DLL的缓冲区取走封包数据,然后调用封包监视窗口的函数显示封包。

内容来自论文无忧网 www.paper51.com

关键代码: copyright paper51.com

LRESULT CMainFrame::OnSessionNotification(UINT wParam, LONGlParam)

内容来自论文无忧网 www.paper51.com

{

paper51.com

 //如果XFILTER的控制函数指针为NULL,则直接返回 paper51.com

    if(theApp.m_XfIoControl== NULL) copyright paper51.com

       returnXERR_SUCCESS;

copyright paper51.com

       XFILTER_IO_CONTROL   ioControl;

内容来自论文无忧网 www.paper51.com

    ioControl.isession   = wParam;

copyright paper51.com

    ioControl.session = new SESSION; paper51.com

//从XFILTER。DLL中取出封包数据

paper51.com

    theApp.m_XfIoControl(IO_CONTROL_GET_SESSION,&ioControl); http://www.paper51.com

//如果是空的封包则直接返回

内容来自论文无忧网 www.paper51.com

    if(ioControl.session->s== 0)

paper51.com

       returnXERR_SUCCESS; http://www.paper51.com

//调用封包监视窗口INSERTONLIST往列表中增加一条记录

内容来自www.paper51.com

    //如果还没创建则不显示 http://www.paper51.com

    CPacketMonitor::InsertOneList( 内容来自www.paper51.com

       CPacketMonitor::m_pListPacketMonitor,

内容来自论文无忧网 www.paper51.com

       ioControl.session,

http://www.paper51.com

       CPacketMonitor::IsMonitor,

copyright paper51.com

       CPacketMonitor::IsScroll

paper51.com

       ); http://www.paper51.com

    //释放封包缓冲区 

copyright paper51.com

delete(ioControl.session);

paper51.com

------分隔线----------------------------
联系方式