按用户代理时的注册表位置
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
2
3
4#define PROXY_TYPE_DIRECT 0x00000001 // direct to net
#define PROXY_TYPE_PROXY 0x00000002 // via named proxy
#define PROXY_TYPE_AUTO_PROXY_URL 0x00000004 // autoproxy URL
#define PROXY_TYPE_AUTO_DETECT 0x00000008 // use autoproxy detection - 自动配置URL
自动代理的URL有两个,一个主一个次,但是我们在IE设置中只能设置一个主要的,次要的URL是怎么配置进去的呢?这就是通过之前的一篇文章 IE自动部署工具包IEAK 中介绍过的INS文件写入进去的其中1
2
3
4
5
6[URL]
AutoDetect=1
AutoConfig=1
AutoConfigTime=1
AutoConfigURL=http://localhost/test1.pac
AutoConfigJSURL=http://localhost/test2.pacAutoConfigJSURL
就是次选代理URL。但是经过测试发现,次选URL永远用不上,当AutoConfigURL
无法访问时,网络会产生直连,而没有寻找次选代理URL。
总结
- 按用户代理时,WinINet 以
Internet Settings
中的值为准。但IE是个例外,IE以DefaultConnectionSettings
中的值为准。 - 按计算机代理时,WinINet 以
DefaultConnectionSettings
中的值为准,在Internet Settings
下的设置没有任何效果。 - 64位系统下,如果用直接修改注册表的方式改代理,要注意注册表
WOW6432Node
下的位置也要一起改。