我使用NdisRegisterProtocol()注册一个协议驱动程序,并使用_NDIS_OPEN_BLOCK和_NDIS_PROTOCOL_BLOCK结构成功挂接ReceivePacketHandler,使用MyRecivePacket()代替NDIS接收包函数,当我打开一个网站时,就会运行MyRecievePacket()。
我的问题是:当我使用IE打开一个网站(如www.stackoverflow.com)时,我如何连接SendPacketsHandler来获得这个数据包和url www.stackoverflow.com字符串。换句话说,如何在内核模式下捕获url。谢谢
发布于 2012-11-27 23:20:16
这不是你通常应该做的事情,URL数据属于网络堆栈的应用层,不应该被驻留在内核空间中的较低层访问。有关Windows网络体系结构中的协议驱动程序分层的更多信息,请参阅此处:http://msdn.microsoft.com/en-us/library/windows/hardware/ff571073(v=vs.85).aspx
但是,可以通过删除报头,这些报头是由位于其上的协议(如HTTP、TCP、IP等)在向下传输到协议驱动程序的过程中添加到数据包中的。您需要知道在传输到协议驱动程序的过程中应用于数据包的确切协议。报头是递增添加的,对于每个底层,来自上层的输入是一个不透明的数据块(由上层数据和报头组成)。例如,您的数据包可以作为纯数据开始,在开始时添加HTTP报头,之后添加TCP报头,然后添加IP报头。您需要以相反的顺序删除标头,才能恢复原始数据。
请注意,这并不总是可能的,因为在关闭的过程中协议可能会更改数据,例如通过加密数据。在这种情况下,您将无法通过执行相反的操作(如解密)来提取原始数据。
发布于 2012-11-27 23:44:21
有称为Deep Packet Inspection(DPI)的工具和技术,用于在丰富的应用层上对传输的数据包进行解包,也有像openDPI这样的库,它甚至可以在内核上使用来跟踪数据包的内容。
当您可以将网络数据包解压缩到应用层时,您就可以更改其内容。您应该获奖,这是不容易捕获和解包的每个数据包抛出您的网卡。
发布于 2012-11-28 17:00:17
首先,我还不是很清楚你想做什么。我的主要疑问是:
ReceivePacketHandler?这真的是不同的东西。我假设您的目标只是拦截URL,而不是挂接现有的协议驱动程序。正如@icepack评论的那样,使用协议驱动程序并不是“简单的方法”,因为你应该跟踪所有的TCP连接来提取HTTP内容。
但是,如果必须使用NDIS,您应该检查DDK的PassThru example1,或者NDIS Filter driver 2示例,并实现必要的逻辑来解析TCP协议和HTTP头。
如果NDIS不是强制性的,那么有一些更简单的技术,比如使用TDI (不推荐使用,但仍然是functionally3)或WFP驱动程序4来拦截比TCP栈更高级别的通信。
1
2
3
4
https://stackoverflow.com/questions/13581939
复制相似问题