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

时间:2013-09-06 19:04:41

标签: c# c++ winapi proxy racket

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

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

我还需要能够提供所有网络连接列表的代码。只需拥有my related question中需要知道要编辑的连接的代码就可以了。

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

2 个答案:

答案 0 :(得分: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.   
  3. 字节编号4是“Internet选项”属性表(Internet Explorer - >工具 - > Internet选项...)使用的计数器。当你手动   更改Internet设置(例如Connections中的LAN设置)   tab),这个计数器递增。它不是非常有用的字节。但它必须   有价值。我总是保持零。接下来的三个字节是零   (字节5到7)。
  4.   
  5. 字节数8可根据您的设置采用不同的值。价值是:      
        
    • 09仅启用“自动检测设置”
    •   
    • 03仅启用“为LAN使用代理服务器”
    •   启用两者时
    • 0B
    •   
    • 05仅启用“使用自动配置脚本”时
    •   
    • 0D启用“自动检测设置”和“使用自动配置脚本”
    •   
    • 07启用“为LAN使用代理服务器”和“使用自动配置脚本”时
    •   当所有三个都启用时,
    • 0F。
    •   
    • 01,但没有启用它们。接下来的三个字节是零(字节9到B)。
    •   
  6.   
  7. 字节数C(十进制12)包含代理服务器地址的长度。例如,代理服务器'127.0.0.1:80'的长度为12   (长度包括点和冒号)。接下来的三个字节是   零(字节D到F)。
  8.   
  9. 字节10(或十进制的16)包含代理服务器地址 - 如'127.0.0.1:80'(其中80显然是端口号)
  10.   
  11. 地址后的字节immediatley包含附加信息的长度。接下来的三个字节是零。例如,如果   勾选“为本地地址绕过代理服务器”,然后选中此项   byte是07,接下来的三个字节是零,然后是一个字符串,即   ''(表示您绕过代理   server.Now由于有7个字符,长度为07!)。您   将不得不亲自试验以找到更多相关信息。如果   你没有任何额外的信息,那么长度是0,没有   信息被添加。
  12.   
  13. 紧跟在附加信息之后的字节是自动配置脚本地址的长度(如果您没有脚本   地址然后你不需要添加任何东西,跳过这一步并转到   步骤8)。接下来的三个字节是零,然后是地址。
  14.   
  15. 最后,附加了32个零。(我不知道为什么!大概是为了填充二进制blob,也许它预计会有一定的长度   什么,你不希望Windows有一些来源?)
  16.   

可以找到完整信息here

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

我希望这会有所帮助。

答案 1 :(得分: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");