网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C# > 正文
Windows下网络数据报的监听和拦截技术
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/14
下载{$ArticleTitle}原创论文样式
供者来完成的。所

以我们通过适当的增加自己的分层协议服务提供者,使其位于SPI的顶端,那么就能将W

s2_32.dll传给服务提供者的数据报拦截下来。由于是MS的官方方法,具体的使用方法在

Platform SDK里面有详细的例子(LSP),在MSDN里面也有详细的解释。这种方法的优点

是能够获得调用Winsock的进程的详细信息,并能实现Qos和数据加密。所以SPI是用户态

数据拦截的较好地点。缺点同1

        4Windows2000包过滤接口。由于过滤规则限制太多不灵活而应用不多。

        5、网络监视器SDKMS官方的实时监视分析网络数据的方法。但是由于封装的太复?

?

使用起来不灵活。

 

        在核心态下,数据报的监视和拦截方法比较复杂,由于大多个人防火墙都是在核心?

?

实现的,所以在这里比较详细的叙述一下。具体的请参见nt/2kDDK文档。大概有下面几

个方法。

1     TDI过滤驱动程序TDI Filter Driver)。

2     NDIS中间层驱动程序NDIS Intermediate Driver)。编写IM DRIVERNDIS中间层

 

 

MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截。这是微软提供的

一种技术。在DDKMS提供了Passthru例子,很多中间层过滤驱动都可以由之改编。但编

写该过滤程序拦截程序非常的复杂,安装也很麻烦。

3     Win2k Filter-Hook Driver

4     NDIS Hook Driver。这种方法又有两种实现方式。

1)向NDIS注册假协议(fake protocol)。这是在协议层上的处理。在Windows内核中

,所有已注册的协议是通过一个单向的协议链表来维护的。这个单向链表保存了所有已

注册协议的NDIS_PROTOCOL_BLOCK结构的地址,在这个结构中保存了协议驱动所指定的相

应的派发函数的地址如RECEIVE_HANDLER等。

struct _NDIS_PROTOCOL_BLOCK

{

PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol

REFERENCE Ref; // contains spinlock for OpenQueue

UINT Length; // of this NDIS_PROTOCOL_BLOCK struct

NDIS50_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics;// handler addresses

 

struct _NDIS_PROTOCOL_BLOCK * NextProtocol; // Link to next

ULONG MaxPatternSize;

#if defined(NDIS_WRAPPER)

//

// Protocol filters

//

struct _NDIS_PROTOCOL_FILTER * ProtocolFilter[NdisMediumMax+1];

WORK_QUEUE_ITEM WorkItem; // Used during NdisRegisterProtocol to

// notify protocols of existing drivers.

KMUTEX Mutex; // For serialization of Bind/Unbind requests

PKEVENT DeregEvent; // Used by NdisDeregisterProtocol

#endif

};

typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLO

CK;并且,每个协议驱动还对应一个NDIS_OPEN_BLOCK的单向链表来维护其所绑定的网卡

信息。当协议驱动调用NdisRegisterProtocol之后,

EXPORT

VOID

NdisRegisterProtocol(

OUT PNDIS_STATUS Status,

OUT PNDIS_PROTOCOL_BLOCK NdisProtocolHandle, /*注意NDIS_HANDLE所指向的就是PN

DIS_PROTOCOL_BLOCK的结构,不要有什么怀疑。*/

IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,

IN UINT CharacteristicsLength

);

NDIS总是会把新注册的协议放在协议链表的表头并返回这张表,所以只要我们注册一个

新的协议通过新协议注册返回的链表头就可以轻而易举的遍历系统中所有协议表。但是

,如果要成功地挂接派发函数,还需要对协议所对应的NDIS_OPEN_BLOCK结构里的派发函

数进行挂接,因为NDIS并不是直接调用协议驱动在NDIS_PROTOCOL_CHARACTERISTICS

  • 下一篇资讯: C# Socket编程
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号