C++ 阻止来自Win32应用程序的所有Windows Internet访问

C++ 阻止来自Win32应用程序的所有Windows Internet访问,c++,windows,networking,winapi,C++,Windows,Networking,Winapi,对于我正在编写的应用程序,阻止Windows计算机上的所有Internet访问的最简单方法是什么 更多详情: Windows:XP或更高版本 应用程序:用C/C++编写的基本Win32应用程序 阻塞:它需要能够随意阻塞和解除阻塞,理想的方式是用户无法轻松反转。例如,右键单击系统托盘中的网络连接图标。此外,理想情况下,我希望它使用的方法允许在用户重新启动Windows或重置计算机时恢复访问,尽管我也愿意让应用程序使用Windows自动启动,并在启动时取消阻止访问,如果计算机在阻塞状态下重置 互联网

对于我正在编写的应用程序,阻止Windows计算机上的所有Internet访问的最简单方法是什么

更多详情:

Windows:XP或更高版本

应用程序:用C/C++编写的基本Win32应用程序

阻塞:它需要能够随意阻塞和解除阻塞,理想的方式是用户无法轻松反转。例如,右键单击系统托盘中的网络连接图标。此外,理想情况下,我希望它使用的方法允许在用户重新启动Windows或重置计算机时恢复访问,尽管我也愿意让应用程序使用Windows自动启动,并在启动时取消阻止访问,如果计算机在阻塞状态下重置

互联网接入:首先,我想阻止传统浏览器访问传统的http/https站点。第二,屏蔽IM客户端和客户端社交网络应用程序会很好。这也很好,但不是必需的,仍然允许本地网络进行文件共享等。请注意,只有第一个要求是绝对的

最后提示:这不是一个安全实用程序,它与用户的关系也不会是对抗性的,例如,与家长控制实用程序的关系,因此它使用一个确定的用户无法解决的方案并不重要。考虑到我打算重启或重置来清除阻塞。这意味着用户可能发现的任何解决方案都需要付出比这更大的努力

谢谢


p、 我怀疑Windows防火墙API对我不起作用,因为这需要对那些没有启用防火墙或没有管理员权限的用户起作用,但如果我纠正了这一点,我会非常激动。

听起来你打算运行不想访问internet的应用程序。也许您可以在禁用网络的虚拟机(如VirtualBox)中运行它们。

查看防火墙源代码,您可以使用Winsock来实现。在Samples\netds\winsock\lsp下有一个示例,它实现了所谓的分层服务提供程序,允许您挂接winsock提供的所有用户模式函数,并拒绝/修改调用以阻止网络访问或将流量重定向到不同的位置。所有已安装的winsock应用程序都将受到影响,因此在代码中,您可能会有关于哪些应用程序可以退出等的策略,以及动态禁用/启用的策略。现在,一个有决心的人可以找到办法解决这个问题,但这将是一种痛苦


也就是说,这并不是一件微不足道的事情,但是这个示例应该可以帮助您实现这一点

仅使用用户模式应用程序无法有效或实际地编写工具

您需要编写的是网络I/O堆栈筛选器驱动程序。这可以通过编写Windows驱动程序来完成。这与Windows Win32应用程序不同。驱动程序在内核模式下运行,应用程序在用户模式下运行

在Windows Vista和更高版本上,内核模式网络编程接口NPI就是为此而设计的。这与Windows防火墙使用的API相同。这些有时被称为Winsock内核WSK API

实际上,您或多或少正在编写网络防火墙

这里有一些链接

注意,您可能需要至少两个组件

你的司机 一个人可以用来控制你的工具的图形应用程序 如果您想进行任何监控,您可能需要一个从驱动程序收集数据的用户模式服务。这比在驱动程序中尝试这样做效果更好。通常,您应该在驱动程序中完成最少的工作

请注意:

在编写此类软件时,您需要非常有安全意识。这是非常不平凡的。面向网络的软件具有最高的安全要求。 注意表现。 您的驱动程序和/或服务必须知道调用应用程序的上下文。这也是一个安全边界。例如,非以管理员身份运行的应用程序不应能够控制您的驱动程序。
请注意,您天生就是在利用操作系统的弱点。因此,您可能需要为每个Windows版本的每个SP寻址。正如您正确地注意到的,修复网络功能是存在的,您根本无法期望超越这一点。哦,请明确说明该程序已安装。即,创建一个模式消息框,说明ACME网络阻止程序已阻止与“updates.microsoft.com”的连接。无论如何,这个程序会引起很多混乱,最好不要隐藏它。不管怎样,我都会将我的软件标记为与这样的应用程序不兼容。