解决一下 WebView2 不能用 socket5代理的问题。

Android webview在https下实现ssl的双向认证 这篇文章的重点是实现SSL证书双向认证,包含: a.生成客户端与服务端证书。 b.搭建支持Https的服务器。 c.实现webview的双向证书认证。 阅读详情

webview2现在好像还能在启用s5代理的情况下,可以输入账号密码。应该是还没开发这个API。所以曲线解决了一下,记录一下吧。

解决就是自己写代理转发认证一下。直接上代码 

    /// <summary>    /// Socket代理5转发    /// </summary>    public class Socket5Forward    {        #region 类型 Type        #region 私有类型 Private        /// <summary>        /// 进度命令        /// </summary>        private enum Command        {            /// <summary>            /// 默认            /// </summary>            Default,            /// <summary>            /// 连接            /// </summary>            Connection,            /// <summary>            /// 验证            /// </summary>            Validate,            /// <summary>            /// 读写            /// </summary>            ReadWrite        }        /// <summary>        /// 异步状态对象        /// </summary>        private class StateObject        {            /// <summary>            /// 标识            /// </summary>            public long IntID { get; set; }            /// <summary>            /// 客户端-无认证            /// </summary>            public Socket ClientSocket { get; set; }            /// <summary>            /// 客户端-进度            /// </summary>            public Command ClientCommand { get; set; } = Command.Default;            /// <summary>            /// 客户端-数据包            /// </summary>            public List<ArraySegment<byte>> ClientRead { get; set; }            /// <summary>            /// 代理端-需认证            /// </summary>            public Socket ProxySocket { get; set; }            /// <summary>            /// 代理端-进度            /// </summary>            public Command ProxyCommand { get; set; } = Command.Default;            /// <summary>            /// 代理段-数据包            /// </summary>            public List<ArraySegment<byte>> ProxyRead { get; set; }        }        /// <summary>        /// 代理数据        /// </summary>        public class Proxy        {            /// <summary>            /// 代理IP            /// </summary>            public string IP { set; get; }            /// <summary>            /// 代理端口            /// </summary>            public int Port { set; get; }            /// <summary>            /// 代理用户            /// </summary>            public string User { set; get; }            /// <summary>            /// 代理密码            /// </summary>            public string Pass { set; get; }        }        #endregion 私有类型        #region 公开类型 Public        #endregion 公开类型        #endregion 类型        #region 属性 Propertie        #region 私有属性 Private        /// <summary>        /// 代理信息        /// </summary>        private Proxy ObjProxy { get; set; }        /// <summary>        /// 自增标识        /// </summary>        private long IntID { get; set; } = 0;        /// <summary>        /// 服务对象        /// </summary>        private TcpListener ObjServer { get; set; }        #endregion 私有属性        #endregion 属性        #region 构造 Constructor        /// <summary>        /// 构造对象        /// </summary>        /// <param name="sIp">代理IP</param>        /// <param name="nPort">代理端口</param>        /// <param name="sUser">代理用户</param>        /// <param name="sPass">代理密码</param>        public Socket5Forward(string sIp, int nPort, string sUser, string sPass)        {            ObjProxy = new Proxy            {                IP = sIp,                Port = nPort,                User = sUser,                Pass = sPass            };            AddLog(System.Text.Json.JsonSerializer.Serialize(ObjProxy));        }        public Socket5Forward(Proxy oProxy)        {            ObjProxy = oProxy;        }        #endregion  构造        #region 方法 Method        #region 私有方法 Private        /// <summary>        /// 日志        /// </summary>        /// <param name="sMsg"></param>        private static void AddLog(string sMsg)        {            System.Diagnostics.Trace.WriteLine(sMsg);            //Console.WriteLine(sMsg);        }        #region 客户端        /// <summary>        /// 客户端-接受连接        /// </summary>        /// <param name="iAR"></param>        private void ClientAccept(IAsyncResult iAR)        {            AddLog("客户端-连接");            var listener = iAR.AsyncState as TcpListener;            try            {                var oClientSocket = listener.EndAcceptSocket(iAR);                var oProxyScoket = new TcpClient();                var oState = new StateObject                {                    IntID = ++IntID,                    ClientSocket = oClientSocket,                    ClientCommand = Command.Connection,                    ClientRead = new List<ArraySegment<byte>>() { new ArraySegment<byte>(new byte[oClientSocket.ReceiveBufferSize]) },                    ProxySocket = oProxyScoket.Client,                    ProxyRead = new List<ArraySegment<byte>>() { new ArraySegment<byte>(new byte[oClientSocket.ReceiveBufferSize]) }                };                _ = oProxyScoket.BeginConnect(ObjProxy.IP, ObjProxy.Port, ProxyConnect, oState);                _ = listener.BeginAcceptSocket(ClientAccept, listener);            }            catch { }        }        /// <summary>        /// 客户端-读取->转发        /// </summary>        /// <param name="iAR"></param>        private void ClientRead(IAsyncResult iAR)        {            var oState = iAR.AsyncState as StateObject;            try            {                var nRead = oState.ClientSocket.EndReceive(iAR);                if (nRead > 0)                {                    if (oState.ClientCommand == Command.Connection)                    {                        AddLog($"[{oState.IntID}]客户端-请求命令");                        var nFristMethod = oState.ClientRead[0].Array[2];                        _ = oState.ClientSocket.Send(new byte[] { 0x05, nFristMethod });                        oState.ClientCommand = Command.ReadWrite;                    }                    else if (oState.ClientCommand == Command.ReadWrite)                    {                        //var sText = Encoding.UTF8.GetString(oState.ClientRead[0].Array, 0, nRead);                        //AddLog(sText);                        var nSend = oState.ProxySocket.Send(oState.ClientRead[0].Array, nRead, SocketFlags.None);                        AddLog($"[{oState.IntID}]客户端-转发数据包长度:R[{nRead}],S[{nSend}]");                    }                    _ = oState.ClientSocket.BeginReceive(oState.ClientRead, SocketFlags.None, ClientRead, oState);                }                else                {                    AddLog($"[{oState.IntID}]客户端-关闭:长度不足");                    oState.ClientSocket.Close();                    oState.ProxySocket.Close();                }            }            catch (Exception)            {                AddLog($"[{oState.IntID}]客户端-关闭:异常关闭");                oState.ClientSocket.Close();                oState.ProxySocket.Close();            }        }        #endregion        #region 代理端        /// <summary>        /// 代理端-连接完成        /// </summary>        /// <param name="iAR"></param>        private void ProxyConnect(IAsyncResult iAR)        {            try            {                AddLog("代理端已连接");                var oState = iAR.AsyncState as StateObject;                oState.ProxySocket.EndConnect(iAR);                oState.ProxyCommand = string.IsNullOrEmpty(ObjProxy.User) || string.IsNullOrEmpty(ObjProxy.Pass) ? Command.Validate : Command.Connection;                _ = oState.ProxySocket.Send(new byte[] { 0x05, 0x02, 0x00, 0x02 });                _ = oState.ProxySocket.BeginReceive(oState.ProxyRead, SocketFlags.None, ProxyRead, oState);            }            catch { }        }        /// <summary>        /// 代理端-读取->转发        /// </summary>        /// <param name="iAR"></param>        private void ProxyRead(IAsyncResult iAR)        {            var oState = iAR.AsyncState as StateObject;            try            {                var nRead = oState.ProxySocket.EndReceive(iAR);                if (nRead > 0)                {                    //AddLog($"[{oState.IntID}]ProxyRead====nRead > 0 nRead=" + nRead);                    if (oState.ProxyCommand == Command.Connection)                    {                        var arrBuf = oState.ProxyRead[0].Array;                        AddLog($"[{oState.IntID}]代理端-返回连接方法:{arrBuf[0]:x},{arrBuf[1]:x}");                        var oStream = new MemoryStream();                        oStream.WriteByte(0x1);                        oStream.WriteByte((byte)ObjProxy.User.Length);                        oStream.Write(Encoding.ASCII.GetBytes(ObjProxy.User));                        oStream.WriteByte((byte)ObjProxy.Pass.Length);                        oStream.Write(Encoding.ASCII.GetBytes(ObjProxy.Pass));                        _ = oState.ProxySocket.Send(oStream.ToArray());                        oStream.Close();                        oState.ProxyCommand = Command.Validate;                    }                    else if (oState.ProxyCommand == Command.Validate)                    {                        var arrBuf = oState.ProxyRead[0].Array;                        AddLog($"[{oState.IntID}]代理端-返回验证结果:{arrBuf[0]:x},{arrBuf[1]:x}");                        if (arrBuf[1] == 0x0)                        {                            AddLog($"[{oState.IntID}]客户端-接受数据");                            _ = oState.ClientSocket.BeginReceive(oState.ClientRead, SocketFlags.None, ClientRead, oState);                            oState.ProxyCommand = Command.ReadWrite;                        }                        else                        {                            AddLog($"[{oState.IntID}]代理端-认证错误");                            oState.ProxySocket.Close();                            oState.ClientSocket.Close();                        }                    }                    else if (oState.Pro 江西党性培训 www.ctbuganxun.com xyCommand == Command.ReadWrite)                    {                        //var sText = Encoding.UTF8.GetString(oState.ProxyRead[0].Array);                        var nSend = _ = oState.ClientSocket.Send(oState.ProxyRead[0].Array, nRead, SocketFlags.None);                        AddLog($"[{oState.IntID}]代理端-转发数据包长度:R[{nRead}],S[{nSend}]");                    }                    _ = oState.ProxySocket.BeginReceive(oState.ProxyRead, SocketFlags.None, ProxyRead, oState);                }                else                {                    AddLog($"[{oState.IntID}]代理端-关闭:长度不足");                    oState.ProxySocket.Close();                    oState.ClientSocket.Close();                }            }            catch (Exception)            {                AddLog($"[{oState.IntID}]代理端-关闭:异常");                oState.ProxySocket.Close();                oState.ClientSocket.Close();            }        }        #endregion        #endregion 私有方法        #region 公开方法 Public        /// <summary>        /// 开始服务        /// </summary>        /// <param name="nProt"></param>        public void Start(int nProt)        {            AddLog("开始");            try            {                ObjServer = new TcpListener(IPAddress.Any, nProt);                ObjServer.Start();                _ = ObjServer.BeginAcceptSocket(ClientAccept, ObjServer);            }            catch (Exception)            {                ObjServer = null;            }        }        public void Stop()        {            ObjServer?.Stop();        }        #endregion 公开方法        #endregion 方法    }

 

