实际上,我正在尝试构建的就像一种防火墙。它应该能够了解从我的机器发出的所有请求。它应该能够停止选定的那些。我什至不知道如何开始。我正在使用带有框架 2.0 的 VS 2008/2005。请让我知道是否有任何特定的课程我可以开始,是否有任何样品我可以得到。
4 回答
防火墙确实应该在网络堆栈中相当低的位置实现;我强烈建议 NDIS。这篇文章可能很有趣。
这样的事情可能会帮助您入门:http ://www.mentalis.org/soft/projects/pmon/
这个 C# 项目允许 Windows NT 管理员拦截通过计算机上的网络接口之一发送的 IP 数据包。这对于调试网络软件或监视不受信任的应用程序的网络活动非常方便。
正如马特所说,它确实必须是 NDIS。
确保分配大量时间来开发驱动程序,我建议 6 - 12 个月只是为了让它进入 alpha 发布阶段。与 NDIS 打过交道后,我可以向您保证,这是一种前所未有的痛苦。
如果您打算向公众发布您的产品,您需要向微软支付一些费用以使驱动程序获得批准(WHQL),否则您的用户将在安装时遇到多个讨厌的对话框(“该软件至关重要不安全”的品种)。审批过程很慢,并且不再适用于 Windows 2000,很可能很快就会不适用于 XP。64 位批准是单独付款。
您被锁定在使用 C 语言中,但任何微小的错误都会被放大为蓝屏(例如空引用或轻微的缓冲区溢出)。你不能创建线程,你的 API 与普通的用户模式 API 有 100% 的不同,实际上试图与用户模式通信意味着处理令人毛骨悚然的 IRP 系统。
NDIS 本身以一种糟糕的 MFC 风格的方式过度设计。您仅限于内核 API 的一个子集(这使得某些事情变得非常困难,例如注册表访问)。不这样做会导致立即取消 WHQL 资格(不,您不会拿回您的钱!)。
每一行代码都需要彻底检查,以确保它在运行的 IRQL 级别上表现正确(它基本上决定了您的代码是否可以被其他进程中断)。在错误的级别调用 API 函数会导致蓝屏。此外,在堆栈上创建超过 500 - 1000 字节的结构会导致堆栈溢出(当然是蓝屏)。当你有一个 15 行深的调用堆栈并且每个函数中有一些小分配时,仅此一项就可以产生一些有趣的调试会话。
尽管如此,尽管 NDIS 已经经历了 6 次修订,但如果您想要挑战,这确实是值得的。奖励是一个卖得很好的软件产品,因为没有多少人敢与这类事情纠缠不清。一项重要要求是了解汇编语言(用于调试)。阅读 Windows 内核的工作原理也很有帮助(不仅仅是 NDIS)。
几年前,我需要了解 Windows 系统上所有应用程序使用的网络带宽。
在不知道我正在执行的任务的规模的情况下,我开始学习如何编写 TDI 过滤器驱动程序。
大约花了两年时间。两年全职,因为我靠一些股票期权为生。不过,NDIS 比 TDI 更容易。Prolly 正如男人所说,全职一年。
您可以在 TDI 级别做防火墙工作,这很好,因为您可以将套接字与应用程序相关联(在 NDIS 无法做到这一点)。您还可以阻止和/或带宽形状发送。您可以阻止接收,但您不能在 TDI 上真正调整接收,因为不允许您暂停(接收代码路径在 DISPATCH_LEVEL 处执行)。我想出了一个解决方法并为此申请了专利,但我不会从技术 POV 推荐它。
OTOH 一个真正的黑客只会绕过 TDI 并直接与 NDIS 驱动程序对话;TDI 防火墙是可以绕过的。