2

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

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

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

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

4

2 回答 2

6

假设您无法使用 Windows 原生 API 调用,我将提供一个解决方案,该解决方案只需要调用 Windows 命令 ( reg) 和数组/字符串操作,“Racket”语言必须确保实现这一点。

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

好吧,您可能已经注意到,不同连接的代理配置存储在键下:HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections

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

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

  1. 字节数零总是有 3C 或 46 - 我找不到关于这个字节的更多信息。接下来的三个字节是零。
  2. 字节数 4 是“Internet 选项”属性表(Internet Explorer->Tools->Internet 选项...)使用的计数器。当您手动更改 Internet 设置(例如“连接”选项卡中的 LAN 设置)时,此计数器会增加。它不是很有用的字节。但它必须有一个值。我始终保持为零。接下来的三个字节为零(字节 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 个零。(我不知道为什么!大概是为了填充二进制 blob,也许它预计会有一定的长度,你不希望 windows 有一些来源吗?)

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

有了这些信息,我认为您可以设法获取其中的值。只需reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"正确解析输出并再次使用 reg 来写回修改。

我希望这有帮助。

于 2013-09-12T05:03:47.967 回答
0

您可以使用此 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");
于 2018-04-21T16:58:09.460 回答