安卓 WebView 动态 Hook 实战:破解 X5/UC/GeckoView 等第三方内核 WebView 是 Android 应用承载 Web 内容与 JSBridge 通信的核心组件,其底层原理依赖于 Java 层封装与 native 渲染引擎协同工作。随着腾讯 X5、UC、GeckoView 及厂商定制内核的广泛采用,标准 android.webkit.WebView 已被深度替换或代理,导致传统 Frida Hook 失效。理解类加载机制、内核初始化时机与接口抽象策略,是实现稳定动态 Hook 的前提。本文聚焦真实逆向场景中的关键挑战:如何精准识别运行时 WebView 实现类、在类加载前 阅读详情

相关推荐

Frida动态分析第三方WebView高级技巧:从定位到对抗反调试

在移动应用安全与逆向工程领域,WebView作为连接原生代码与JavaScript的核心桥梁,其安全性分析至关重要。其原理在于WebView内部实现了复杂的通信机制与网络栈,使得H5页面能与原生功能深度交互。掌握其动态分析技术,对于挖掘客户端漏洞、分析通信协议具有极高的技术价值,尤其在金融、社交等涉及敏感数据的应用场景中。本文聚焦于使用Frida框架对第三方WebView(如腾讯X5内核)进行深度动态分析,提供了从精准定位实例、Hook网络请求层到实时监控JavaScript执行环境,乃至对抗WebView

