“补环境”是 JS 逆向工程中的核心高级技术,主要用于应对瑞数(RuiShu)、Akamai、F5 等强对抗型反爬系统。其核心逻辑是在 Node.js 等非浏览器环境中,手动模拟出浏览器特有的对象(BOM、DOM)和行为,欺骗服务器端的检测脚本。
浏览器执行 JS 的上下文(window)与 Node.js 执行 JS 的上下文(global)差异巨大。反爬 JS 代码会检查这些差异(如 window.navigator 是否存在,document.cookie 是否可写)来判断当前环境是否为真实浏览器。
这是补环境最关键的调试工具。通过 Proxy 拦截所有对象属性的读取,我们可以准确知道反爬代码到底检测了什么。
// 简易递归代理框架,用于捕获缺少的环境
function getProxy(obj, name) {
return new Proxy(obj, {
get: function(target, prop) {
// 排除一些 Node 内部调用的干扰属性
if (typeof prop === 'symbol' || prop === 'inspect') {
return target[prop];
}
console.log(`[读] ${name}.${String(prop)}`);
const val = target[prop];
// 如果属性值是对象,继续递归代理
if (typeof val === 'object' && val !== null) {
return getProxy(val, `${name}.${String(prop)}`);
}
return val;
},
set: function(target, prop, value) {
console.log(`[写] ${name}.${String(prop)} = ${value}`);
target[prop] = value;
return true;
}
});
}
// 挂载到 window
window = getProxy({}, "window");
window.window === window,window.self === window,[window.top](<http://window.top>) === window (在无 iframe 时)。这必须严格模拟。global 变量如果不小心泄漏到 JS 执行环境中(例如 process 对象),会立刻暴露身份。务必删除或隐藏 Node 特有变量。webdriver: 高危。自动化工具通常为 true。需设置为 undefined 或 false。plugins / mimeTypes: 许多检测会遍历插件长度。如果为空数组 [],评分会降低。platform / userAgent: 必须与 HTTP 请求头完全一致。location.href 或 location.search 参与哈希计算。如果 location 为空或 URL 不对,生成的 cookie/token 将无效。