尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Chameleon时区伪装深度解析:完整替换Date API的逆向指南

Chameleon时区伪装深度解析:完整替换Date API的逆向指南 Chameleon时区伪装深度解析完整替换Date API的逆向指南【免费下载链接】chameleonWebExtension port of Random Agent Spoofer项目地址: https://gitcode.com/gh_mirrors/chamel/chameleonChameleon 是一款浏览器 WebExtension 插件其核心能力之一是时区伪装——它通过完整替换Date对象及其全部原型方法让网页代码以为用户身处任意时区。本文带你逆向这套机制搞懂它是如何用不到 350 行代码把 20 多个 API 全部劫持的。网站是怎么探测你真实时区的任何指纹检测库只需几行代码就能拿到你的时区new Date().getTimezoneOffset() // 返回 UTC 偏移分钟数 Intl.DateTimeFormat().resolvedOptions().timeZone // 返回时区 ID这两个值来自浏览器底层普通脚本无法修改。Chameleon 的思路不是欺骗返回而是直接把整个Date类替换成自己写的版本让所有依赖 Date 的代码都走它的逻辑。整体架构三个模块协作时区伪装涉及三个核心文件模块文件职责时区伪装代码src/lib/spoof/timezone.ts生成注入页面的 Date 替换脚本时区数据源src/lib/tz.ts提供 560 个 IANA 时区 ID注入引擎src/lib/inject.ts组装最终注入脚本并执行流程简述用户在下拉框选择一个时区 → 引擎查询 IANA 时区信息 → 将伪装代码拼接为自执行脚本 → 注入当前页面及所有 iframe。Date API 是如何被完整替换的构造函数劫持替换的核心是一个自定义函数它不再继承原生Date而是内部调用原Date后重新包装调用new ORIGINAL_DATE(...arguments)拿到真实时间通过Intl.DateTimeFormat把真实时间换算到目标时区把换算结果缓存到WeakMap中后续 getter 都从缓存读取若new被省略当函数调用返回字符串而非对象原型方法逐体重写Date.prototype上的 20 个方法全部被替换分为两组Getter 组getDate、getDay、getFullYear、getHours、getMinutes、getMonth、getTimezoneOffset每个方法内部先检查缓存若无缓存则调用modifyDate(this)重新计算然后从目标时区的 Date 对象上取值。Setter 组setDate、setFullYear、setHours、setMilliseconds、setMonth、setSeconds、setTime先执行原始 setter 修改时间戳再重新触发modifyDate更新缓存保证后续读取一致。字符串方法组toDateString、toString、toTimeString、toJSON、toLocaleString、toLocaleDateString、toLocaleTimeString这组最关键——指纹库最爱看字符串输出。处理方式用目标时区 Date 调用原方法生成字符串replaceName()函数把字符串中出现的真实时区缩写长名/短名各 2 份替换为目标时区缩写toString和toTimeString额外拼接GMT偏移量和时区全称所有 setter 方法都做了 NaN 兜底防止无效日期导致崩溃。Intl.DateTimeFormat 与 window.open 的同步伪装只替换Date还不够——Intl.DateTimeFormat能绕过 Date 直接读取系统时区。Chameleon 在 src/lib/inject.ts 中做了双重拦截替换Intl.DateTimeFormat构造函数无论页面传什么参数都在内部强制注入timeZone为目标时区 ID再调用原始实现拦截window.open新窗口继承同一个伪装过的Date和Intl.DateTimeFormat防止跨窗口时区不一致此外所有 DOM 节点操作方法appendChild、innerHTML等被 patch检测到iframe插入时自动向子 frame 注入同一套伪装代码。反检测技巧伪装成原生代码指纹检测常通过以下方式识别 hookDate.toString() // 期望 function Date() { [native code] }Chameleon 的对策每个被替换函数都通过Object.defineProperty重写toString返回function 方法名() { [native code] }重写name属性让fn.name返回正确的方法名将原始Date引用重命名为随机标识符随机字母随机 base36 字符串避免字符串搜索找到ORIGINAL_DATEDate.length被锁定为7与原生构造函数参数数量一致Date.UTC、Date.now、Date.parse保持指向原生实现防止typeof检查异常时区数据从哪来560 个时区 ID 硬编码在 src/lib/tz.ts 中格式为 IANA 标准Asia/Shanghai、America/New_York等同时携带 UTC 偏移字符串用于 UI 展示。实际偏移计算由moment-timezone库完成它内置了完整的夏令时规则表确保冬夏切换时偏移量自动正确。配置时区伪装默认值、IP 联动与白名单在选项页 src/options/App.vue 中时区下拉框提供三种模式default使用系统真实时区具体时区 ID伪装到指定时区ip根据当前出口 IP 自动推断时区通过后台请求 IP 定位服务获取白名单规则可以按站点粒度独立配置时区与主设置互不干扰。设置变更在 src/lib/chameleon.ts 中通过tempStore.ipInfo.tz缓存 IP 推断结果避免每次切换页面都重新请求。快速上手启用时区伪装打开扩展选项页找到Timezone下拉框选择目标时区如Europe/London、Asia/Tokyo或ip自动匹配保存后刷新已打开的标签页伪装即生效在控制台执行new Date().toString()应看到目标时区的 GMT 偏移和时区名称如果某些网站行为异常可将该站点加入白名单并设为real真实环境或spoofed使用伪装避免全局规则影响登录验证等敏感场景。总结Chameleon 的时区伪装本质上是一套运行时 API 劫持框架用Intl.DateTimeFormat做时区数学运算用WeakMap缓存伪造结果用Object.defineProperty抹平检测痕迹最终实现Date全家桶 Intl 跨窗口/跨 frame 三层一致的时区欺骗。理解这套机制后你就能把它当作浏览器 API 逆向工程的教科书案例来参考。【免费下载链接】chameleonWebExtension port of Random Agent Spoofer项目地址: https://gitcode.com/gh_mirrors/chamel/chameleon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表