环境:Android Wechat 8.0.69
目标:让 chrome://inspect 能看到并调试微信内打开的 H5 网页 (真实 DOM / Console / Network / 断点), 不包括小程序
微信有两套浏览器内核
微信打开网页不是用一个固定的浏览器,而是在 XWeb 框架下可选多个内核。本文只关心两个:
Pinus 是腾讯基于 Chromium 自研裁剪的浏览器内核(源码路径里叫 weblayer,基于 Chrome 116),
以 libxwebcore.so(135MB)的形式打包在微信里,类名 com.tencent.xweb.pinus.sdk.WebView,
内核类型枚举值 WV_KIND_PINUS
它的调试不走标准通道:Pinus 不开标准的 webview_devtools_remote 调试端口,而是走微信
自己的私有远程调试(往 xweb.weixin.qq.com 拨 WebSocket 隧道),chrome 连不上
就是 Android 系统自带的 WebView(本机是 libmonochrome_64.so,171MB,Chrome 130),
内核类型 WV_KIND_SYS。它是标准 Chromium,开启调试后会 bind 标准的
webview_devtools_remote_<pid> 端口,chrome://inspect 直接就能连
调用 android.webkit.WebView.setWebContentsDebuggingEnabled(true) 想开调试但因为渲染页面的是 Pinus,开调试端口的却是系统 WebView。所以 chrome://inspect 里能看到"远程浏览器",却没有可点的 page。
强制微信用系统 WebView 渲染 H5 + 开启系统 WebView 调试。 setWebContentsDebuggingEnabled(true) 只对 系统 WebView 那套生效
代码里直接读出三点:
串起来:往 xweb_debug 写 HardCodeWebViewmm = WV_KIND_SYS → u0.c("mm") 返回 SYS → H0 采用、返回 SYS → I0/J0 写进 WebView.m → 系统内核渲染、标准调试端口有页面。
核心前提:hookDevTools 只要保证 WebView.H0 在首次点开 H5 网页之前被 hook 住即可。
注入进程:UI 进程 com.tencent.mm(无后缀)。它是最终渲染 H5、H0 选择内核的进程。
完整流程:
Native 模块:
libxwebcore.so Pinus 私有调试函数(libxwebcore.so.i64):
提取 libxwebcore.so:解 split_delivery.config.arm64_v8a.apk → 取 libxwebfullpack.so
(是个 zip)→ 再解出 libxwebcore.so。
提取 libmonochrome_64.so:从 com.google.android.trichromelibrary_* 的 base.apk
取 lib/arm64-v8a/libmonochrome_64.so。
| 符号 |
作用 |
com.tencent.xweb.f1 |
内核类型枚举 (WV_KIND_*) |
com.tencent.xweb.WebView.H0(f1, String) |
内核决策入口 (getPreferedWebviewType) |
com.tencent.xweb.WebView.m |
缓存已决策内核的静态字段 |
com.tencent.xweb.u0.c(String) |
从 xweb_debug SP 读 HardCodeWebView |
br5.z3.f() |
打开 SharedPreferences “xweb_debug” |
com.tencent.xweb.pinus.sdk.WebView |
Pinus 内核 WebView |
[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!