优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

050_Windows个人防火墙

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:

5 核心功能的代码实现
本课题的核心功能实现封装在DLL里面。下面分析DLL的主要内容。
5.1 DLL的封包截获
BOOL WINAPI DllMain是DLL的入口函数,系统调用时的标准接口。做一些初始化工作。主要工作是得到调用这个程序的进程路径和名称并设置DLL调用次数的计数器。
WSPStartup是Windows Sockets应用程序调用SPI的初始化函数。是服务提供者的标准入口函数。这里的工作是根据lpProtocolInfo找出已经被替换的服务提供者路径,然后加载,并利用被替换服务提供者的WSPStartup得到30个服务函数指针。需要先保存这些函数指针,然后将lpProcTable结构中的30个服务函数指针都设置成自己的。这样,相应的函数请求会首先经过我们自己的函数,然后用这些函数可以做适当的处理,再调用原来的,将请求转发,完成整个通信。
int WSPAPI WSPStartup(
WORD wVersionRequested,
LPWSPDATA lpWSPData,
LPWSAPROTOCOL_INFOW lpProtocolInfo,
WSPUPCALLTABLE upcallTable, 【买计算机毕业论文就到计算机毕业论文网】
LPWSPPROC_TABLE lpProcTable
)
{
ODS(_T("WSPStartup..."));
if(!m_CheckAcl.m_bIsWin9x && m_CheckAcl.CheckStartup() == XF_QUERY && !QueryAccess()) think58

[资料来源:http://THINK58.com]

return SOCKET_ERROR;
TCHAR sLibraryPath[512];
LPWSPSTARTUP WSPStartupFunc = NULL;
HMODULE hLibraryHandle = NULL;
INT ErrorCode = 0;
if(!GetHookProvider(lpProtocolInfo,sLibraryPath)|| (hLibraryHandle =LoadLibrary(sLibraryPath))==NULL||(WSPStartupFunc=(LPWSPSTARTUP)GetProcAddress(hLibraryHandle, "WSPStartup")) == NULL)
return WSAEPROVIDERFAILEDINIT;
if((ErrorCode=WSPStartupFunc(wVersionRequested,lpWSPData,lpProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS)
return ErrorCode;
if( !lpProcTable->lpWSPAccept ||
!lpProcTable->lpWSPAddressToString ||
!lpProcTable->lpWSPAsyncSelect ||
!lpProcTable->lpWSPBind ||
!lpProcTable->lpWSPCancelBlockingCall ||
!lpProcTable->lpWSPCleanup ||
!lpProcTable->lpWSPCloseSocket ||
!lpProcTable->lpWSPConnect ||
!lpProcTable->lpWSPDuplicateSocket ||
!lpProcTable->lpWSPEnumNetworkEvents ||
!lpProcTable->lpWSPEventSelect || think58 [资料来源:http://www.THINK58.com]
!lpProcTable->lpWSPGetOverlappedResult ||
!lpProcTable->lpWSPGetPeerName ||
!lpProcTable->lpWSPGetSockName ||
!lpProcTable->lpWSPGetSockOpt ||
!lpProcTable->lpWSPGetQOSByName ||
!lpProcTable->lpWSPIoctl ||
!lpProcTable->lpWSPJoinLeaf ||
!lpProcTable->lpWSPListen ||
!lpProcTable->lpWSPRecv ||
!lpProcTable->lpWSPRecvDisconnect ||
!lpProcTable->lpWSPRecvFrom ||
!lpProcTable->lpWSPSelect ||
!lpProcTable->lpWSPSend ||
!lpProcTable->lpWSPSendDisconnect ||
!lpProcTable->lpWSPSendTo ||
!lpProcTable->lpWSPSetSockOpt ||
!lpProcTable->lpWSPShutdown ||
!lpProcTable->lpWSPSocket ||
!lpProcTable->lpWSPStringToAddress )
return WSAEINVALIDPROCTABLE;
EnterCriticalSection(&gCriticalSection);
NextProcTable = *lpProcTable;
lpProcTable->lpWSPSocket = WSPSocket;
lpProcTable->lpWSPCloseSocket = WSPCloseSocket;
lpProcTable->lpWSPConnect = WSPConnect; think58好,好think58 [来源:http://www.think58.com]
lpProcTable->lpWSPAccept = WSPAccept;
lpProcTable->lpWSPSend = WSPSend;
lpProcTable->lpWSPSendTo = WSPSendTo;
lpProcTable->lpWSPRecv = WSPRecv;
lpProcTable->lpWSPRecvFrom = WSPRecvFrom;
//以上是我们截获并要用自己定义的函数。
LeaveCriticalSection(&gCriticalSection);
return 0;
}
XfIoControl是供EXE调用的。用来设置DLL的配置信息和得到DLL的反馈信息,这个函数为EXE提供接口,EXE通过这个函数来设置工作模式,或得到截获的网络封包信息。
QueryAccess是在应用程序提交连网请求时,如果发现控管规则中没有关于这个应用程序的控管规则,并且工作模式为询问,则向拥护发出询问,是否让这个程序通行。
GetHookProvider用来读取注册表得到系统的SPI的DLL路径和文件信息。这个信息是安装时自己写入的。根据pProtocolInfo信息取出自己保存的、已经被本程序替换的服务提供者路径。
GetRightEntryIdItem是供GetHookProvider()调用的扩展函数,用来得到保存系统服务提供者路径的注册表键名。及得到已经被本程序替换的服务提供者的dwCatalogEntryId。
XfShutdown调用系统服务提供者函数WSPShutdown,关闭一个Socket连接。并设置相应的错误代码。

think58好,好think58 [来源:http://think58.com]


截获的服务提供者函数:
过滤WSPSocket。WSPSocket是用来创建Socket的函数,首先调用底层函数得到新创建的Socket,然后设置新建Socket的协议信息,并调用自定义函数CheckSocket为这个Socket建立Session,然后保存相应的信息。
过滤WSPCloseSocket。转发之前首先调用自定义函数CheckCloseSocket删除相应的Session。
过滤WSPConnect。当一个Socket建立连接后调用这个函数,转发之前先调用访问控制函数CheckConnect,检查是否放行。如果不放行,返回错误;如果放行,调用底层WSPConnect函数进行转发。
过滤WSPAccept。用来接受一个连接请求。首先调用底层函数,然后对连接的合法性进行检查,如果不允许通过,关闭这个连接
过滤WSPSend。这个函数用来发送面向连接的数据,先检查是否允许通过,然后进行转发。
过滤WSPSendTo。这个函数用来发送面向无连接的数据,先检查是否允许通过,然后进行转发。
过滤WSPRecv。这个函数用来接收面向连接的数据。首先判断是不是重叠操作并且设置回调函数。如果设置,则用自定义函数AddOverlapped保存参数信息,然后用自己的回调函数代替原来的并转发。转发后根据返回值判断操作是否成功,如果成功,则调用控管函数对操作的合法性进行判断;否则直接返回。 内容来自think58

[资料来源:www.THINK58.com]


过滤WSPRecvFrom。这个函数用来接收面向连接的数据。首先判断是不是重叠操作并且设置回调函数。如果设置,则用自定义函数AddOverlapped保存参数信息,然后用自己的回调函数代替原来的并转发。转发后根据返回值判断操作是否成功,如果成功,则调用控管函数对操作的合法性进行判断;否则直接返回。
5.2 DLL的访问控管
编写一个CCheckAcl。它封装了一组对访问权限进行控制的函数。访问权限主要是由控管规则设置决定。另外还封装了一组网络封包操作函数。下面是一些主要函数及相应代码。
5.2.1 对服务提供者函数做管制的函数
CheckStartup:应用程序连网前的访问控制权限。在服务提供者函数WSPStartup中对访问权限进行控制。WSPStartup是Winsock 2 SPI入口函数,每个应用程序连网时调用且仅调用一次这个函数。
CheckSocket:检查WSPSocket函数,Socket用来创建Socket,在Socket创建时没有必要进行控管,所以仅仅用来创建Session并保存协议信息。
CheckCloseSocket:WSPCloseSocket函数的预处理函数,用来删除相应的Session。
CheckConnet:检查连接是否合法。在服务提供者函数WSPConnet调用系统WSPConnet函数建立之前,用CheckConnet调用SetSession填充一些网络封包信息,然后调用GetAccessInfo判断这个连接是否被允许通过。 内容来自think58
[版权所有:http://think58.com]

CheckAccept:检查是否允许接受这个Socket连接。在服务提供者函数WSPAccept调用系统函数WSPAccept接受一个Socket连接后,用CheckAccept调用SetSession设置网络封包信息,然后调用GetAccessInfo检查这个Socket连接是否允许通过。
CheckSend:在发送面向连接的数据前检查是否放行。在服务提供者函数WSPSend调用系统函数WSPSend发送数据前,用CheckSend调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个发送操作通过。
CheckSendTo:在发送面向连接的数据前检查是否放行。在服务提供者函数WSPSendTo调用系统函数WSPSendTo发送数据前,用CheckSendTo调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个发送操作通过。
CheckRecv:在接收面向连接的数据时检查是否放行。在服务提供者函数WSPRecv调用系统函数WSPRecv发送数据后,用CheckRecv调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个接收操作通过。
CheckRecvFrom:在接收面向连接的数据时检查是否放行。在服务提供者函数WSPRecvFrom
调用系统函数WSPRecvFrom发送数据后,用CheckRecvFrom调用SetSessionEx和GetProtocolInfo设置网络封包信息,然后调用GetAccessInfo检查是否允许这个接收操作通过。 [资料来源:http://think58.com]
5.2.2 封包处理函数
InitializeSession 对网络封包记录进行初始化。
CreateSession 创建一个新的网络封包记录。根据参数s和nProtocol得出协议信息,并将时间和应用程序信息一并写进这个新建的网络封包记录里。
DeleteSession 从已有的网络封包记录中删除一条。在删除之前首先调用SendSessionToApp函数,将需要删除的记录发送给EXE。
FinallySession将所有没有结束的网络封包记录全部发送到EXE中,有EXE显示在封包监视界面上。
SendSessionToApp将传递过来的网络封包记录保存到进程间的共享变量里,然后通过消息告诉EXE从变量中取出封包。
GetSessionAndSetSessionNullEXE用来得到封包数据并在得到后将缓冲区清空。
本文来自think58 [资料来源:www.THINK58.com]