2012-11-27 24 views
0

我使用NdisRegisterProtocol()注册协议驱动程序,并使用_NDIS_OPEN_BLOCK_NDIS_PROTOCOL_BLOCK结构勾ReceivePacketHandler成功,使用MyRecivePacket()来代替NDIS接收分组的功能,当我打开一个网页,MyRecievePacket()将会运行。NDIS钩sendPacketsHandler

我的问题是: 当我打开一个网站使用IE(如www.stackoverflow.com),我怎么能勾SendPacketsHandler得到这个数据包并获得URL字符串www.stackoverflow.com。换句话说,如何在内核模式下捕获url。谢谢

回答

0

这不是你通常应该做的事情,URL数据属于网络堆栈的应用层,不应该被驻留在内核空间的低层访问。在这里可以看到Windows网络体系结构中的协议驱动程序分层的更多信息:http://msdn.microsoft.com/en-us/library/windows/hardware/ff571073(v=vs.85).aspx

但是,通过删除在协议驱动程序中位于协议驱动程序之上的数据包添加到数据包中的标头,如HTTP,TCP,IP等。您需要知道在通往协议驱动程序的路上应用于您的数据包的确切协议。对于每个底层,递增地添加标题,来自上述层的输入是不透明的数据块(其由上层数据和标题组成)。例如,你的数据包可能以一个纯数据开始,其中HTTP标题在开始时被添加,TCP标题在那之后,而IP标题在那之后。您需要按相反顺序删除标题以恢复原始数据。

注意,这并不总是可能的,因为下路中的协议可能会改变数据,例如,通过加密它。在这种情况下,您将无法通过执行反向操作(如解密)来提取原始数据。

0

有一些工具和技术,称为Deep Packet Inspection(DPI),用于在其丰富的应用层上解包传输的数据包,还有类似openDPI的库,甚至可以在内核域上使用它来跟踪数据包内容。

当您可以将网络数据包解包到应用程序层时,您可以更改其内容。你应该获得奖励,它不容易捕获和解开每个丢包你的网卡的数据包。

0

首先,我真不明白你想做的事...我的主要疑问是什么:

  • ¿你注册一个协议驱动程序,或挂钩以前存在的驱动程序的ReceivePacketHandler?这是非常不同的。

我假设你的目标只是拦截URL的,而不是钩住一个exise协议驱动程序。作为@icepack评论,使用procol驱动它不是'简单的方法'因为你应该跟踪所有的TCP连接来提取HTTP的东西。

但是,如果您必须使用NDIS,则应检查DDK的PassThru示例[1]或NDIS过滤器驱动程序[2]示例,并实施必要的逻辑以分析TCP协议和HTTP标头。

如果NDIS不是强制性的,那么使用TDI(不推荐使用,但仍然是功能[3])或WFP驱动程序[4]更简单的技术来拦截比TCP堆栈更高级别的通信。

[1] http://code.msdn.microsoft.com/windowshardware/NDISLWFSYS-Sample-NDIS-60-42b76875

[2] http://msdn.microsoft.com/en-us/library/windows/hardware/ff565501(v=vs.85).aspx

[3] http://technet.microsoft.com/en-us/library/cc939977.aspx

[4] http://msdn.microsoft.com/en-us/library/windows/hardware/gg463267.aspx