#按用户代理时的注册表位置
Windows系统默认是"按用户代理"的,意味着每个系统账户都有属于自己独立的代理设置。我们可以运行命令Inetcpl.cpl来打开IE选项窗口,在"连接"选项卡中点击"局域网设置"便可以显示代理设置界面,
代理设置最终会保存在注册表中。
#自动配置部分

1 | [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings] |
-
AutoDetect
自动检测设置开关,通过 Process Monitor 监测发现,打开选项设置窗口后会将其值同步到DefaultConnectionSettings并删除AutoDetect,看上去是一种"升级"操作,将旧设置迁移至新位置,所以尽量还是以DefaultConnectionSettings为准。 -
AutoConfigURL
PAC文件URL。如果没有值或值为空,表示未启用状态,会尝试从DefaultConnectionSettings获取最近一次的值并显示。
需要注意的是,PAC 地址应该是一个使用HTTP协议的地址,而不应使用本地文件路径,否则会无法加载,原因见 Windows 10 does not read a PAC file referenced by a file protocol。并且服务器应该为其指定MIME类型为application/x-ns-proxy-autoconfig。 -
ProxyEnable
是否启用代理。 -
ProxyServer
各协议所使用的代理服务器,用分号分隔。如果不指定具体协议而直接写上服务器与端口号,则表示所有协议使用同一个代理。 -
ProxyOverride
禁止使用代理服务器的地址列表,通常指定为本地地址。支持通配符,用分号分隔。它同时也是"对于本地地址不使用代理服务器"选项的开关。
#代理服务器部分

1 | [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings] |
-
ProxyEnable
是否启用代理。 -
ProxyServer
各协议所使用的代理服务器,用分号分隔。如果不指定具体协议而直接写上服务器与端口号,则表示所有协议使用同一个代理。 -
ProxyOverride
禁止使用代理服务器的地址列表,通常指定为本地地址。支持通配符,用分号分隔。它同时也是"对于本地地址不使用代理服务器"选项的开关。
在IE浏览器中,启动浏览器、开关或关闭代理设置窗口都会将设置同步到DefaultConnectionSettings键值中,读取代理设置时都会以DefaultConnectionSettings中的值为准(缓存代理设置的作用)。
而对于非IE浏览器,则以Internet Settings中的设置为准。
#按计算机代理时的注册表位置
运行命令gpedit.msc打开策略编辑器,依次打开"计算机配置"、“管理模板”、“Windows 组件”、“Internet Explorer”,找到"按计算机(而不是按用户)进行代理",启用这个选项将会在注册表保存一个值
1 | [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings] |
值不存在或是非0值,意味着"按用户代理",否则就是"按计算机代理"。
当系统变为"按计算机代理"后,代理设置的注册表根位置将从HKEY_CURRENT_USER变为HKEY_LOCAL_MACHINE。而且必须使用管理员方式运行IE才能成功修改代理设置。
要注意的是,按计算机代理后WinINet不会再读取Internet Settings下的设置了,而是直接读取DefaultConnectionSettings。
#解密DefaultConnectionSettings
它是一个未公开的结构体,我们可以在泄露的Windows 2003源码中找到蛛丝马迹,
头文件 proxreg.cxx 中的结构体 INTERNET_PROXY_INFO_EX 就是它了,函数 WriteProxySettings 用于将这个结构体写入注册表,而 ReadProxySettings 将DefaultConnectionSettings读取到结构体中,这就是一个序列化,反序列化的过程。
开始的4字节表示结构体大小,同时也用于标识结构体版本,XP到Win10为止仅修改过一次,所以目前只有两种可能的值:0x3C和0x46。
根据源码中的定义,IE5和IE6都是0x3C,也就是第一版的结构体
1 | #define INTERNET_PROXY_INFO_EX_VERSION 60 // 60 := IE 5.x & 6.0 format |
XP系统自带的是IE6,实际查看一下也确实如此

从Vista的IE7开始,结构体就升级了,变为了0x46。
我编写了一个010 Editor的模板,这样看起来比较直观
1 | //------------------------------------------------ |

从头部的4字节看,0x46 - 0x3C = 0xA,也就是在其dll内部的结构体多了10字节,但是持久化到注册表后只多了4字节。
- dwFlags
dwFlags实际上就是常量PROXY_TYPE_DIRECT和其他三个值的组合。
1 | #define PROXY_TYPE_DIRECT 0x00000001 // direct to net |
- 自动配置URL
自动代理的URL有两个,一个主一个次,但是我们在IE设置中只能设置一个主要的,次要的URL是怎么配置进去的呢?这就是通过之前的一篇文章 IE自动部署工具包IEAK 中介绍过的INS文件写入进去的
1 | [URL] |
其中AutoConfigJSURL就是次选代理URL。但是经过测试发现,次选URL永远用不上,当AutoConfigURL无法访问时,网络会产生直连,而没有寻找次选代理URL。
#总结
- 按用户代理时,WinINet 以
Internet Settings中的值为准。但IE是个例外,IE以DefaultConnectionSettings中的值为准。 - 按计算机代理时,WinINet 以
DefaultConnectionSettings中的值为准,在Internet Settings下的设置没有任何效果。 - 64位系统下,如果用直接修改注册表的方式改代理,要注意注册表
WOW6432Node下的位置也要一起改。