iv8:基于 V8 的 C++ 浏览器补环境框架

iv8:基于 V8 的 C++ 浏览器补环境框架

补环境的本质是对抗检测,靠 JS 层模拟,总会遇到难以彻底复刻的检测点,比如 document.all、跨域/跨 Context 的身份同一性等。

与其在 JS 层疲于奔命地“修修补补”,不如深入 C++ 层,在 V8 之上重筑一套原生的浏览器运行时。iv8 的监控不依赖 JS Proxy,而是通过 V8 回调封装与通用属性拦截器,实现统一的 API 访问追踪。整体架构对齐 Chromium 的 ScriptWrappable/WrapperTypeInfo,并采用基于 v8::Global<> 的强引用方案配合显式释放,避免句柄滞留导致的内存占用累积,同时也避免引入 cppgc 带来的额外复杂度。

本文是一次阶段性总结:把 iv8 的动机、关键设计取舍、踩坑经验与现阶段结论整理出来,方便后续迭代与复用。它不是“完整复刻 Chromium”的承诺,而是一套在真实对抗场景中可落地的工程化探索。部分能力仍遵循“最小可用/先对齐可观测外壳”的策略逐步完善。

目前框架已在 BOSS、瑞树 6、阿里 231 等场景测试通过:BOSS 抗更新稳定采集;瑞树从构建 DOM、执行 3 段 JS、触发 load 事件到产出第二次 Cookie 耗时 40ms左右;阿里 231 配合轨迹算法,10 并发跑 1000 次,100% 通过率。

实测结果(节选)

瑞树 6

在这里插入图片描述

阿里 231

