android13 系统强制wifi连接到内网,假装具有互联网能力

packages\modules\Wifi\service\java\com\android\server\wifi\WifiNetworkSelector.java

cpp 复制代码
    /**
     * Check if current network has internet or is expected to not have internet
     */
    public boolean hasInternetOrExpectNoInternet(WifiInfo wifiInfo) {
        WifiConfiguration network =
                mWifiConfigManager.getConfiguredNetwork(wifiInfo.getNetworkId());
        if (network == null) {
            return false;
        }
        //return !network.hasNoInternetAccess() || network.isNoInternetAccessExpected();
		return true;
    }

强制返回true,前面的几篇都不要看了,没用

packages\modules\NetworkStack\src\com\android\server\connectivity\NetworkMonitor.java

cpp 复制代码
private CaptivePortalProbeResult isCaptivePortal(ValidationProperties properties,
            URL[] httpsUrls, URL[] httpUrls, URL fallbackUrl) {
    // 内网专属修改:强制返回检测成功,彻底跳过所有外网探针/门户检测
    validationLog("Internal network: skip all captive portal and internet probe check");
    return CaptivePortalProbeResult.success(CaptivePortalProbeResult.PROBE_UNKNOWN);

    // 以下原代码全部保留,无需做任何修改
    if (!mIsCaptivePortalCheckEnabled) {
        validationLog("Validation disabled.");
        return CaptivePortalProbeResult.success(CaptivePortalProbeResult.PROBE_UNKNOWN);
    }

    URL pacUrl = null;

    // On networks with a PAC instead of fetching a URL that should result in a 204
    // response, we instead simply fetch the PAC script.  This is done for a few reasons:
    // 1. At present our PAC code does not yet handle multiple PACs on multiple networks
    //    until something like https://android-review.googlesource.com/#/c/115180/ lands.
    //    Network.openConnection() will ignore network-specific PACs and instead fetch
    //    using NO_PROXY.  If a PAC is in place, the only fetch we know will succeed with
    //    NO_PROXY is the fetch of the PAC itself.
    // 2. To proxy the generate_204 fetch through a PAC would require a number of things
    //    happen before the fetch can commence, namely:
    //        a) the PAC script be fetched
    //        b) a PAC script resolver service be fired up and resolve the captive portal
    //           server.
    //    Network validation could be delayed until these prerequisities are satisifed or
    //    could simply be left to race them.  Neither is an optimal solution.
    // 3. PAC scripts are sometimes used to block or restrict Internet access and may in
    //    fact block fetching of the generate_204 URL which would lead to false negative
    //    results for network validation.
    final ProxyInfo proxyInfo = mLinkProperties.getHttpProxy();
    if (proxyInfo != null && !Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) {
        pacUrl = makeURL(proxyInfo.getPacFileUrl().toString());
        if (pacUrl == null) {
            return CaptivePortalProbeResult.failed(CaptivePortalProbeResult.PROBE_UNKNOWN);
        }
    }

    if ((pacUrl == null) && (httpUrls.length == 0 || httpsUrls.length == 0
            || httpUrls[0] == null || httpsUrls[0] == null)) {
        return CaptivePortalProbeResult.failed(CaptivePortalProbeResult.PROBE_UNKNOWN);
    }

    long startTime = SystemClock.elapsedRealtime();

    final CaptivePortalProbeResult result;
    if (pacUrl != null) {
        result = sendDnsAndHttpProbes(null, pacUrl, ValidationProbeEvent.PROBE_PAC);
        reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, result);
    } else if (mUseHttps && httpsUrls.length == 1 && httpUrls.length == 1) {
        // Probe results are reported inside sendHttpAndHttpsParallelWithFallbackProbes.
        result = sendHttpAndHttpsParallelWithFallbackProbes(properties, proxyInfo,
                httpsUrls[0], httpUrls[0], fallbackUrl);
    } else if (mUseHttps) {
        // Support result aggregation from multiple Urls.
        result = sendMultiParallelHttpAndHttpsProbes(properties, proxyInfo, httpsUrls,
                httpUrls);
    } else {
        result = sendDnsAndHttpProbes(proxyInfo, httpUrls[0], ValidationProbeEvent.PROBE_HTTP);
        reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, result);
    }

    long endTime = SystemClock.elapsedRealtime();

    log("isCaptivePortal: isSuccessful()=" + result.isSuccessful()
            + " isPortal()=" + result.isPortal()
            + " RedirectUrl=" + result.redirectUrl
            + " isPartialConnectivity()=" + result.isPartialConnectivity()
            + " Time=" + (endTime - startTime) + "ms");

    return result;
}
相关推荐
hai_android4 分钟前
FusibleFlow:Kotlin Flow 的融合机制原理
android·kotlin
龚寿生21 分钟前
23-敏捷开发实战:从Scrum到看板的团队协作方法论
android·学习·scrum·敏捷流程
zhangguojia72 小时前
Activity启动流程(四):从setContentView到View树创建与Window挂载
android
三少爷的鞋4 小时前
Kotlin 2026:裁员、AI、Rust——黄金时代结束了吗?Jake Wharton 为你解答
android
alexhilton4 小时前
从零开始的架构测试套件
android·kotlin·android jetpack
finhaz5 小时前
台电x98plus在安卓x86的使用
android·平板·安卓x86
事圆则缓6 小时前
遗留项目改造实战指南:从可读性、代码质量到性能和 AI 约束
android·ai·代码规范
mmsx6 小时前
Android 手簿 ADB 无线调试全攻略:USB 转 WiFi 一键连接
android·前端
律宏阔7 小时前
Android WebRTC + H.265 适配记录
android