摘要: http://welfear.blogspot.com/2009/02/tdi.html目录0 介绍0.1 TDI驱动作用0.2 Windows NT网络总体结构1. 过滤设备1.1 绑定目标1.2 分发函数1.3 过滤地址1.4 过滤内容1.4.1 过滤HTTP1.4.2 过滤DNS2. VISTA网络结构3. 驱动代码分析3.1 主要数据结构分析3.2 主要算法分析4. 附属内容4.1 HTTP协议GET请求数据4.2 HTTP协议POST请求数据0. 介绍0.1 TDI驱动作用TDI协议驱动主要应用于版本号在nt4至nt5之间的操作系统,本文档对TDI驱动的分析主要参考nt4所提供的TD 阅读全文
posted @ 2013-01-15 13:31 himessage 阅读(3299) 评论(0) 推荐(0) 编辑
摘要: http://blog.sina.com.cn/s/blog_539dee350100nekw.html TDI驱动在内核模式下工作,本来想写一个TDI的过滤驱动,主要过滤TDI_SEND和TDI_RECEIVE包,TDI_SEND部分很容易写,通过双机调试,很快就找到了数据位置,不过这一点并不是那么显而易见,我在网上找过的资料就没有一处说明了数据的具体位置,不知道那些人怎么想的,而微软的ddk资料上对irp是不完全文档说明,省略了很多关键部位的说明。TDI_RECEIVE颇费手脚,我在TDI_RECEIVE处下断,一直都等不到返回的数据,折腾了两天,查了很多资料,后来才恍然大悟,我下断的地. 阅读全文
posted @ 2013-01-15 13:17 himessage 阅读(893) 评论(0) 推荐(0) 编辑
摘要: http://blog.csdn.net/charlesprince/article/details/5924376 TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析,记录和管理,可以实现非常强大的管理功能,这里就将讨论它的设计架构,和具体实现的方法。 进行系统级网络数据包的过滤,很明显,第一步需要在系统内核中截取到网络数据包,那么在WINDOWS平台下,应该如何实现这样的功能? 在WINDOWS内核中,数据的通信载体是IRP包,如果希望截取到IRP数据包,当然必须生成核模块以驱动的方式加载至内核之中。如果只是需要用来进行IRP数据包的截取,进而进行... 阅读全文
posted @ 2013-01-15 11:18 himessage 阅读(5549) 评论(1) 推荐(1) 编辑
摘要: http://hi.baidu.com/combojiang/item/fe7ee5147f64a621f6625c0e步骤8:关闭句柄这个函数被两个句柄调用,传输句柄和上下文句柄。NTSTATUS TdiFuncs_CloseTdiOpenHandle(HANDLE hTdiHandle, PFILE_OBJECT pfoTdiFileObject){ NTSTATUS NtStatus = STATUS_SUCCESS; /* * De-Reference the FILE_OBJECT and Close The Handle */ ObDereferenceObject(pfoTdiF 阅读全文
posted @ 2013-01-15 11:10 himessage 阅读(715) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/d0287ca509180ddf5bf19132同样的使用TDI_RECEIVE来完成数据接收。然而我们却没有用它来实现。实际上,如果你注意到,你可以创建回调来通知你数据或者其他事件什么时候到达。这就是我们所做的。我实现了一个API包装函数来创建任意的事件句柄。如下:NTSTATUS TdiFuncs_SetEventHandler(PFILE_OBJECT pfoTdiFileObject, LONG InEventType, PVOID InEventHandler, PVOID InEventContext){ NT 阅读全文
posted @ 2013-01-15 11:09 himessage 阅读(677) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/edb1fb995490c48d5814610e步骤6:断开连接这里没有特别的,就是实现TDI_DISCONNECT IOCTL来断开连接。NTSTATUS TdiFuncs_Disconnect(PFILE_OBJECT pfoConnection){ NTSTATUS NtStatus = STATUS_INSUFFICIENT_RESOURCES; PIRP pIrp; IO_STATUS_BLOCK IoStatusBlock = {0}; PDEVICE_OBJECT pTdiDevice; TDI_CONNEC 阅读全文
posted @ 2013-01-15 11:09 himessage 阅读(362) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/778f34ad3c88e9ac29ce9d32接上步骤2:打开连接上下文第二步是打开连接上下文。在你建立的连接中,执行后续的操作会用到这个句柄。这也是由ZwCreateFile完成,也是在相同的设备"\Device\Tcp"上执行。实际上这个设备允许你打开三个不同的句柄。这三个句柄是传输句柄,连接上下文句柄和控制句柄。需要注意一个常犯的错误的是,一个句柄打开成功,但实际上确是一个错误打开的句柄。这是由于他们是由"Extended Attributes"来决定打开哪个句柄的。显然,如 阅读全文
posted @ 2013-01-15 11:08 himessage 阅读(882) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/623461f6f690a6b031c19932接上步骤4:连接创建一个TCP连接的客户端,我们需要连接。NTSTATUS TdiFuncs_Connect(PFILE_OBJECT pfoConnection, UINT uiAddress, USHORT uiPort){ NTSTATUS NtStatus = STATUS_INSUFFICIENT_RESOURCES; PIRP pIrp; IO_STATUS_BLOCK IoStatusBlock = {0}; PDEVICE_OBJECT pTdiDevice; 阅读全文
posted @ 2013-01-15 11:08 himessage 阅读(353) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/07a100ef4662a0225a2d640e步骤5:发送和接收数据为了发送数据,你只需创建一个TDI_SEND IOCTL,然后把它传送给传输设备。下面的代码实现了数据发送。NTSTATUS TdiFuncs_Send(PFILE_OBJECT pfoConnection, PVOID pData, UINT uiSendLength, UINT *pDataSent){ NTSTATUS NtStatus = STATUS_INSUFFICIENT_RESOURCES; PIRP pIrp; IO_STATUS_BL 阅读全文
posted @ 2013-01-15 11:08 himessage 阅读(538) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/e0e610dcfce00413e0f46f0e接上:传输设备接口 前面socket知识的了解是为了让你对TDI API做好准备。传输设备接口是一组用于驱动中, 与传输协议驱动通讯的API. 就像TCP。传输驱动实现了这组API,所以你的驱动能够与它通讯。 这比socket的使用多少有些复杂。MSDN上的文档资料会让你更加迷惑,而不是有帮助。所以我们将一步一步地建立一个客户端连接。一旦你理解了这个,你就能够使用这些API来执行其他的操作,例如创建一个服务端等等。体系结构 下图描述了TDI/NDIS的关系。通常,TDI... 阅读全文
posted @ 2013-01-15 11:01 himessage 阅读(1370) 评论(0) 推荐(0) 编辑
摘要: http://hi.baidu.com/combojiang/item/635f7c0d3b3c2b14addc700e理论: 本篇的题目有点容易让人误解。出于演示目的,我们写一个TDI客户端,但这并不是我们本篇的目的所在。本篇意在进一步探究怎样处理irp和怎样与之交互。本篇将会介绍怎样排队和处理要取消的IRP. 本篇真正的题目应该是“IRP处理介绍“,然而它不是一个非常引人注意的名字。并且我们的这个题目并不完全是一个谎言,因为我们会把TDI客户端驱动作为一个演示实现。所以我们不得不介绍一下这部分的实现。这个例子是一个非常简单的客户端/服务器通讯的程序,我们将通过它来揭示IRP的处理。套接字. 阅读全文
posted @ 2013-01-15 10:49 himessage 阅读(848) 评论(0) 推荐(0) 编辑