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 |