在 Windows 的 C++ 中编程数据包阻止程序(基本防火墙)

Programming a Packet Blocker (basic firewall) in C++ for Windows

本文关键字:程序 防火墙 Windows C++ 数据包 编程      更新时间:2023-10-16

我对编程一个基本的防火墙感兴趣,该防火墙根据用户定义的规则阻止数据包。

基本上,我已经编写了处理规则的部分,一切都很好,但现在我应该实现防火墙本身(我猜是困难的部分)。

我搜索了很多,发现了几个充满细节的链接,例如这个和这个。第二个(Windows过滤平台)似乎是最相关的,现在,似乎没有任何关于实际入门的数据,站点中的代码片段(嗯,在这个特定主题中)并不能很好地解释这个主题。

我想简单地知道如何阻止与特定规则匹配的数据包,因此包括几个阶段:

  1. 侦听任何传入数据包、所有端口、IP 和协议。

  2. 检查数据包是否与特定规则匹配。

  3. 如果匹配,请让它通过。如果没有,请捕获它并在那里阻止它。

现在,阶段

2 实际上已经编程好了,我只需要根据阶段 1 匹配它(使用什么类/结构来表示数据包)。我不确定是否要做第 1 阶段和第 3 阶段。

首先,我如何收听计算机中的所有连接?

其次,如何管理我捕获的数据包,让它通过或阻止它。

帮助将不胜感激。我的意思是原始的WinAPI,但如果有一个好的API可以在Windows(特别是8)上运行,我很乐意测试它。

好吧,你是对的 - 你把困难的部分留到了最后:-)

您需要编写网络驱动程序以将自身定位在网络堆栈中,以拦截来自网卡的数据包,然后过滤它们。有一些方法可以解决这个问题(例如使用数据包注入函数),但它们几乎和编写自己的驱动程序一样困难。

您可以查看开源驱动程序 - winpcap 是大多数人熟悉的驱动程序,因为它是 Wireshark 使用的数据包捕获驱动程序。