当前位置: 首页 > news >正文

对网站二次开发的认识营销网站建设情况调查问卷

对网站二次开发的认识,营销网站建设情况调查问卷,工商注册咨询电话24小时人工服务,玉泉路网站建设分层服务提供者(LSP)(1) 开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看 LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它 1. 运行原理 用户创建套接字 1) 套接字创建函数(如socket)在Winsock目录寻找合适的协议 2) 此协议… 分层服务提供者(LSP)(1) 开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看 LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它 1. 运行原理 用户创建套接字 1) 套接字创建函数(如socket)在Winsock目录寻找合适的协议 2) 此协议的提供者导出的函数完成各种功能 我们的目的: 1) 将自己编写的提供者安装到Winsock目录中,让用户调用我们的服务提供者 2) 由我们的提供者调用下层提供者 就可以截获所有的Winsock调用 服务提供者本身是DLL,导出与Windows API相对应的函数,如WSPStartup,WSPSocket,WSPSendTo等. 这里的LSP向上导出所有的SPI函数供Ws2_32.dll调用,在内部又通过基础服务提供者实现这些SPI 2. 安装LSP 实现LSP之前,将分层提供者安装到Winsock目录,安装一个LSP包括安装一个WSAPROTOCOL_INFOW结构(协议的入口),让创建套接字的应用程序可以枚举到它. WSAPROTOCOL_INFOW结构:定义了分层提供者的特性和LSP是如何填写链的. (1) 协议链LSP和基础提供者连在一起形成了协议链,协议链描述了分层提供者加入Winsock目录的顺序. SPI提供三中协议:分层协议,基础协议,协议链 协议类型由WSAPROTOCOL_INFOW结构内的WSAPROTOCOLCHAIN结构中数据指定,如下: typedef struct _WSAPROTOCOLCHAIN { int ChainLen;                                                    // 链的大小,也就是下面数组的大小 DWORD ChainEntries[MAX_PROTOCOL_CHAIN];     // 协议链入口数组,数组成员为链中协议的目录ID号 } WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN; ChainLen暗示了入口的提供者类型  0, 分层协议 1, 基础协议(基础提供者,如TCP和UDP提供者,有与之关联的内核模式协议驱动TCPIP.SYS) 2, 协议链(目录ID-WSAPROTOCOL_INFOW结构中的dwCatalogEntryId域) LSP在协议链中位置的影响: 顶层:被Ws2_32.dll加载 非顶层:被链中位于它上层的LSP加载 LSP被加载后的动作: 1) 首先调用LSP导出的函数WSPStartup 2) 将包含协议链的WSAPROTOCOL_INFOW结构传递给这个函数 3) LSP再找到协议链中位于自己下方的提供者,进而加载它 安装LSP 1) 安装一个分层协议,用系统分配给此协议的目录ID和下层提供者的目录ID构建一个ChainEntries数组,进而构建一个WSAPROTOCOL_INFOW结构 2) 安装协议链 (2)安装函数该函数只需提供LSP的GUID,DLL位置,描述它支持的协议的一个或多个WSAPROTOCOL_INFOW结构即可 int WSCInstallProvider(   const LPGUID lpProviderId,                                    // 要安装的提供者的GUID   const LPWSTR lpszProviderDllPath,                           // 指向提供者DLL的路径   const LPWSAPROTOCOL_INFO lpProtocolInfoList,        // 指向一个WSAPROTOCOL_INFOW结构数组   DWORD dwNumberOfEntries,                                    // lpProtocolInfoList数组中入口的数量,即数组大小   LPINT lpErrno                                                        // 返回可能的失败代码 );                                                                          // 只有UNICODE版本,失败则返回SOCKET_ERROR lpProviderId: GUID可以通过命令行工具UUIDGEN或者编程中是用UuidCreate函数生成. lpszProviderDllPath: UNICODE字符串,包含环境变量.如 %SYSTEMROOT% lpProtocolInfoList: WSAPROTOCOL_INFOW结构的数组,每个数组成员是一个要安装的单独的入口,即可一次安装多个服务提供者 通常从它要分层的下层提供者拷贝,两种情况例外:     第一,szProtocol域要修改,以包含新提供者的名称     第二,如有XP1_IFS_HANDLES标志,从dwServiceFlags1域中移除             XP1_IFS_HANDLES标志表示此提供者返回的句柄是真正地操作系统句柄,可能会被传递到内部API.此提供者必须关联内核模式组件,创建TCPIP.SYS一样的句柄. (3) 重新为目录排序 int WSCWriteProviderOrder(   LPDWORD lpwdCatalogEntryId,    // WSAPROTOCOL_INFOW结构中的CatalogEntryId元素数组   DWORD dwNumberOfEntries        // 上面数组的大小 ); lpwdCatalogEntryId: DWORD类型数组,以新的顺序包含了目录中每个提供者的目录入口. 这个函数定义在SPORDER.H和SPORDER.LIB库中,新的SDK中,定义转移到WS2_32.LIB中 总结: 1) 安装分层协议入口,获取系统分配的目录ID号 2) 安装一个或多个协议链,安装数量根据要分层的下层协议数量决定,如要把LSP安装在TCP,UDP和Raw之上,就要安装3个协议链. (4) 示例代码 // 函数名 InstallProvider// 参数:WCHAR* wszDllPath,为安装的LSP DLL路径地址// 功能:将LSP安装到UDP协议之上// 返回值: 错误值// 步骤// 1. 枚举所有的服务程序提供者,当发现其iAddressFamily AF_INET和iProtocol IPPROTO_UDP停止// 2. 得到该协议信息,为WSAPROTOCOL_INFOW结构// 3. 安装分层协议,根据上面得到的结构修改szProtocol,ChainLen,dwProviderFlags// 5. WSCInstallProvider安装// 6. 获取分层协议的目录ID号,根据ProviderId成员的判断得到该ID号// 7. 安装协议链,原UDP的协议放在分层协议下层,协议链取新名,注意协议链与分层协议是两者不相关的// 8. 重新排序Winsock目录,将我们的协议链提前//    首先先查找协议链,找到ChainEntries[0]该分层协议的协议链,放在第一个位置//    而后添加其他基本协议(包括分层协议)或ChainEntries[0]不等于该分层协议的协议链 3. 移除LSP 传递要移除的提供者的GUID即可int WSCDeinstallProvider(  LPGUID lpProviderId,  LPINT lpErrno);首先根据分层协议的GUID号找到其目录ID号,然后逐个移除各协议链,最后再移除分层协议的提供者. // 函数名: InstallProvider// 功能: 移除该LSP// 找到协议链和协议,移除// 1. 根据协议的GUID找到dwCatalogEntryId,然后根据这个找到ChainEntries[0]等于该ID的协议链// 2. 移除协议和协议链 4. 编写LSP Winsock2 LSP实现在标准的Windows DLL中, 每个LSP必须实现和导出WSPStartup函数,函数原型如下: int WSPStartup(   WORD wVersionRequested,                    // 调用者可以使用的Winsock SPI的最高版本号, 高字节是小版本号   LPWSPDATA lpWSPData,                        // 指向一个WSPDATA结构, 用于取得Winsock服务提供者的详细信息   LPWSAPROTOCOL_INFO lpProtocolInfo,    // 指向一个WSAPROTOCOL_INFO结构,用来指定想得到的协议特征   WSPUPCALLTABLE UpcallTable,                // Ws2_32.dll提供的向上调用转发的函数表结构   LPWSPPROC_TABLE lpProcTable                // 指向SPI函数表结构的指针, 用来返回30个SPI服务函数 ); 其他的SPI函数都经由LSP的分派表----pProcTable参数导出,描述分派表的WSPPROC_TABLE结构定义了必须在LSP实现的函数,原型如下 typedef struct _WSPPROC_TABLE {   LPWSPACCEPT  lpWSPAccept;   LPWSPADDRESSTOSTRING  lpWSPAddressToString;   LPWSPASYNCSELECT  lpWSPAsyncSelect;   LPWSPBIND  lpWSPBind;   LPWSPCANCELBLOCKINGCALL  lpWSPCancelBlockingCall;   LPWSPCLEANUP  lpWSPCleanup;   LPWSPCLOSESOCKET  lpWSPCloseSocket;   LPWSPCONNECT  lpWSPConnect;   LPWSPDUPLICATESOCKET  lpWSPDuplicateSocket;   LPWSPENUMNETWORKEVENTS  lpWSPEnumNetworkEvents;   LPWSPEVENTSELECT  lpWSPEventSelect;   LPWSPGETOVERLAPPEDRESULT  lpWSPGetOverlappedResult;   LPWSPGETPEERNAME  lpWSPGetPeerName;   LPWSPGETSOCKNAME  lpWSPGetSockName;   LPWSPGETSOCKOPT  lpWSPGetSockOpt;   LPWSPGETQOSBYNAME  lpWSPGetQOSByName;   LPWSPIOCTL  lpWSPIoctl;   LPWSPJOINLEAF  lpWSPJoinLeaf;   LPWSPLISTEN  lpWSPListen;   LPWSPRECV  lpWSPRecv;   LPWSPRECVDISCONNECT  lpWSPRecvDisconnect;   LPWSPRECVFROM  lpWSPRecvFrom;   LPWSPSELECT  lpWSPSelect;   LPWSPSEND  lpWSPSend;   LPWSPSENDDISCONNECT  lpWSPSendDisconnect;   LPWSPSENDTO  lpWSPSendTo;   LPWSPSETSOCKOPT  lpWSPSetSockOpt;   LPWSPSHUTDOWN  lpWSPShutdown;   LPWSPSOCKET  lpWSPSocket;   LPWSPSTRINGTOADDRESS  lpWSPStringToAddress; } WSPPROC_TABLE, FAR * LPWSPPROC_TABLE; 在DLL中实现函数表中的函数很简单,大多数情况下,只需要调用下层提供者导出的对应函数即可.当应用程序调用Winsock API时,Ws2_32.dll最终会调用特定服务提供者中对应的Winsock2 SPI函数来执行指定的功能.并非所有的函数都用SPI,如inet_addr,inet_ntoa等等.系统如何调用WSPStartup函数:1) 应用程序调用WSAStartup时,什么都不做2) 应用程序创建套接字时,准备调用提供者的WSPStartup.3) 系统在Winsock目录查找匹配的入口,找到后,加载提供者DLL,调用该WSAStartup函数WSPStartup函数的作用:1) 根据协议链找到下层提供者,调用它的WSPStartup函数初始化下层提供者,这是一个不断向下递归的过程2) 并取得SPI服务函数的指针,向上返回这些指针之前,可以用自定义的函数指针覆盖它.实现截获Winsock调用加载下层提供者:1) 根据lpProtocolInfo参数找到下层提供者的目录ID,再枚举所有提供者,找到下层提供者入口的WSAPROTOCOL_INFOW结构2) 加载下层提供者3) 使用函数WSCGetProviderPath函数得到提供者的DLL路径 int WSCGetProviderPath(   LPGUID lpProviderId,   LPWSTR lpszProviderDllPath,   LPINT lpProviderDllPathLen,   LPINT lpErrno ); 4) 由于DLL路径可能包含环境变量,用ExpandEnvironmentStrings函数将它展开 DWORD ExpandEnvironmentStrings(   LPCTSTR lpSrc,   LPTSTR lpDst,   DWORD nSize ); 5) 用LoadLibrary加载该DLL,调用GetProcAddress取得WSPStartup函数指针6) 调用该 WSPStartup函数初始化下层提供者之后可以根据自己的兴趣截获自己感兴趣的Winsock调用 5. LSP实例 主要是建立DLL文件,只导出函数 WSPStartup该函数主要部分为:1.  找到下层协议的WSAPROTOCOL_INFOW结构2.  下层入口ID3.  取得下层提供程序DLL路径4.  加载该DLL5.  导入下层提供程序的WSPStartup函数6.  调用下层提供者的WSPStartup函数7.  保存下层提供者的函数表8.  修改传递给上层的函数表实现自己的 WSPSendTo函数,然后在第八步用下句实现 lpProcTable-lpWSPSendTo WSPSendTo;
http://www.dnsts.com.cn/news/240728.html

相关文章:

  • 企业网站的建立网络虚拟社区时对于企业虚拟主机wordpress多站点
  • 鹤壁河南网站建设分销商城小程序开发
  • zencart外贸网站建设焦作网站开发
  • 地域文化创意产网站建设规则长沙低价网站建设
  • 石家庄晋州网站建设西宁建设网站价格低
  • 北京市朝阳区网站制作公司京津冀网站建设公司
  • 做短链的网站做一个网站难不难
  • 门户网站如何做谷歌seo上海网站建设空间
  • 百度站长工具如何使用雅安市建设网站
  • 重庆专业网站推广报价跨境电商怎么做无货源模式
  • 英文视频网站如何做外链制作表白网站的软件
  • 网站上传大马后怎么做春节彩灯制作公司
  • 我想建个自己的网站聊城高新区建设局网站
  • 天门市规划建设局网站如何做积分商城网站
  • 什么网站是用php做的宁波网站推广制作
  • 重庆云阳网站建设公司推荐青岛网络公司有哪些
  • asp网站变成php公司都是自己制作网站
  • 西安做网站的公司有网站百度不收录的原因
  • 做网站 客户大概会有那些问题山东省建设工程信息网站
  • mixkitcom素材网站买个天猫店多少钱一个
  • 上海网站关键词排名优化报价深圳公司视频制作
  • 美容院门户网站开发成都快速做网站
  • 谷歌官方网站登录入口丹阳建设工程管理处网站
  • 网站页面创意sns网站开发
  • 成都网站制作系统网站功能定位分析
  • 做微信头图的网站wordpress自定义小工具
  • 响应式网站开发遇到的问题wordpress搭建问题
  • 营销型网站建设吉林邢台市做网站电话
  • 物流百度推广怎么做网站南通市住房和城乡建设厅网站
  • 网站系统分析的步骤有哪些青山做网站