进阶:补环境与反爬对抗

“补环境”是 JS 逆向工程中的核心高级技术,主要用于应对瑞数(RuiShu)、Akamai、F5 等强对抗型反爬系统。其核心逻辑是在 Node.js 等非浏览器环境中,手动模拟出浏览器特有的对象(BOM、DOM)和行为,欺骗服务器端的检测脚本。

1. 核心原理与调试手段

1.1 为什么需要补环境?

浏览器执行 JS 的上下文(window)与 Node.js 执行 JS 的上下文(global)差异巨大。反爬 JS 代码会检查这些差异(如 window.navigator 是否存在,document.cookie 是否可写)来判断当前环境是否为真实浏览器。

1.2 神器:Recursive Proxy (递归代理)

这是补环境最关键的调试工具。通过 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");

2. BOM (浏览器对象模型) 模拟重点

2.1 Window 与 Global 隔离

2.2 Navigator (身份指纹)

2.3 Location (地址栏)

2.4 Screen & Performance