通过注册表更改 PPPoE DSL 连接的代理设置
Changing proxy settings for PPPoE DSL connections via the registry
我的一个软件需要在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 类型)都有一个值,用于存储连接配置,包括代理设置。值的名称等于连接名称。
幸运的是,有人对存储在这些值中的二进制数据的结构进行了逆向工程。
字节
- 编号零总是有 3C 或 46 - 我找不到有关此字节的更多信息。接下来的三个字节为零。
- 字节号 4 是"Internet 选项"属性表(Internet Explorer->Tools->Internet Options...)使用的计数器。当您手动操作时 更改互联网设置(例如连接中的局域网设置 选项卡),此计数器递增。它不是很有用的字节。但它必须 有一个值。我总是把它保持零。接下来的三个字节为零 (字节 5 到 7)。
- 字节数 8 可以根据您的设置采用不同的值。值为 :
- 09 仅启用"自动检测设置"时
- 03 仅启用"为您的 LAN 使用代理服务器"时
- 0B(当两者都启用时)
- 05 仅启用"使用自动配置脚本"时
启用"自动- 检测设置"和"使用自动配置脚本"时为 0D
- 07 启用"为您的 LAN 使用代理服务器"和"使用自动配置脚本"时
- 0F 表示所有三个都已启用。
- 01 当它们都没有启用时。 接下来的三个字节为零(字节 9 到 B)。
- 字节号 C(十进制为 12)包含代理服务器地址的长度。例如,代理服务器"127.0.0.1:80"的长度为 12 (长度包括点和冒号)。接下来的三个字节是 零(字节 D 到 F)。
- 字节 10(或十进制中的 16)包含代理服务器地址 - 如"127.0.0.1:80"(其中 80 显然是端口号)
- 地址后面的字节紧接着附加信息的长度。接下来的三个字节为零。例如,如果 勾选"绕过本地地址的代理服务器",然后这个 字节是07,接下来的三个字节是零,然后是一个字符串,即 '' ( 表示您正在绕过代理 服务器。现在既然有7个字符,长度是07! 你 将不得不自己进行实验以找到有关此的更多信息。 如果 您没有任何其他信息,则长度为 0 且没有 信息已添加。
- 紧跟在附加信息后面的字节是自动配置脚本地址的长度(如果没有脚本 地址那你不需要添加任何东西,跳过此步骤并转到 步骤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");
- 代理对象的常量正确性
- 当套接字连接断开时检测C/C++Unix
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- SNMP 代理在单元测试期间断开连接
- 如果 PUB 首先启动并连接到 XPUB/XSUB 代理,则消息将被丢弃,直到 SUB 未连接
- 使用Hooking wsocks32.dll通过代理对应用程序的所有连接进行隧道传输
- HTTP 代理检测 HTTP 客户端断开连接
- 通过注册表更改 PPPoE DSL 连接的代理设置
- Windows Server 2012上的SNMP扩展代理无法连接到需要数据的端口
- 如果通过代理连接,客户端不会断开连接
- c++ socket通过代理连接
- 使用libcURL通过HTTP代理连接FTP服务器失败
- 通过代理对应用程序的所有连接进行隧道化
- 通过代理服务器增强asio套接字连接