标题: Network系列(4)--Windows网络探活 创建: 2023-06-10 19:41 更新: 2024-04-25 08:25 链接: https://scz.617.cn/network/202306101941.txt -------------------------------------------------------------------------- 目录: ☆ 背景介绍 ☆ NCSI (Network Connectivity Status Indicator) 0) 触发NCSI探活 1) 主动探活原理 1.1) DNS探活 1.2) WWW探活 2) 被动探活原理 3) Captive Portals ☆ NCSI日志及故障排查 ☆ 注册表 1) 修改主动探活数据 2) 用EnableActiveProbing禁用主动探活 3) 修改被动探活数据 4) 为主动探活设置代理 ☆ 组策略 1) 用NoActiveProbe禁用主动探活 2) 禁用被动探活 3) 使用全局DNS ☆ 其他讨论 1) DDoS 2) 隐私泄露 3) 全面禁用探活不能解决问题 4) 状态改出的挣扎 (待修正) 5) Hook ncsi!NCSI_INTERFACE_ATTRIBUTES::SetCapability ☆ 专业人员的Cache解决方案 ☆ 参考资源 -------------------------------------------------------------------------- ☆ 背景介绍 Win10右下角托盘区有时会出现一个小地球,提示"无法连接到Internet",即使你正 欢快地上着公网,仍有一定几率看到这个提示,[2]给了一些示意图。一般来说不用 理会,也不影响啥。但是,出现该提示时,你的Microsoft Store就废了,无法下载 安装应用、无法登录、提示0x800704cf错误码;还会影响很多微软自己的网络应用, 比如Skype、Office 365、Outlook、OneDrive等等;总的来说,微软的智障设计。 Vista、Win7、LTSB版Win10,右下角是黄三角示警,不是小地球,一回事。 ☆ NCSI (Network Connectivity Status Indicator) 参[1],Vista引入NCSI机制,即网络探活。若NCSI认为公网不可达,就会显示黄三角 或小地球。NCSI经常误报,过去这种误报没事,但后来微软越来越智障,许多关键网 络应用依赖探活结果,若NCSI认为公网不可达,某些网络应用完全不进行实际网络操 作,比如Microsoft Store。幸好Windows更新、浏览器、传统socket程序不依赖NCSI。 NCSI探活结果有缓存,微软没有提供简便办法快速触发新的NCSI探活,一旦上次探活 "误"失败,急切间无法状态改出。 NCSI有三种探活机制,主动探活分DNS探活、WWW探活,还有一种被动探活。[5]中说, 从Win11开始,只剩WWW探活;Win11之前版本,在无代理的情况下,会进行DNS探活。 [2]中说DNS/WWW探活是OR的关系。[3]中说DNS/WWW探活任一失败,就判定无公网连接。 这些探活不会捆绑进行,包括被动探活,任一探活结果都会更新状态,不能简单说 AND/OR。 0) 触发NCSI探活 微软文档声称过许多触发NCSI探活的场景: a) 重启OS后的第一次登录 b) PC接入一个不同的网络 c) OS判断PC正在连接一个需要网页认证的无线热点 [4]中声称了一些触发主动探活的场景: 有线网络 a) 拔掉网线,或在ncpa.cpl中禁用网络接口 b) 用Wireshark开始抓包,等待30秒开始下一步 c) 插回网线,或在ncpa.cpl中启用前述网络接口 d) 等待60秒之后停止Wireshark抓包,确保主动探活完成 无线网络 a) 在连接WIFI之前,先打开Wireshark抓包 b) 连接WIFI c) 等待60秒之后停止Wireshark抓包,确保主动探活完成 [5]中声称了一些触发主动探活的场景: a) 检测到网络接口发生变化 b) 检测到代理存在或变化 c) 检测到无线热点存在或变化 无论上面怎么瞎吹,实践中某些情况下很难触发NCSI探活。 参[5]、[6],Office会调用INetworkListManager::get_IsConnectedToInternet,判 断公网是否可达,该调用并不触发NCSI探活,相反,只是取状态信息。 1) 主动探活原理 默认情况下,Win10启动时会进行一次DNS探活,若判定公网可达,不再进行WWW探活。 1.1) DNS探活 DNS探活请求解析某个特定FQDN,期待解析结果是某个特定广播地址。DNS控活机制从 Vista延续到Win10,没有变过,类似下列操作: $ nslookup -type=A dns.msftncsi.com 8.8.8.8 ... Name: dns.msftncsi.com Address: 131.107.255.255 $ dig +short A dns.msftncsi.com @8.8.8.8 131.107.255.255 [8]中提到,可修改hosts文件骗过DNS探活: $ notepad c:\windows\system32\drivers\etc\hosts 131.107.255.255 dns.msftncsi.com 1.2) WWW探活 从Vista到Win 8.1,WWW探活机制是请求某个特定URL,期待其返回某个特定内容,返 回值结尾没有NUL、CRLF字符。 $ curl http://www.msftncsi.com/ncsi.txt Microsoft NCSI $ curl -s http://www.msftncsi.com/ncsi.txt | xxd -g 1 00000000: 4d 69 63 72 6f 73 6f 66 74 20 4e 43 53 49 Microsoft NCSI WWW探活用HTTP(80/TCP),而非HTTPS(443/TCP),很容易被线路上的设备恶意干扰, 比如GFW。 参[5],从Windows 10 build 14393 (1607)开始,WWW探活数据发生变化。 $ curl -A "Microsoft NCSI" http://www.msftconnecttest.com/connecttest.txt Microsoft Connect Test $ curl -s -A "Microsoft NCSI" http://www.msftconnecttest.com/connecttest.txt | xxd -g 1 00000000: 4d 69 63 72 6f 73 6f 66 74 20 43 6f 6e 6e 65 63 Microsoft Connec 00000010: 74 20 54 65 73 74 t Test 必须用FQDN访问,不能手工解析出IP再用IP访问。微软官方文档中未写,但ncsi.dll 的实现中WinHttpOpen()第一形参指定: User-Agent: Microsoft NCSI 不使用特定User-Agent不影响探活,但流量分析设备可据此识别来自NlaSvc服务的 WWW探活,区分浏览器手动测试。 2) 被动探活原理 参[2],主动探活可能会"误"失败,比如到探活服务器的中间路由间歇性抽风,这锅 GFW得背。此时,被动探活是一种有效补充。 参[8],被动探活周期性检查入站IP报文的TTL,据此推断从源IP到本机经过了多少跳, 若跳数小于8,判定是内网通信,大于等于8,判定是公网通信。被动探活会更新主动 探活产生的状态。 [8]中提到,某些场景中被动探活会出幺蛾子 a) 在VMware之类的虚拟机中运行Windows b) 防火墙或线路上其他串联设备调整过TTL,比如GFW c) 某些受控环境只有极少量来自公网的报文 d) 多网络接口 参[3],WWW探活可能因Proxy设置而失败,或因出口上的边界防火墙而失败,此时 Windows试图用默认浏览器访问"http://www.msftconnecttest.com/redirect",进而 被重定向至"MSN Portal",这是被动探活的一部分。若"MSN Portal"加载成功,被动 探活判定公网可达,更新状态。 参[5],被动探活的坑不小,若下列任一条件满足,被动探活判定无公网连接 a) 依据TTL推断出来的入站跳数小于阈值 b) 无法从指定网络接口获取跳数信息 c) 指定网络接口路由表中无相应条目,致使无法前往公网服务器 d) 启用了主动探活,但指定网络接口自上线以来,主动探活从未完成过 若被动探活检测到跳数不小于阈值,判定公网可达,更新状态;之后相应网络接口不 再出现主动探活,除非出现[5]中声称的那些触发主动探活的场景。 按[5]的说法,假设未禁用被动探活,用户已登录或过去30秒内登录过(现已登出), 被动探活才会依据注册表设置开始运转。没理解错的话,长时间登出状态,并不会进 行被动探活。 3) Captive Portals 机场、医院、酒店提供一种无线热点,PC可以无认证接入WIFI,但用浏览器访问公网 时会被重定向到一个认证页面,认证通过后可以正常访问公网。 满足如下条件时,NCSI判定遭遇"Captive Portals" a) 无代理情况下发送WWW探活请求 b) 收到响应 c) 响应内容非预期的"Microsoft Connect Test",而是HTTP重定向报文 参[3]、[5],从Win8开始,NCSI识别到"Captive Portals"时,会出现黄三角或小地 球,同时自动打开默认浏览器(不一定是IE/Edge)显示相应认证页面,这是设计行为, 非BUG。说是改善用户体验,我倒觉得有安全风险。云海提到,设法使victim接入受 控WIFI,victim进行WWW探活时被重定向到恶意页面,进行无交互式远程攻击。 ☆ NCSI日志及故障排查 Vista时代NCSI探活不产生日志,但Win10有NCSI日志,可以看到何时探活、何种探活、 探活结果、进行NCSI探活的进程PID,参[4]。 -------------------------------------------------------------------------- event.vwr Applications and Services Logs (应用程序和服务日志) Microsoft Windows NCSI Operational 右键菜单 查看 显示分析和调试日志 (缺省未勾选) Analytic 右键菜单 启用日志 -------------------------------------------------------------------------- 参[5],"Reasons for network probe failure"小节介绍探活失败的各种原因 -------------------------------------------------------------------------- ActiveDnsProbeFailed DNS探活失败 ActiveHttpProbeFailed (5) 对WWW探活服务器(比如www.msftconnecttest.com)的域名解析失败,无法获取探 活服务器的IP地址,HTTP请求并未发出。可能缘自DNS故障或者位于代理后面。 ActiveHttpProbeFailedButDnsSucceeded (6) 对WWW探活服务器的域名解析未报错,但仍然WWW探活失败。可能是FQDN解析到错 误IP,可能是响应数据不符合预期,可能GFW干扰,需要抓包分析。 ActiveHttpProbeFailedHotspotDetected 发送WWW探活请求,收到200响应,但响应中并无connecttest.txt;或者收到非 200响应,比如302、304重定向响应。可能是遭遇"Captive Portals"。 NoAddress (1) 指定网络接口未配置IPv4地址 NoGlobalAddress 指定网络接口未配置IPv6地址 NoRoute 指定网络接口没有配置前往公网的路由。VPN场景易出此错。 PassivePacketHops (13) 看到这个,不代表被动探活失败。相反,被动探活判定网络连通能力提升。 -------------------------------------------------------------------------- 在日志视图中可以Ctrl-F搜索前述关键字。除了上面列出的,还看到过 ActiveHttpProbeSucceeded (4) ActiveDnsProbeSucceeded (8) SuspectDnsProbeFailed (10) CapabilityReset (14) 推荐在日志视图中搜"Probe"。这些关键字对应相应的CapabilityChangeReason,相 应数值在NCSI日志详细信息中可见。 详细信息中InterfaceGuid对应网络接口,表示探活操作在此接口上进行 $ Get-NetAdapter -IncludeHidden | Select Name,InterfaceGuid,Hidden,Status 参[10],详细信息中PreviousCapability、Capability对应探活结果: 0 None // 无公网连接 1 Local 2 Internet // 有公网连接 详细信息中Execution ProcessID即发起NCSI探活的进程,Win10中一般是NlaSvc服务 进程。 sc queryex NlaSvc | findstr PID ☆ 注册表 Win11之前,由NlaSvc (Network Location Awareness)服务负责NCSI探活,Win11由 Network List Manager服务(也称Network Profile Manager服务)负责NCSI探活。 Win10的NlaSvc服务无法正常禁用、重启,但可以调整参数: -------------------------------------------------------------------------- Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet] "ActiveDnsProbeContent"="131.107.255.255" "ActiveDnsProbeContentV6"="fd3e:4f5a:5b81::1" "ActiveDnsProbeHost"="dns.msftncsi.com" "ActiveDnsProbeHostV6"="dns.msftncsi.com" "ActiveWebProbeContent"="Microsoft Connect Test" "ActiveWebProbeContentV6"="Microsoft Connect Test" "ActiveWebProbeHost"="www.msftconnecttest.com" "ActiveWebProbeHostV6"="ipv6.msftconnecttest.com" "ActiveWebProbePath"="connecttest.txt" "ActiveWebProbePathV6"="connecttest.txt" "CaptivePortalTimer"=dword:00000000 "CaptivePortalTimerBackOffIncrementsInSeconds"=dword:00000005 "CaptivePortalTimerMaxInSeconds"=dword:0000001e "EnableActiveProbing"=dword:00000001 "MinimumInternetHopCount"=dword:00000008 "PassivePollPeriod"=dword:0000000f "StaleThreshold"=dword:0000001e "WebTimeout"=dword:00000023 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\ManualProxies] @="1127.0.0.1:8080" @="1http=127.0.0.1:8080;https=127.0.0.1:8080;socks=127.0.0.1:1080" -------------------------------------------------------------------------- reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /s 1) 修改主动探活数据 下列注册表项可以更改DNS/WWW探活行为,指定不同的FQDN,期待不同的解析结果, 指定不同的URL,期待不同的返回值,再比如,都放在内网。 以IPv4为例,IPv6类似: -------------------------------------------------------------------------- "ActiveDnsProbeHost"="dns.msftncsi.com" "ActiveDnsProbeContent"="131.107.255.255" "ActiveWebProbeHost"="www.msftconnecttest.com" "ActiveWebProbePath"="connecttest.txt" "ActiveWebProbeContent"="Microsoft Connect Test" -------------------------------------------------------------------------- 2) 用EnableActiveProbing禁用主动探活 EnableActiveProbing由1变0,将禁用主动探活。微软官方文档不建议禁用主动探活, 声称被动探活不能覆盖所有场景。 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v "EnableActiveProbing" /t REG_DWORD /d 0 /f reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v "EnableActiveProbing" 3) 修改被动探活数据 参[8],下列注册表项与被动探活相关: -------------------------------------------------------------------------- "PassivePollPeriod"=dword:0000000f "MinimumInternetHopCount"=dword:00000008 -------------------------------------------------------------------------- PassivePollPeriod以秒为单位指定被动探活周期,MinimumInternetHopCount指定跳 数阈值。若怀疑被动探活惹祸,尝试将MinimumInternetHopCount改成1,这是最小有 效值。参[5],微软认为跳数阈值设成3足矣。 reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v "MinimumInternetHopCount" /t REG_DWORD /d 1 /f reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v "MinimumInternetHopCount" 4) 为主动探活设置代理 若企业不支持NAT上公网,只支持非透明Proxy上公网,则有必要为主动探活设置代理。 这个代理用WinINET代理,即IE代理(inetcpl.cpl);Win10还可在下列位置设置代理: 设置->网络和Internet->代理 Start->Settings->Network & Internet->Proxy->Manual proxy setup Win10设置填写代理时格式非常诡异。IE只设SOCKS代理,Win10设置看到 地址 http://socks=127.0.0.1 端口 1080 IE对所有协议均使用相同的代理服务器,此时只能设HTTP代理,Win10设置看到 地址 127.0.0.1 端口 8080 IE同时设HTTP、HTTPS、SOCKS代理,Win10设置看到 地址 http=127.0.0.1:8080;https=127.0.0.1:8080;socks=127.0.0.1:1080 端口 (空) 推荐通过IE设置代理,无须面对Win10设置的诡异格式。上述三种操作会反映在如下 注册表位置 -------------------------------------------------------------------------- [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\ManualProxies] @="1socks=127.0.0.1:1080" @="1127.0.0.1:8080" @="1http=127.0.0.1:8080;https=127.0.0.1:8080;socks=127.0.0.1:1080" -------------------------------------------------------------------------- reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\ManualProxies" 无论如何设置代理,上述键值数据均以"1"打头。参[15],评论区有人提到,若使用 PAC (Proxy Auto-Config),上述键值数据均以"0"打头,可能该字节用于区分类型。 WWW探活所用代理必须是无认证代理,否则进行不下去。IE代理肯定不会转发UDP,幸 好DNS/WWW探活不会捆绑进行,否则位于IE代理后面的DNS探活铁定失败,这影响面可 就大了。 Win10 WinINET代理设置有个大坑。假设通过IE只设置HTTP代理,清空HTTPS、FTP、 SOCKS代理,同时不选「对所有协议均使用相同的代理服务器」。此时Win10设置看到 地址 http://http=127.0.0.1 端口 8080 这个代理对HTTP是生效的,可用"http://ip4.me"测试确认。接下来,假设不通过IE 设置而是通过Win10设置关闭该HTTP代理,也没问题。再接下来,想通过Win10设置重 新打开该HTTP代理,却是不能,每次GUI打开代理、保存、退出、再进入查看,该 HTTP代理始终关闭状态。若IE那边选中「对所有协议均使用相同的代理服务器」, 此时Win10设置无此BUG,关闭后可重新打开。 ☆ 组策略 Win10有丰富的NCSI组策略 -------------------------------------------------------------------------- gpedit.msc Local Computer Policy Computer Configuration Administrative Templates Network Network Connectivity Status Indicator Specify corporate Website probe URL Specify corporate DNS probe host name Specify corporate DNS probe host address Specify passive polling Disable passive polling Specify global DNS System Internet Communication Management Internet Communication settings Turn off Windows Network Connectivity Status Indicator active tests Enabled -------------------------------------------------------------------------- 本地计算机策略 计算机配置 管理模板 网络 网络连接状态指示器 指定企业网站探测URL 指定企业DNS探测主机地址 指定企业DNS探测主机名 指定被动轮询 禁用被动轮询 指定全局DNS 使用全局DNS 系统 Internet通信管理 Internet通信设置 关闭Windows网络连接状态指示器的活动测试 已启用 -------------------------------------------------------------------------- 参[8],缺省情况下,DNS探活时只会在当前被检查的网络接口上发送DNS报文。考虑 一种场景,某网络接口确实公网可达,但系统DNS Server指向127.0.0.1:53/UDP,此 时NCSI拒绝向127.0.0.1:53/UDP发送DNS探活报文,致使DNS探活失败。使用全局DNS 可解决此问题,从Windows 10 build 16299 (1709)开始才有此选项。 上述组策略反映到下列注册表项 -------------------------------------------------------------------------- Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator] "NoActiveProbe"=dword:00000001 "DisablePassivePolling"=dword:00000001 "UseGlobalDns"=dword:00000001 -------------------------------------------------------------------------- reg.exe query "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" 1) 用NoActiveProbe禁用主动探活 NoActiveProbe为1时,同样禁用主动探活,这与EnableActiveProbing是两套机制 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "NoActiveProbe" /t REG_DWORD /d 1 /f reg.exe query "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "NoActiveProbe" reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "NoActiveProbe" /f 2) 禁用被动探活 DisablePassivePolling为1时,禁用被动探活 reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "DisablePassivePolling" /t REG_DWORD /d 1 /f reg.exe query "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "DisablePassivePolling" reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "DisablePassivePolling" /f 3) 使用全局DNS UseGlobalDns为1时,使用全局DNS reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "UseGlobalDns" /t REG_DWORD /d 1 /f reg.exe query "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "UseGlobalDns" reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator" /v "UseGlobalDns" /f ☆ 其他讨论 1) DDoS WWW探活会周期性访问 http://www.msftconnecttest.com/connecttest.txt 若在线路上伪造www.msftconnecttest.com的DNS解析结果,导向某固定IP,量大的话 是不是对目标IP构成DDoS?GFW可以干这事。 微软干这事不需要伪造啥,域名解析指过去,或者下发补丁包时改一下 ActiveWebProbeHost、ActiveWebProbePath,全世界的在线Windows都被导流去打目标。 除了消耗带宽,若微软将www.msftconnecttest.com下线,或者修改connecttest.txt, WWW探活失败,一大票Windows提示"无Internet连接",微软自家网络应用受限,半断 网也挺坑的。后面这种不需要其他大动作,可以不额外安装啥的情况下实施。 2) 隐私泄露 Windows网络探活事实上向微软服务器不停报告Windows系统的存在,有洁癖的可能不 喜这种行为。当然,即使没有网络探活,仍有其他通信前往微软服务器,防不胜防, 此处不展开。 3) 全面禁用探活不能解决问题 Win10全面禁用探活后,铁定出现黄三角或小地球,相当于缺省判定无公网连接,探 活后更新状态。 4) 状态改出的挣扎 (待修正) NCSI探活失败最大可能是DNS出问题了,优先排查DNS,然后手动探活。 zz有台Windows能上公网但出现小地球,帮他排查原因。在NCSI日志中可见 ActiveHttpProbeFailedButDnsSucceeded,手动DNS探活成功,手动WWW探活失败,用 浏览器访问"http://www.msftconnecttest.com/connecttest.txt"失败。发现 "www.msftconnecttest.com"域名解析结果有异,与这台Windows的DNS Server设置有 关,后来修改DNS Server,手动WWW探活成功。 虽然找到探活失败的原因,但始终未能触发新的主动探活,微软官方文档声称的各种 手段都试过了,包括重启OS。通过NCSI日志确定,上次探活失败是几天前,之后再无 新的探活日志。NCSI日志信息表明,主动探活频率相当低,可能很多天才重新来一下。 看过一些贼不靠谱的状态改出案例,比如调整"IPv4校验和分载传输"、"UDP校验和分 载传输",网卡驱动属性里可以改这种值。现在这些校验和默认都是交给网卡计算填 写,可以改成由NDIS协议栈计算填写,后者会降低系统性能。这些人当时之所以状态 改出成功,是因为这种操作会重置协议栈,变相触发新的NCSI探活,这与禁用、启用 网络接口逻辑一致。若"netsh winsock reset"有用,也是变相触发新的NCSI探活。 这些办法在zz的Windows上均未触发新的NCSI探活,原因未明。 5) Hook ncsi!NCSI_INTERFACE_ATTRIBUTES::SetCapability 参[10],github的神奇开源项目,Hook SetCapability,无论实际探活结果如何,都 将Capability(第3形参)设为Internet(2)。作者提到随Wireshark而来的npcap会影响 NCSI探活,他卸了npcap之后再未碰上幺蛾子。 他这个项目适配Win10,不直接适配Win11,后者需要自己折腾一下。 ☆ 专业人员的Cache解决方案 NCSI探活自2008年起,为祸人间有15个年头了,你去放狗,能找到一大票同病相怜者。 这15年来,智障问题引出的扯淡解决方案如过江之鲫层出不穷,但小白们无所谓,某 次凑巧解决了,即算成功,TA们不打算也没能力真正、永久解决这个智障问题。 迄今为止,从专业角度评判,唯一一个广普有效解决方案参[10] https://github.com/dantmnf/NCSIOverride 该方案有一些局限性,非专业人员很可能实施不下去。另一方面,专业人员可不直接 使用该项目,转用windbg达成目的,有很多殊途同归的方案,要点是人工设置 Capability。说到这里,我也挺奇怪的,这么多年过去,对ncsi.dll进行过逆向工程 并愿意分享一种解决方案的人,居然只有[10]的作者一人,赞美之余颇为不解。 我和云海前段时间也对ncsi.dll进行了逆向工程,windbg的种种方案不提也罢。在此 过程中,我们意识到,「公网可达状态」有持久化保存,至少在一定时间范围内持久 化,使得重启OS后即便不探活也判定公网可达。云海唆使我找出Cache所在,或许可 在不依赖windbg的情况下消掉黄三角或小地球,后来我真找到了。介绍一种Cache解 决方案,regedit查看 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Cache 或者命令行查看 reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Cache" reg.exe query "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Cache" /v "OpportunisticInternetGatewaysV4" 若Cache子键下有OpportunisticInternetGatewaysV4键值,修改该键值数据最后4字 节为"ff ff ff 00",然后立即以管理员身份执行: tasklist /svc /fi "services eq NlaSvc" taskkill /f /pid 必须立即杀一次服务进程,杀掉NlaSvc服务进程与正常停止NlaSvc服务进程不等价。 LTSB版Win10在杀服务进程之后,若系统不正常,可能需要重要重启OS恢复;非LTSB 版Win10无需重启OS。 若黄三角或小地球消失,可重启OS验证持久化效果。Win11可能不是NlaSvc服务,我 没Win11,只测了Win10。 若OpportunisticInternetGatewaysV4键值不存在,可手工创建,解码如下: -------------------------------------------------------------------------- 06 // 网关MAC地址长度 ?? ?? ?? ?? ?? ?? // 网关MAC地址 ?? ?? // WIFI名字长度,为0,表示没有WIFI,是有线网卡 ...... // WIFI名字,宽字符串 ff ff ff 00 // -------------------------------------------------------------------------- 当需要手工创建OpportunisticInternetGatewaysV4键值时,对非专业人员太难了。 若想撤销Cache方案,最简办法是删掉OpportunisticInternetGatewaysV4键值: reg.exe delete "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Cache" /v "OpportunisticInternetGatewaysV4" /f Cache方案的优势是,即使全面禁用探活,即使根本没有任何探活动作,仍将判定公 网可达,重启OS后仍然有效。对于误出现的黄三角或小地球,Cache方案无须重启OS 即可立即生效,无须禁用、启用任何网络接口,无须切换WIFI,无须断网重连,不影 响任何已存在的TCP长连接。我个人最爱的方案。 此法测试周期不够,日后若有变化,再来更新本文。 2023-07-08 微软最近的升级好像改变了什么,上述设置重启后不会自动生效,必须杀一次NlaSvc 服务才生效,原因不明。无线网络无此变化,有线网络有此变化,待观察。 ☆ 参考资源 [1] Network Connectivity Status Indicator and Resulting Internet Communication in Windows Vista - [2008-11-25] https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc766017(v=ws.10) [2] NCSI overview - [2023-06-08] https://learn.microsoft.com/en-us/windows-server/networking/ncsi/ncsi-overview [3] An Internet Explorer or Edge window opens when your computer connects to a corporate network or a public network - [2023-03-08] https://learn.microsoft.com/en-us/troubleshoot/windows-client/networking/internet-explorer-edge-open-connect-corporate-public-network [4] How to collect data to diagnose NCSI issues - [2023-06-08] https://learn.microsoft.com/en-us/windows-server/networking/ncsi/ncsi-troubleshooting-guide [5] Answers To common questions about NCSI - [2023-06-08] https://learn.microsoft.com/en-us/windows-server/networking/ncsi/ncsi-frequently-asked-questions If the probe failure was due to traversing a proxy NCSI will set the connectivity state to None. If the failed probe did not traverse (went direct), NCSI will set the connectivity state to Local. [6] INetworkListManager::get_IsConnectedToInternet method (netlistmgr.h) https://learn.microsoft.com/en-us/windows/win32/api/netlistmgr/nf-netlistmgr-inetworklistmanager-get_isconnectedtointernet [7] Manage connections from Windows 10 and Windows 11 operating system components to Microsoft services - [2023-02-17] https://learn.microsoft.com/en-us/windows/privacy/manage-connections-from-windows-operating-system-components-to-microsoft-services (14. Network Connection Status Indicator) Windows Restricted Traffic Limited Functionality Baseline https://download.microsoft.com/download/D/9/0/D905766D-FEDA-43E5-86ED-8987CEBD8D89/WindowsRTLFB.zip (一堆调整组策略的PS脚本) [8] Umbrella Roaming Client: Microsoft Windows Limited Network Connectivity Warning (Yellow Triangle) - [2023-02-17] https://support.umbrella.com/hc/en-us/articles/230900948-Umbrella-Roaming-Client-Microsoft-Windows-Limited-Network-Connectivity-Warning-Yellow-Triangle- [9] How to Fix Connect Attempts to www.msftconnecttest.com on Windows Server 2016 - Chase Smith [2023-05-19] https://networkproguide.com/fix-connect-attempts-to-www-msftconnecttest-com-windows-server-2016/ [10] https://github.com/dantmnf/NCSIOverride https://github.com/dantmnf/NCSIOverride/issues/2