weixin_30292745的博客 424

使用webview显示url的页面

在编写抓取排名前50的app的小demo时遇到这一

sql340的专栏 1271

Socket.IO 不是 WebSocket:协议原理与生产排障指南

WebSocket 是一种底层双向通信传输协议,而 Socket.IO 是构建于其上的应用层实时通信协议栈,具备自动降级、连接状态管理、消息确认(ACK)、房间隔离等工程化能力。理解其 Engine.IO 握手机制、SID 会话标识、ping/pong 心跳策略及 transport 协商逻辑,是解决 'transport closed before receiving handshake'、'code: 1006'、'打包为app连接不了' 等高频问题的关键。它不追求极致性能,而是通过可配置的可靠性设计,

weixin_32175665的博客 59

android 让webview支持https 双向认证(SSL)

1.用okhttp这个框架用https请求获取到html样式的String类型的数据okhttp 与https 2.利用webView.loadDataWithBaseURL("about:blank",jsonString, "text/html", "utf-8", null);这个方法渲染界面,并展示 程序如下 @SuppressLint({ "JavascriptIn

小熊爱发明的博客 1600

Android 4.4 TLS 1.2兼容方案:OKHTTP集成Conscrypt解决SSL握手失败

TLS(传输层安全协议)是保障HTTPS通信加密与身份验证的核心协议,其版本演进直接决定了网络连接的安全性与兼容性。从原理上看,TLS握手过程需要客户端与服务器协商出双方都支持的协议版本和加密套件。在Android平台上,系统对TLS协议的支持程度随版本迭代而提升,这带来了显著的技术价值:确保应用能在不同系统版本的设备上建立安全、稳定的网络连接。然而,在Android 4.4等旧版本系统中,系统默认的TLS实现存在对TLS 1.2支持不完整或默认关闭的问题,这直接导致了使用OKHTTP等网络库时出现SSL握

weixin_34034261的博客 416

VS Code原生集成微信:逆向IPC协议实现零代理双向通信

微信桌面客户端并非Electron应用,其底层采用自研WXUI框架,通过本地IPC通道(命名管道/Unix Socket)实现模块间通信——这是开发者绕过HTTPS API频控与反调试限制的关键入口。WeChat AHP基于对IPC协议的深度逆向,解析Protobuf消息结构、动态提取AES密钥、精准复现签名校验逻辑(含进程路径哈希、编译时间戳、内存特征码三要素),达成与微信主进程的原生级交互。该方案不依赖WebView、ADB或DLL注入,具备低延迟、跨平台、可审计等工程优势,适用于技术支持、前端联调、微

weixin_28832121的博客 336

WebView2 使用注意事项

前言 最近在项目中尝试了使用WebView2,有些问题,不去尝试真的发现不了,于是记录一下,本次只记录使用的注意事项,如果要看安装及介绍,请看之前的文章: 链接: .Net桌面端开发使用WebView2,可以放弃CefSharp?. 链接:WebView2 使用及现状 环境 运行环境:.Net Framework 4.5.2 (由于我的项目是基于452,所以这里没有用.Net 5) 开发环境:VS2019 16.8.2 框架语言:WPF 注意事项 1、WebView2后面的代码全被覆盖 这个问题在上一篇文章

chenlinhsfl的博客 1万+

钉钉开发(三)——Java推送钉钉待办任务

之前一篇博文中,讲解了如何推送钉钉群消息,感兴趣的可以点击查看。 钉钉开发(一)——Java给钉钉群推送消息

Monten_Cristo的博客 6410

Android 在webview中设置代理

在android1.6之前的api中有有直接的方法来对webview设置代码,但是在之后的API中去掉了。所以只能寻求别的方法来设置代码。 下面代码是用反射原理来对webview设置代理: Java代码   public static boolean setProxy(Context ctx, String host, int port) {  

binyao02123202的专栏 1万+

告别‘报错马拉松’:一份保姆级的Ubuntu 20.04编译OpenWrt 15.05环境配置与问题修复清单

本文提供了一份详细的Ubuntu 20.04编译OpenWrt 15.05的环境配置与问题修复指南,帮助开发者告别‘报错马拉松’。从基础环境搭建到典型报错分类与修复方案,再到高阶问题的深度修复,全面覆盖编译过程中可能遇到的各类问题,并提供自动化补丁脚本和Docker环境固化方案,确保编译过程高效顺畅。

weixin_33230433的博客 295

基于PlatformIO与CMSIS的STM32库函数开发实战:从环境搭建到外设驱动

本文详细介绍了基于PlatformIO与CMSIS的STM32库函数开发实战,从环境搭建到外设驱动实现。通过对比传统IDE,PlatformIO结合CMSIS框架在跨平台开发、代码可移植性和调试体验上更具优势。文章包含PlatformIO.ini配置详解、GPIO/USART驱动开发实例及常见问题解决方案,帮助开发者高效完成STM32项目开发。

weixin_29190169的博客 423

WebView性能优化总结

WebView性能优化总结                                             一个加载网页的过程中,native、网络、后端处理、CPU都会参与,各自都有必要的工作和依赖关系;让他们相互并行处理而不是相互阻塞才可以让网页加载更快:·     WebView初始化慢,可以在初始化同时先请求数据,让后端和网络不要闲着。·     后端处理慢,可以让服务器分trun...

qq_26626431的博客 3941

比例导引算法详解:从理论到Matlab实现(含3D轨迹可视化)

本文深入解析比例导引算法(PNG)的数学原理与Matlab实现,涵盖3D轨迹可视化技术。从基础运动学模型到导航比优化,详细讲解导弹拦截系统的核心算法,并提供Matlab代码示例,帮助读者掌握从理论到实战的全流程。

weixin_33725722的博客 548

socket.io库如何配置socket及express和http/2

将ms server 2012直接升维越级换成了ms server 2022,tls/ssl证书又多了一些坑。于此同时,socket.io库及express的web服务也有了更多的讲究,本文就这4个方面的问题进行论述,以期能帮助你越过我们遇到的“坑”,帮你节省一两天时间。最后,关于微信小程序中使用上述服务,给出了建议的方案。

pulledup的博客 1107

YOLOv13全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 439

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

使用 CDP 驱动 Readest Android WebView:adb 端口转发、运行时 JS 探针与真机调试避坑指南

本指南讲解如何在不重新编译应用的前提下,通过 Chrome DevTools Protocol(CDP)驱动运行中的 Readest Android WebView,在其真实运行环境内执行 JS 探针与性能基准(例如 NativeFile/RemoteFile 文件 I/O 对比研究),并总结实践中反复踩坑的高价值经验。读完本文,你将掌握从「获得可调试构建」到「端口转发 → 目标发现 → Runt

gitblog_00828的博客 432

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VS Code + Codex 插件侧栏不显示、黑屏、一直加载并反复提示窗口未响应的几种解决思路

提供多种VS Code + Codex 侧栏不显示、黑屏、反复提示窗口未响应、进程阻塞,要求重启或宕机时的解决思路。

Pu847044653的博客 7466

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

高级故障排除指南:CC Switch跨平台AI服务代理技术深度解析

CC Switch作为一款面向Claude Code、Codex、OpenCode、OpenClaw、Gemini CLI及Hermes Agent的跨平台桌面全能助手,其核心价值在于提供统一的AI服务供应商管理与代理路由功能。本文从技术实现角度深入解析CC Switch的架构原理,并提供专业级故障排除方案,帮助开发者和技术用户解决实际部署中的复杂问题。 ## 安装部署阶段的技术问题 ###

gitblog_00319的博客 445

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ArkWeb(方舟Web)仓颉 API 与 Webview 错误码全解析:ohos.web.webview 模块实战指南

ArkWeb(方舟Web)是 OpenHarmony 上基于 Chromium 内核(当前为 M114)的 Web 能力底座,本文围绕其仓颉语言接口模块 `ohos.web.webview`(对应 Kit 名 `kit.ArkWeb`)展开,系统梳理 `WebviewController`、`WebCookieManager`、`BackForwardList`、`HistoryItem` 等核心

gitblog_00195的博客 439

uniapp接入海康H5Player实战:解决白屏、WS协议与RTSP兼容问题

H5Player是海康威视提供的Web端视频播放SDK,依赖浏览器原生能力如MediaSource Extensions(MSE)、WebSocket(WS)和HLS协议实现音视频渲染。其核心原理是将RTSP信令流经私有网关封装为WS隧道传输,或通过HTTP拉取HLS分片,再由JavaScript解码注入video元素。技术价值在于跨平台复用、低延迟实时监控与企业级安防集成能力,广泛应用于物业巡检、工厂AI质检、远程运维等场景。然而在uniapp中直接嵌入常遇白屏、连接失败等问题,根源在于WebView协议

weixin_34284188的博客 405

ZeroTermux 内置命令手册解析:ssh-agent 私钥代理与免密认证实战指南

本篇指南以 ZeroTermux 内置命令文档 [ssh-agent.md](https://link.gitcode.com/i/55ffc865b3077c8e37ea2f5251333ee1) 为核心,系统讲解 `ssh-agent` 私钥代理的工作原理、命令行语法、常用选项与实战组合(配合 `ssh-add` 完成私钥托管与自动认证),并结合仓库源码展示该命令文档在应用内的加载机制以及 Z

gitblog_00103的博客 658

本地优先AI编码代理:Electron+Rust桌面应用实践

本地优先AI编码代理是一种将大语言模型推理、代码上下文分析与安全执行全部置于用户设备端的开发范式,其核心原理是通过进程隔离、内存沙箱与离线符号索引实现可控性与合规性。相比云端API调用,该方案显著提升数据隐私保障与离线可用性,技术价值体现在审计透明、低延迟响应与嵌入式/工控等受限环境适配能力。典型应用场景包括企业内网开发、教育沙盒教学、航空/电力等离线编程现场,以及对模型行为需实时审查的安全敏感项目。本文以PI-Desktop为例,深入解析Electron与Rust双引擎协同机制及本地LLM集成实践。

weixin_30342363的博客 96

ws-scrcpy Devtools 实践:将 Android 设备的 WebKit 调试 Socket 转发到浏览器

ws-scrcpy 内置的 Devtools 功能可以把 Android 设备上 WebKit 的 debug socket(即 `devtools_remote_*` 本地 socket)通过 adb 转发到浏览器,让你在 PC 端的 Chromium 系浏览器里用 DevTools 调试手机上的网页和 WebView。读完本文,你将了解这条链路在服务端、客户端两侧的完整实现:服务端如何发现设备

gitblog_00611的博客 211
上一篇: CesiumJS 2022^ 原理[1] 使用 requestAnimationFrame 循环触发帧动画
下一篇: 华为云TICS解决联邦计算过程中的流程感知问题
cmdos
博客等级 码龄19年 83粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值