为逆向工程师构建的浏览器
项目起源与初始挑战
作者的工作涉及AST转换、浏览器指纹识别和反机器人绕过,但现有工作流(手动分析脚本、使用Webcrack等工具)仍显低效。目标是构建一个集成了多种逆向工程功能的浏览器,成为“瑞士军刀”般的工具。
最初计划通过Chrome扩展实现。尝试在内容脚本中挂钩JavaScript函数(如Array.prototype.push),但因内容脚本运行在隔离环境中而失败。随后尝试向页面注入<script>标签,但同样因时机问题未成功。
关键突破:使用CDP与Electron原型
作者转向使用Chrome DevTools Protocol(CDP)。发现Page.addScriptToEvaluateOnNewDocument方法可以在页面脚本运行前注入代码,从而成功挂钩函数。使用Electron快速构建了原型,能够监控如Canvas API(toDataURL)等函数调用,并在侧边栏显示事件。
遇到OOPIF挑战与解决方案
当针对使用Cloudflare Turnstile的网站进行测试时,发现因Turnstile运行在沙盒化的、跨进程的iframe(OOPIF)中,注入的钩子无法生效。通过监听CDP的Target.attachedToTarget事件并自动附加到新目标,实现了在OOPIF中注入代码,成功捕获了事件。
应对反检测:深入浏览器底层
简单的JavaScript运行时挂钩容易被反机器人脚本检测(例如通过检查函数的toString()或name属性)。修补这些漏洞如同“打地鼠”,且可能引入新的检测点。
因此,作者决定分叉Chromium。在Blink层(渲染引擎)直接修改toDataURL等API的实现,通过创建自定义的CDP域(名为“Snitch”)来发射事件。这种方式不修改JavaScript原型,从而更加隐蔽。
工具的其他核心功能
- 反混淆:自动检测并尝试使用集成工具(如deobfuscate.io)反混淆加载的JavaScript文件。
- 属性与函数覆盖:允许用户定义自定义脚本,覆盖跨所有框架(包括OOPIF)的函数或属性,且能绕过常见的完整性检查。
- 指纹负载解密:针对已知的指纹采集器(如FingerprintJS),自动拦截其外发请求,并解密/解码负载,以结构化形式展示。
现状与未来计划
项目已从周末原型发展为功能强大的研究工具。未来目标包括:
- 摆脱Electron:将UI直接嵌入Chromium,以减少体积和潜在的泄漏。
- 全面挂钩:探索在V8引擎层面或通过修改IDL代码生成器,在构建时自动插入钩子,以实现更深入、全面的API监控。
- 是否开源:尚未决定是否将此工具开源。
附录:收集的Canvas指纹示例
文章最后展示了在研究过程中从TikTok、FingerprintJS、Cloudflare等网站收集到的多样化canvas指纹图像及其生成代码。