如何在Windows中挂钩TCP堆栈以嗅探和修改数据包?

12

我希望能够编写一个能在Windows上监测和编辑数据包的软件。我想要能够查看所有进出我的系统的数据包内容,并且可能对其进行修改。可以使用任何语言,但我希望它运行速度足够快,不会负担系统。

我已经了解了一些关于WinPcap的知识,但文档中称你不能使用WinPcap创建防火墙,因为它不能丢弃数据包。那么哪些工具可以帮助我编写这个软件呢?

7个回答

11

曾经做过这个,2000年时,我的第一个Windows程序就是筛选钩子驱动程序

我的做法是实现筛选钩子驱动程序并编写用户空间应用程序,准备一个筛选表来确定哪些是允许的,哪些是不允许的。当你解决了初始一系列蓝屏问题(请参见下面我的内核模式调试提示)之后,筛选模式驱动程序非常容易使用......它将每个数据包传递给你编写的一个函数,根据返回代码丢弃或允许其通过。

不幸的是,在那个级别上的数据包十分原始,片段未重新组合,看起来更像是“网络卡”的端口(但不再有以太网头)。因此,你将在使用该解决方案进行数据包过滤时遇到困难。

还有防火墙钩子驱动程序,就如同在这篇codeproject文章中所讨论的那样。

如果你正在使用Vista或Server 2008,则最好查看WFP(Windows Filtering Platform),因为它似乎是编写防火墙的当今强制使用的API。我刚刚用谷歌搜索筛选钩子驱动程序时发现这个。

更新:忘了调试提示:

Sysinternals DbgView可以显示内核模式下的DbgPrint输出,更重要的是——它还可以从最后一个蓝屏产生的转储文件中读取它们。所以在代码中加入dbgprint,如果出现蓝屏,只需将转储加载到dbgview中即可查看发生了什么......非常有用。使用这个工具,我成功地没有使用内核调试器。


过滤器挂钩驱动程序不是一个好选择,因为您在任何时候只能安装其中之一。如果您尝试在已经安装了其他人的挂钩的系统上安装它,您就会被卡住。 - user82238
同意。我认为防火墙钩子驱动程序是正确的选择,尽管在WinXP及更高版本中已被弃用,因为它在网络堆栈中运行得太高。对于WinXP,建议使用NDIS。不过,NDIS似乎需要更多的工作。 - Eyal

1

我相信你需要编写一个过滤驱动程序。http://en.wikipedia.org/wiki/Filter_driver除此之外,我不知道更多了:)。这肯定是一个C/C++ Win32应用程序,你可能需要做一些内核方面的工作。首先下载DDK并找到一些示例过滤驱动程序。

如果你只想监视IIS进出的流量,请考虑使用ISAPI过滤器。仍然是Win32中的C/C++,但相对于编写设备驱动程序来说要容易得多。


1

实现此功能的C#代码在这里


由于它是基于原始套接字的,因此无法在Windows 7上嗅探传入的TCP数据包。(Microsoft在非服务器版本的Windows上禁用了原始套接字) - CodesInChaos
我需要一个 WFP 解决方案/示例,不幸的是。 - ChopperCharles

0

我几年前实际上做过这个。现在我对细节有些模糊了,但我必须使用Windows DDK开发一个过滤器/中间驱动程序。我从pcausa获得了很多有用的信息。这里是一个指向他们的产品的网址,可以实现这一点:http://www.pcausa.com/pcasim/Default.htm


0

如果你是出于实际目的而非兴趣在做这件事,那么你应该看看Microsoft Network Monitor。首页上提到了3.3 beta版,但你可以从下载页面下载3.2版本。NM还有一个SDK,可以编写自己的网络协议解析器。


0

有一个问题你需要问,但你不知道需要问什么;你想知道套接字属于哪些应用程序吗?还是你愿意在连接时被限制在IP:端口四元组上?

如果你想知道应用程序,你需要编写一个TDI过滤驱动程序,但这会使处理接收几乎不可能,因为你不能在接收路径上阻塞。

如果你对IP:端口满意,可以在NDIS级别进入,并且我相信你可以尽情地阻止接收。

警告一句话:如果你没有先前的内核经验,编写这两个驱动程序(尽管TDI要困难得多)将需要大约两年的全职时间。


0

这是:

TdiFw 是一个简单的基于 TDI 的开源个人防火墙,适用于 Windows NT4/2000/XP/2003。

http://tdifw.sourceforge.net/

可能会对你有所帮助


如果那是我认为的东西,那就太糟糕了!源代码写得不好,也难以理解。当我编写自己的 TDI 过滤器时,我查看了它,但它并没有对我有任何帮助。 - user82238

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接