![在这里插入图片描述](https://i-blog.ZEEKLOGimg.cn/direct/703c7eda4c5d4a3c9eff9fcf10a87aed.png

整体架构(分层图)

在这里插入图片描述

重点能力展开

DevTools 联合调试:从“黑盒跑脚本”到“白盒定位点”

  • 内置 Inspector + WebSocket:无需额外依赖,即可接入 Chrome DevTools Protocol,实现断点、调用栈、Scope 变量、Sources 映射等完整链路。
  • 多 Context 联动:iframe 的 Context 会被注册到 DevTools,会话内可以直接切换上下文。

反调试:让 debugger; 失效,但保留可控调试入口

  • 屏蔽 debugger;:修改v8,让“debugger”变成空操作,语义失效,不再导致 DevTools 不断暂停。
  • 新增 vdebugger;:修改v8,注入“vdebugger”,保留一个只在“独立语句形态”触发的自定义断点语句。

consolevconsole:调试通道与对抗语义解耦

  • 背景:许多站点会把 console 当成检测入口,利用 DevTools 的格式化/对象预览展开触发 getter、toString 等副作用,用来探测“是否打开 DevTools”或制造可观测差异。
  • 策略:修改v8,devtools模式不再注入console,注入自定义“vconsole”,需要调试输出时用 vconsole 作为独立通道,把调试与对抗语义解耦。

watch_apis:命中自动触发断点(debugger),快速定位关键调用链

  • 解决什么痛点:混淆/动态函数名/eval 很多时,很难定位“到底是谁在读写关键浏览器 API / 关键对象(属性)”,导致逆向排查效率极低。
  • 核心价值:启用 DevTools 模式下,把候选 API(含反射入口)加入 watch 列表,一旦命中就自动触发断点(debugger)并暂停;直接从调用栈回溯到“谁在用、在哪用”,比追日志更快,也比手工下断点更稳。

命中:script.getAttribute

在这里插入图片描述

统一监控(含反射层):可观测性是补环境提效的关键

  • 方法/访问器监控:记录调用路径、参数、返回值与异常语义,区分“实例访问 vs 原型访问”等。
  • 通用属性拦截:覆盖 data property 的读写、缺失点发现,并在常见反射路径上保持语义一致(避免误报/避免破坏原型链行为)。
  • 反射层监控:对 Object.keys/getOwnPropertyNames/getOwnPropertySymbols/defineProperty...Reflect.get/has/ownKeys...Function.prototype.toString 等“高频检测入口”提供监控与(可选的)自动断点。

文档加载流水线:离线快照加载(Chromium-like DocumentLoadPipeline)

  • 目标:把“离线跑脚本”做成更接近 Chromium 的加载时序:解析 HTML → 遇到 <script> → 获取/执行(含 microtasks checkpoint)→ 继续解析,并同步驱动 readyState/DOMContentLoaded/load 的阶段边界,避免站点依赖加载顺序导致跑不通。
  • 输入形态(离线快照)baseURL + html,以及可选的外链脚本/样式离线 bundle(无真实网络也能尽量还原“脚本何时执行/样式何时生效”的关键语义)。
  • 设计约束:同步、确定性、可回放;不引入后台线程/后台计时器,避免批量跑时出现不可控副作用/漂移。

布局与几何闭环:验证码优先,非真实渲染

  • 目标:不做真实渲染,但保证脚本常读的几何 API(offsetWidth/offsetHeight/getClientRects/getBoundingClientRect稳定、内部一致、可解释;优先解决滑块/验证码与现代页面“读几何→分支行为→过风控”的关键路径。
  • 字体/指纹相关:虚拟字体度量(纯配置/纯算法,不依赖宿主机字体 API),可用 fonts.metrics 做多套 profile 切换,覆盖“字体指纹 + 几何闭环”常见检测。
  • 布局相关:layout-only CSS + selector/cascade,支持 <style>/<link rel=stylesheet>,外链 CSS 可由离线 bundle 提供给加载流水线消费。

可信输入注入通道(isTrusted=true)

  • 语义对齐:JS 标准 EventTarget.dispatchEvent(...) 路径强制 isTrusted=false(页面脚本无法伪造 trusted 输入),避免破坏浏览器语义。
  • 平台层注入:提供 Mouse/Pointer 等输入注入,以及组合级“拖拽”能力(handle + trajectory → down/move/up)
  • 与时间/队列联动:轨迹点可携带时间增量,内部推进逻辑时间并按步驱动队列,便于对齐验证码常见的“时序 + 输入”联合检测。

iframe/Worker 隔离:Split Window Model + Worker 独立运行时

  • Split Window Model:保证 WindowProxy 身份稳定;iframe 之间 Context 隔离,避免跨 iframe 污染导致“指纹不一致/对象身份不对”这种硬检测。
  • Worker 最小可运行环境:提供独立 globalThis/self 与最小脚本加载能力(data/blob/file),覆盖站点把签名/风控逻辑丢进 Worker 的常见做法。
  • 价值:把“隔离”与“同源一致性”收敛到统一模型,降低跨 Context/跨线程的检测风险与补环境复杂度。

事件循环 + 逻辑时间:让异步与时间变成“可控变量”

  • 任务队列机制:宏任务/微任务/定时器等队列分离并可控驱动,解决“Promise/Timer 时序稍有偏差就跑不出结果”的典型问题。
  • 逻辑时间推进:不依赖系统时间,通过逻辑推进生成确定性时间戳序列,便于回放/对比,也便于批量跑时保持结果稳定。

环境配置:把“散落的指纹点”收敛成一套可控配置

  • 一份 profile 收敛/切换指纹点:用一份“环境配置 / profile”集中管理 UA/UA-CH、语言/时区、平台、字体度量、WebGL 能力、功能暴露面等关键指纹点;跑不同目标站/不同设备画像时只需要切换 profile,而不是到处打补丁。
  • 初始化期生效(从启动就一致):配置在初始化阶段生效,保证脚本从第一行开始读取到的环境一致,避免“先读后改”造成的语义漂移。
  • 跨 Context 一致性:主页面与 iframe/Worker 等上下文共享同一画像配置来源,减少跨上下文指纹分叉与可检测漂移。

ScriptOrigin ResourceName:堆栈资源名对齐(过检测 + 可定位)

很多站点会主动触发异常/构造 Error,读取并分析 stack,用“资源名是否符合预期 URL 形态”等信号做检测。iv8 在执行脚本时支持传入 name,把它写入 V8 的 ScriptOrigin(ResourceName),从而让堆栈里的资源名更接近 Chromium 行为;同时也能让 DevTools 的 Sources/调用栈更可读,便于定位。

未来计划

  1. 逐步完善框架
  2. 引入chromium网络栈

Read more

Flutter 三方库 build_cli_annotations 的鸿蒙化适配指南 - 注解驱动的参数解析、自动化命令生成与高效开发工具链构建实战

Flutter 三方库 build_cli_annotations 的鸿蒙化适配指南 - 注解驱动的参数解析、自动化命令生成与高效开发工具链构建实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 build_cli_annotations 的鸿蒙化适配指南 - 注解驱动的参数解析、自动化命令生成与高效开发工具链构建实战 前言 随着 Flutter for OpenHarmony 生态的日益庞大,开发者面临的不仅仅是 UI 适配,还有日益繁琐的项目管理和自动化脚本开发。如何快速编写一个高性能、强类型的命令行工具(CLI),用来自动化执行鸿蒙环境检测、包管理或是代码分发? 传统的 args 库虽然强大,但在处理复杂的多级子命令和参数校验时,代码会迅速变得难以维护。 build_cli_annotations 配合 build_cli 库,为我们提供了一种“代码即文档”的优雅方案。通过在 Dart 类上添加简单的注解,即可自动生成健壮的参数解析逻辑。本文将详细讲解这一技术在鸿蒙开发辅助脚本中的实战落地,助力开发者打造极致的自动化工具链。

By Ne0inhk
Flutter 组件 hydrated_mobx 的适配 鸿蒙Harmony 实战 - 驾驭自动化状态持久化、实现鸿蒙端 UI 状态在重启与多任务切换时的无缝恢复方案

Flutter 组件 hydrated_mobx 的适配 鸿蒙Harmony 实战 - 驾驭自动化状态持久化、实现鸿蒙端 UI 状态在重启与多任务切换时的无缝恢复方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 hydrated_mobx 的适配 鸿蒙Harmony 实战 - 驾驭自动化状态持久化、实现鸿蒙端 UI 状态在重启与多任务切换时的无缝恢复方案 前言 在鸿蒙(OpenHarmony)生态的深度体验中,用户对“断点续作”有着天然的期待。想象一下,用户正在你的鸿蒙平板 App 上填写一份复杂的表单,或者正在调整一个精密的编辑器参数,此时突然接到了一个紧急的鸿蒙系统推送流转,导致 App 被切入后台甚至因为内存压力被系统回收。 当用户再次点击图标回到 App 时,看到的是冷冰冰的初始化界面,还是瞬间恢复到上一次操作的完美现场? hydrated_mobx 为 Flutter 开发者提供了一套近乎魔法的状态持久化方案。它是对经典 MobX 的强力增强,通过简单的注解或扩展,就能让你的 Store 自动具备“

By Ne0inhk
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南

Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南

引言 在工业物联网场景中,时序数据的存储与处理常面临“数据孤岛”困境——生产设备产生的原始数据需经过清洗、聚合、转换等多步处理,才能转化为可分析的业务指标。Apache IoTDB的查询写回(INTO子句)正是破解这一痛点的“数据炼金术”。通过SELECT INTO语句,能将查询结果直接写入新序列,实现“查询-转换-存储”的闭环,相当于在数据库内部构建轻量级ETL管道。 Apache IoTDB 时序数据库【系列篇章】: No.文章地址(点击进入)1Apache IoTDB(1):时序数据库介绍与单机版安装部署指南2Apache IoTDB(2):时序数据库 IoTDB 集群安装部署的技术优势与适用场景分析3Apache IoTDB(3):时序数据库 IoTDB Docker部署从单机到集群的全场景部署与实践指南4Apache IoTDB(4):深度解析时序数据库 IoTDB 在Kubernetes 集群中的部署与实践指南5Apache IoTDB(5)

By Ne0inhk
【Linux】进程状态

【Linux】进程状态

1.进程状态 一般操作系统的进程状态如下,各个具体的操作系统都会包含但可能实现的具体方式不同 1.1运行状态–R cpu会维护一个运行队列来通过调度器挑选合适的进程放入cpu中运行,已知管理进程就是管理pcb,将它们用双向列表维护起来放入运行队列中获取头尾指针进行查找.已经在cpu中运行的进程状态为R,但只要存在于运行队列中,代表进程已准备好可以随时被调度,就称之为运行态R 时间片概念 一个进程不是放到cpu中一直执行完毕才会把自己放下来,若这样来一个无限循环那么其他进程就无法运行了电脑就只能一直显示循环,所以为了避免这种状况引入时间片概念,在pcb中操作系统会为每个进程分配,时间片不是固定,可能在不同操作系统,优先级,系统负载下都会发生动态变化. 所以当一个进程在cpu上执行达到时间片限制就会执行下一个,在同一个时间段内所有的进程代码都会被执行,称为并发执行.由于cpu执行速度很快我们无法准确感知,会认为所有进程一起运行,其实存在大量的进程切换 对进程管理实际上是对软件进行管理因为进程内有对应的代码和数据 1.2阻塞状态 首先了解管理硬件资源也是先描述再组织,一定有对

By Ne0inhk