通过注册表更改 PPPoE DSL 连接的代理设置

Changing proxy settings for PPPoE DSL connections via the registry

本文关键字:连接 代理 设置 DSL PPPoE 注册表      更新时间:2023-10-16

我的一个软件需要在Windows上更改系统代理。更改路由器后面的 LAN 连接的 HTTP 代理很容易,但我找不到有关如何更改拨号或直接 DSL(即 PPPoE)连接的代理的任何信息。

这很糟糕,因为我的客户中有很大一部分在中国。在中国,许多人没有一台以上的计算机,因此发现路由器很浪费。他们只需将ADSL调制解调器连接到以太网端口并使用PPPoE。是的,这对安全和一切都很糟糕(僵尸网络在中国如此自由漫游的原因之一),但这是现实,我的软件需要工作。

还需要为我提供所有网络连接列表的代码。只是像我的相关问题中那样使用代码,需要知道要编辑的连接是行不通的。

我也更喜欢使用 reg 命令可以工作的东西。使用Windows API的简单C++或C#代码也很有用,但请注意,我使用的是Racket,这是一种具有相当繁琐的FFI的语言,这意味着最好尽量减少Windows C API的使用。

假设您无法使用Windows本机API调用,我将通过提供一个只需要调用Windows命令(reg)和数组/字符串操作的解决方案来发挥自己的作用,这是"Racket"语言必须实现的。

这不是最干净的方法,但考虑到要求,它应该是您的可行解决方案。

好吧,您可能已经注意到,不同连接的代理配置存储在key下:HKCUSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections

在该键下,有一个存储 DefaultConnectionSettings 的值和另一个存储 SavedLegacySettings 的值(均为 REG_BINARY 类型)。除了上述两个值之外,每个系统连接(也是 REG_BINARY 类型)都有一个值,用于存储连接配置,包括代理设置。值的名称等于连接名称。

幸运的是,有人对存储在这些值中的二进制数据的结构进行了逆向工程。

    字节
  1. 编号零总是有 3C 或 46 - 我找不到有关此字节的更多信息。接下来的三个字节为零。
  2. 字节号 4 是"Internet 选项"属性表(Internet Explorer->Tools->Internet Options...)使用的计数器。当您手动操作时 更改互联网设置(例如连接中的局域网设置 选项卡),此计数器递增。它不是很有用的字节。但它必须 有一个值。我总是把它保持零。接下来的三个字节为零 (字节 5 到 7)。
  3. 字节数 8 可以根据您的设置采用不同的值。值为 :
    • 09 仅启用"自动检测设置"时
    • 03 仅启用"为您的 LAN 使用代理服务器"时
    • 0B(当两者都启用时)
    • 05 仅启用"使用自动配置脚本"时
    • 启用"自动
    • 检测设置"和"使用自动配置脚本"时为 0D
    • 07 启用"为您的 LAN 使用代理服务器"和"使用自动配置脚本"时
    • 0F 表示所有三个都已启用。
    • 01 当它们都没有启用时。 接下来的三个字节为零(字节 9 到 B)。
  4. 字节号 C(十进制为 12)包含代理服务器地址的长度。例如,代理服务器"127.0.0.1:80"的长度为 12 (长度包括点和冒号)。接下来的三个字节是 零(字节 D 到 F)。
  5. 字节 10(或十进制中的 16)包含代理服务器地址 - 如"127.0.0.1:80"(其中 80 显然是端口号)
  6. 地址后面的字节紧接着附加信息的长度。接下来的三个字节为零。例如,如果 勾选"绕过本地地址的代理服务器",然后这个 字节是07,接下来的三个字节是零,然后是一个字符串,即 '' ( 表示您正在绕过代理 服务器。现在既然有7个字符,长度是07! 你 将不得不自己进行实验以找到有关此的更多信息。 如果 您没有任何其他信息,则长度为 0 且没有 信息已添加。
  7. 紧跟在附加信息后面的字节是自动配置脚本地址的长度(如果没有脚本 地址那你不需要添加任何东西,跳过此步骤并转到 步骤8)。接下来的三个字节是零,然后是地址。
  8. 最后,附加 32 个零。(我不知道为什么!大概是为了填充二进制斑点,也许它应该是一定的长度 有些东西,你不希望Windows有一些来源吗?

完整的信息可以在这里找到。

有了这些信息,我认为您可以设法获取其中的值。只需执行reg query "HKCUSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections",正确解析输出并再次使用 reg 写回修改。

我希望这有所帮助。

您可以使用此 c# 代码更改 VPN 连接的代理服务器:

// host looks like "127.0.0.1:8080"
public static void EnableVPNProxy(string host)
{
    RegistryKey RegKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections", true);
    foreach (var name in RegKey.GetValueNames())
    {
        try
        {
            byte[] server = Encoding.ASCII.GetBytes(host);
            byte[] current = (byte[])RegKey.GetValue(name);
            byte[] data = new byte[100];
            data[0] = current[0];
            data[1] = data[2] = data[3] = data[4] = data[5] = data[6] = data[7] = 0;
            data[8] = 3;
            data[9] = data[10] = data[11] = 0;
            data[12] = Convert.ToByte(server.Length);
            data[13] = data[14] = data[15] = 0;
            int i = 16;
            foreach (var b in server)
            {
                data[i] = b;
                i++;
            }
            for (var x = 0; x < 40; x++)
            {
                data[i] = 0;
                i++;
            }
           RegKey.SetValue(name, data);
        }
        catch (Exception ex) { }
    }
}

并启用代理

EnableVPNProxy("127.0.0.1:8080");