1

我使用NdisRegisterProtocol()注册了一个协议驱动,并使用_NDIS_OPEN_BLOCK_NDIS_PROTOCOL_BLOCK结构hookReceivePacketHandler成功,使用MyRecivePacket()代替NDIS接收数据包的功能,当我打开一个网站,MyRecievePacket()就会运行。

我的问题是:当我使用打开一个网站(如www.stackoverflow.com)时IE,我怎样才能挂钩SendPacketsHandler来获取这个数据包并获取 urlwww.stackoverflow.com字符串。换句话说,如何在内核模式下捕获 url。谢谢

4

3 回答 3

0

首先,我还不清楚你想做什么......我的主要疑问:

  • ¿您是在注册一个协议驱动程序,还是挂钩ReceivePacketHandler一个先前存在的驱动程序?这真的很不一样。

我假设您的目标只是拦截 URL,而不是挂钩现有的协议驱动程序。正如@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

于 2012-11-28T09:00:17.457 回答
0

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

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

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

于 2012-11-27T15:20:15.667 回答
0

有一些称为深度包检测 (DPI)的工具和技术用于在丰富的应用程序层上解包传输的数据包,还有一些像 openDPI 这样的库,甚至可以在内核领域使用来跟踪数据包的内容。

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

于 2012-11-27T15:44:21.397 回答