1. 补环境是什么

浏览器环境: 是指 JS代码在浏览器中的运行时环境,它包括V8自动构建的对象(即ECMAScript的内容,如Date、Array),浏览器(内置)传递给V8的操作DOM和BOM的对象(如document、navigator);

Node环境:是基于V8引擎的Js运行时环境,它包括V8与其自己的内置API,如fs,http,path;

Node环境浏览器环境 的异同点可以简单概括如图:

image-20230830065856051

简而言之,就是补浏览器有而Node没有的环境,即BOM和DOM的对象。

2. 为什么要补环境

由于浏览器和Node的差异,导致部分JS代码在浏览器中能正常运行,但在Node无法正常运行。如:

1
2
3
4
5
6
7
8
9
10
11
12
function decrypt() {
document = false;
var flag = document?true:false;
if (flag) {
return "正确加密"
} else {
return "错误加密";
}
}

在浏览器环境运行时 flag为true,然后得到正常结果;
Node环境运行时 flag为false,然后得到错误结果;

所以,我们需要补浏览器的环境,是扣出的js能在node的环境中正常运行。

一般补浏览器BOM和DOM里面的:window,document,history,location,navigator,screen,setTime,setInterval等。

对于反爬弱的网站,一般只需要补第一层,如:

1
2
var window = this;
var navigator = funciton(){};

对于风控严格的网站,不仅要补最外一层,还要补里面的属性对象,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Document = function (){}
Document.prototype.createElement = function(x){
if(x == "div")
{
return {onwheel:function(){}}
}
if(x == "canvas")
{
return {getContext : function(_x){
if(_x == "webg21"){
return undefined
}
return undefined
}
}

}
return {}
}

这里补了document对象里面的creatElement,以及其中的方法onwheel和getContext,相当于补了三层环境。

3. 如何补环境

3.1 基础

首先,通过分析js代码,找到加密函数所需要的代码,然后复制到本地js文件,

然后把js代码放到js调试工具运行(如vscode),运行后提示缺啥补啥。

3.2 proxy

对于简单网站,vscode够用,对于略微复杂一点的就不太行了。

proxy补环境优点:

  1. vscode缺点是一次运行一个,若缺少的东西多,一个一个补会非常麻烦,而proxy会一次打印缺少的东西,方便很多。
  2. 对于一些检测点,vscode无法识别,proxy可以发现检测点
  3. 开发js逆向补环境框架需要,每个网站的反爬手段是不一样的,在这种情况下,写一个通用的框架是最好的选择,必须要用proxy

proxy:

Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,对对象的代理对象进行操作,同时,可以添加一些需要的额外操作。

语法

1
const p = new Proxy(target,handler)
  • target: 被代理的对象
  • handller: 是一个对象用来处理target的行为
1
2
3
4
5
6
7
8
var target = {url:'pychong.com'}
const handler = {
get: function(target, prop) {
return '你做了调用操作';
}
};
const p = new Proxy(target, handler);
console.log(p.a)