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

整体架构(分层图)

重点能力展开
DevTools 联合调试:从'黑盒跑脚本'到'白盒定位点'
- 内置 Inspector + WebSocket:无需额外依赖,即可接入 Chrome DevTools Protocol,实现断点、调用栈、Scope 变量、Sources 映射等完整链路。
- 多 Context 联动:iframe 的 Context 会被注册到 DevTools,会话内可以直接切换上下文。
反调试:让 debugger; 失效,但保留可控调试入口
- 屏蔽
debugger;:修改 v8,让'debugger'变成空操作,语义失效,不再导致 DevTools 不断暂停。 - 新增
vdebugger;:修改 v8,注入'vdebugger',保留一个只在'独立语句形态'触发的自定义断点语句。



